ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

基于Nacos搭建Dubbo Admin控制台:服务治理从入门到实战

基于Nacos搭建Dubbo Admin控制台:服务治理从入门到实战 一个 Dubbo 项目跑起来之后注册中心里密密麻麻的 IP、接口、分组信息服务到底有没有正常提供、谁在调用、调一下为什么超时——光靠翻日志和看注册中心原始数据效率太低。这时候你就需要一个 Dubbo 服务控制台也就是常说的 dubbo-admin。它能让你在一个网页里把服务列表、消费者关系、路由规则、动态配置、Mock 开关全部管理起来是日常排查线上问题和做服务治理最直接的入口。这篇内容我按自己的实际搭建经验来写基于 Nacos 作为注册中心带你从零搭一套 Dubbo 控制台并且把服务查询、动态配置、超时调整这些核心功能串起来跑一遍。无论你是刚开始接触 Dubbo 的初级开发还是已经在维护 Dubbo 集群、需要一套可视化治理工具的同学都可以直接照着做。1. 搭建前的方案规划搞明白控制台到底要解决什么问题先别急着敲命令我建议你先花十分钟想清楚一件事控制台在你的技术体系里到底扮演什么角色。1.1 服务控制台不是“管理页面”那么简单很多人第一次接触 dubbo-admin以为它就是一个“服务列表查看器”顶多看看服务在不在线。实际用下来它的价值要重得多。控制台本身并不保存业务数据它是一个无状态的可视化治理层真正干活的是注册中心和配置中心。控制台从注册中心拉取服务元数据把 Dubbo 集群里的 Provider、Consumer、路由规则、动态配置全部变成可视化的界面操作。换句话说控制台解决的是“我看不见我的分布式服务”的问题。没有控制台你想知道某个接口被哪些服务消费就得一台台机器抓注册信息甚至动用抓包工具去监听注册中心交互报文。有了控制台服务上下线、调用关系、权重调整、超时时间修改全部鼠标点点就能完成。1.2 版本选型dubbo-admin 与老古董控制台的差距搭建之前最重要的一件事选对版本。Dubbo 生态里出现过不止一个控制台项目老一代的 dubbo-monitor-simple 和早期 dubbo-adminJava Swing 桌面版已经不适合现在的场景了。前者是远古时代的监控统计工具后者桌面客户端用起来极其别扭部署还要单独的 Web 容器这两个都不建议再碰。现在主流的是 Apache 官方维护的 apache/dubbo-admin前后端分离架构后端用 Spring Boot前端是 Vue Element UI。它支持 ZooKeeper、Nacos、Consul 等主流注册中心也支持配置中心和元数据中心和 Dubbo 2.7.x、3.x 都能配合使用。这里有一个很重要的经验不要盲目拉最新代码尽量选择 release 版本或者和你的 Dubbo 版本发布时间相近的 tag。我见过有人直接用 master 分支代码结果前端构建报错后端接口路径对不上排查半天发现是开发分支的接口做了调整和文档对不上。稳定优先用 release 包。1.3 注册中心选型为什么优先建议 Nacosdubbo-admin 不是非要依赖某一个注册中心它支持 ZooKeeper、Nacos、Consul。但我个人在实际项目里强烈建议你用 Nacos原因有三个第一Nacos 自带一套管理界面注册中心本身的健康状态、服务列表、配置内容都能直接看到排查问题多一个维度第二Nacos 同时承担了注册中心和配置中心两个角色Dubbo 的配置中心和元数据中心都可以指向 Nacos一套服务搞定不需要额外部署 ZooKeeper 和 Redis第三Nacos 在 Dubbo 3.x 里是官方主推的注册中心方案社区文档和案例最多踩坑也最容易找到答案。如果你公司现有的基础设施是 ZooKeeper也没问题dubbo-admin 的配置里把注册中心地址改成 zookeeper://ip:2181 即可后面步骤里的 Nacos 相关内容对应替换就行。2. 控制台核心功能拆解这些模块到底能干什么在进入搭建步骤前先带你过一遍 dubbo-admin 界面里的核心模块知道每个模块是干嘛的后面操作起来才不会迷路。2.1 服务查询与治理这是控制台的首页级功能相当于整个 Dubbo 集群的“服务通讯录”。你会看到所有接入注册中心的服务名点进去能看到 Provider 的 IP、端口、接口版本、应用名称、注册时间以及 Consumer 列表。生产环境最常见的使用场景就是确认某个服务的某个节点是否成功注册、消费者是否已经拿到最新的提供者地址。这个模块还支持对服务做启停操作和权重调整。比如某台机器要发布重启你可以先把它设置为禁用状态让流量打到其他节点等重启完成再启用减少抖动。这个操作在控制台上就是点击一下的事但要注意它实际是通过修改注册中心里的动态配置实现的并不是真的停掉进程。2.2 动态配置接口Dubbo 的超时时间、重试次数、负载均衡策略这些参数既可以在服务发布端的 XML 或注解里写死也可以通过配置中心动态下发。控制台里的“动态配置”模块就是干这个的。这个模块对应的原理经常出现在各种 Dubbo 高级面试题里比如“Dubbo 的配置覆盖优先级是怎样的”“动态配置和本地配置谁先生效”。在控制台操作一下你就能直观感受到改完配置后配置中心会推送给服务端服务端动态生效不需要重启。相比改代码发版效率高出一个数量级。2.3 路由与标签路由规则是 Dubbo 治理的高级玩法控制台里支持条件路由和标签路由。条件路由可以按照参数、方法名、IP 段等维度把流量打到指定服务分组。举个例子你可以配置一条规则当调用参数里有 userId9527 时只路由到灰度环境的那台机器。这就是典型的灰度发布方案。标签路由则是给 Provider 打标签然后 Consumer 通过标签决定调哪个分组。它和条件路由的区别在于标签路由是以“地址”为维度进行标记适合按机器划分环境的场景。控制台把这两类规则的配置页面做成了可视化表单选条件、填值、保存规则就下发了非常直观。2.4 Mock 与文档模块Mock 模块可以给服务配置返回假数据这在联调阶段特别有用。比如下游服务还没开发完你可以先在控制台上给接口配一个 mock 结果让上游服务先行联调。这比在代码里写死一个 Mock 实现要灵活得多因为改 mock 数据不用重新发版。文档模块通常会配合 Swagger 注解使用dubbo-admin 可以展示接口的出入参结构。不过这个模块实际使用率不算高团队如果没有强制的接口文档规范很容易变摆设。但既然控制台免费带了知道有这么个入口就行。3. 完整搭建实操从零跑起控制台现在进入正题完整搭建一套 Dubbo 服务控制台。我以 Nacos 作为注册中心操作系统以 CentOS 7 为例Windows 和 macOS 的命令大同小异。3.1 环境准备清单先把依赖环境准备好建议版本如下组件版本要求说明JDK1.8 及以上后端编译运行需要推荐 1.8 或 11Maven3.6 及以上后端项目构建需要Node.js14.x 及以上前端项目构建需要Nacos2.x注册中心与配置中心Git任意较新版本拉取 dubbo-admin 源码这里有一个容易忽略的点dubbo-admin 的前端项目对 Node 版本有要求如果你的 Node 版本过高或过低npm install 阶段可能报错。我自己在 Node 16 环境下没有遇到问题但如果你用的是 Node 18建议遇到依赖安装报错时第一时间检查 Node 版本兼容性。3.2 注册中心Nacos 单机启动先部署 Nacos。到 Nacos 官方 GitHub Releases 页面下载稳定版压缩包解压后进入 bin 目录单机模式启动# Linux / macOS sh startup.sh -m standalone # Windows startup.cmd -m standaloneNacos 2.x 默认使用 8848 端口启动成功后浏览器访问 http://localhost:8848/nacos使用默认账号密码 nacos/nacos 登录就能看到 Nacos 控制台。这里提醒一句Nacos 2.x 新增了 gRPC 通信端口客户端连接时除了 8848还会用到偏移量 1000 的 9848 端口。如果你的服务器有防火墙或云安全组必须把 8848 和 9848 都放通否则后面 Dubbo 服务注册没问题但控制台会连接异常。这是一个非常隐蔽的坑。3.3 编译并启动 dubbo-admin 后端把 dubbo-admin 源码拉下来git clone https://github.com/apache/dubbo-admin.git cd dubbo-admin后端代码在 dubbo-admin-server 模块核心配置文件是 dubbo-admin-server/src/main/resources/application.properties。你只需要改几个关键项# 注册中心地址 admin.registry.addressnacos://127.0.0.1:8848 # 配置中心地址 admin.config-centernacos://127.0.0.1:8848 # 元数据中心地址 admin.metadata-report.addressnacos://127.0.0.1:8848 # 后端服务端口默认 8080 server.port8080如果你的 Nacos 设置了命名空间或账号密码还需要追加 namespace 和 username、password 参数。不过单机测试默认不需要。配置改好后先编译后端模块mvn clean package -DskipTests编译过程第一次会比较慢因为要下载大量依赖建议确保网络稳定或者配置 Maven 国内镜像加速。编译完成后在 dubbo-admin-server 的 target 目录下会生成一个可执行的 jar 包启动它java -jar dubbo-admin-server/target/dubbo-admin-server-0.x.x.jar看到 Spring Boot 启动成功的日志且没有连接 Nacos 异常说明后端已经起来了。可以用 curl 验证一下接口是否正常curl http://localhost:8080/3.4 启动前端并完成访问后端起来后接着启动前端。前端代码在 dubbo-admin-ui 目录进入目录安装依赖并启动开发模式cd dubbo-admin-ui npm install npm run dev前端开发服务器默认跑在 8081 端口启动完成后浏览器访问 http://localhost:8081就能看到 dubbo-admin 的登录页面。新版默认没有启用用户认证直接进入即可如果你下载的是带认证模块的版本默认账号密码是 root/root具体以版本说明为准。开发模式下前端通过代理访问后端的 8080 端口所以 8080 和 8081 两个端口都要确保没被占用。3.5 一体化打包部署一次编译一条命令启动开发模式适合本地调试但如果你要在服务器上长期运行我更推荐用一体化打包模式。在 dubbo-admin 根目录执行mvn clean package -DskipTests这次构建会把前端资源也一起打包到后端 jar 里生成一个可以直接运行的独立服务。启动后直接访问 http://ip:8080不需要再单独跑前端也省去了 CORS 跨域配置的麻烦。生产环境我都是这么部署的干净利落。3.6 Docker 方式可选如果你所在团队已经普及了 Docker也可以直接用官方镜像。dubbo-admin 官方仓库提供了 Dockerfile你可以自行构建镜像。这里不过多展开因为生产环境大多会有自己的一套镜像仓库规范按团队标准来即可。4. 使用控制台完成一次真实服务治理控制台搭好之后如果你现在没有任何 Dubbo 服务接入界面就是一片空白。下面我带你从零写一个最简单的 Provider 和 Consumer注册到 Nacos然后在控制台上进行服务查询、查看消费者、修改超时时间完成一次完整的服务治理体验。4.1 准备一个 Provider 与 Consumer 样例为了快速验证我直接用 Spring Boot dubbo-spring-boot-starter 的方式。在 pom.xml 里引入依赖dependency groupIdorg.apache.dubbo/groupId artifactIddubbo-spring-boot-starter/artifactId version2.7.15/version /dependency dependency groupIdcom.alibaba.nacos/groupId artifactIdnacos-client/artifactId version2.1.1/version /dependencyProvider 的配置只需要指定应用名、注册中心地址以及扫描 Dubbo 服务的包路径spring.application.namedubbo-provider-demo dubbo.application.namedubbo-provider-demo dubbo.registry.addressnacos://127.0.0.1:8848 dubbo.scan.base-packagescom.example.demo.provider server.port8082定义接口和实现类public interface HelloService { String sayHello(String name); } Service public class HelloServiceImpl implements HelloService { Override public String sayHello(String name) { return Hello, name; } }Consumer 的配置类似通过 DubboReference 注入远程接口写一个简单的 Controller 触发调用RestController public class HelloController { DubboReference private HelloService helloService; GetMapping(/hello) public String hello() { return helloService.sayHello(dubbo-admin); } }启动 Provider 和 Consumer 后可以在 Nacos 控制台的服务列表里看到这两个服务名也能在 dubbo-admin 里看到了。4.2 在控制台上查看服务与消费者打开 dubbo-admin 页面左侧菜单找到“服务治理”分类下的“服务列表”此时你就能看到 helloService 这个服务名。点击进入详情页页面会展示 Provider 列表包含 IP、端口、版本号、注册时间。往下拉能看到 Consumer 列表显示消费这个服务的应用名和地址。这一步在线上排查问题时的意义非常大。当你的服务调用报“No provider available”时第一时间打开控制台看 Provider 列表是否为空就能快速判断是服务没注册成功还是注册了但被禁用了。4.3 修改超时时间顺便回答 dubbo 默认超时时间先回答很多人面试时会遇到的那个基础问题Dubbo 的默认超时时间是 1000ms也就是 1 秒。这个默认值在 Consumer 调用 Provider 时生效如果超过 1 秒没收到响应就会报超时异常。在控制台的“服务详情”页面可以针对某个服务配置动态超时时间。找到“动态配置”入口新建一条配置规则在参数列表里添加 timeout值设为 3000表示 3 秒。保存后Dubbo 会通过配置中心把这条规则推送到服务端服务端动态生效。这时你再去 Consumer 的调用处验证即使 Provider 端方法里 Thread.sleep(2000)调用也不会报超时异常因为超时时间已经被动态调整过。整个过程不需要重新发布任何服务这就是控制台做服务治理最直观的体验。5. 常见问题排查与避坑记录搭建 dubbo-admin 不难但很多人会在几个倒霉点上卡很久。我把这些年遇到的高频问题整理成一张排查表你照着排查基本能解决问题。5.1 常见问题速查表问题现象可能原因排查与解决办法后端启动报连接 Nacos 超时Nacos 的 8848 或 9848 端口未放通检查防火墙和云安全组确保两个端口都开放前端页面能打开但接口 502前端端口和后端端口配置不一致确认前端代理指向的 8080 端口后端已启动服务列表为空注册中心地址配置错误检查 application.properties 里的 admin.registry.address确认和 Dubbo 服务注册地址一致修改动态配置不生效配置中心地址没配对确认 admin.config-center 指向的 Nacos 和 Dubbo 服务使用的配置中心是同一个npm install 报依赖错误Node 版本和前端依赖不兼容切换 Node 14 或 16 版本重试清空 node_modules 后重新安装编译时下载依赖超时Maven 仓库网络不稳定配置 Maven 镜像或更换更稳定的仓库源页面显示服务在线但调不通服务 IP 注册错误检查 Dubbo 服务是否注册了内网或公网地址必要时配置 dubbo.protocol.host5.2 生产环境安全加固如果你要在生产环境部署 dubbo-admin我给你三个建议。第一控制台不要暴露到公网。dubbo-admin 本身默认不带强认证一旦暴露公网任何人都能查看你的服务列表、修改动态配置这等同于把服务治理的钥匙交出去了。建议放置在内网环境或者通过公司统一的 OAuth 网关做一层认证。第二锁定版本。生产环境不要使用 master 分支或 SNAPSHOT 版本固定住 release 版本避免后续升级引入不可控变更。第三配置中心账号尽量独立。如果 Nacos 开启了鉴权dubbo-admin 配置文件里的账号密码不要使用 root 超管权限给一个只有服务治理权限的只读账号即可降低误操作风险。5.3 控制台数据不刷新的排查思路有时候服务明明上下线了但控制台界面迟迟不刷新。这种情况分两种一种是控制台页面缓存强制刷新浏览器即可另一种是注册中心的变更推送延迟。Nacos 的服务变更推送是实时的但如果 dubbo-admin 和 Nacos 之间有网络隔离或代理推送可能被阻断。排查时可以打开浏览器的开发者工具看控制台轮询或长连接请求状态如果请求报错就是网络层面的问题。5.4 版本兼容问题Dubbo 3.x 的元数据上报机制做了一次升级。老的 dubbo-admin 版本对 Dubbo 3.x 的服务详情展示支持不完整比如看不到方法级的元数据。如果你使用的是 Dubbo 3.x一定要选择较新版本的 dubbo-admin同时确保元数据中心地址配置正确否则控制台里很多功能就是残缺的。最后分享一点实践体会我个人在实际操作中最大的体会是控制台这个工具搭起来只是开始真正有价值的是在使用过程中建立起对 Dubbo 调用链路的感知能力。一开始我只是用它来看服务在不在线后来慢慢开始用它来做动态配置、调权重、配路由规则对 Dubbo 的原理理解也深了不少。包括面试时候被问到动态配置的推送机制、超时时间的优先级如果不是亲手在控制台上操作过光靠背概念很难讲出那种细节感。所以如果你现在手头正好有 Dubbo 项目别犹豫花一个小时把控制台搭起来好好玩一遍这比只看文档有用得多。
返回列表