概述
写 Dubbo 入门案例之前,得先把两个"外部依赖"跑起来:一个是注册中心 Nacos,一个是服务治理控制台 dubbo-admin。这篇只干一件事------把这两个组件在本地装好、启动成功、并且验证它们能互相连通。环境起不来,后面写 Provider、Consumer 全是无源之水。
纲要
- 两个组件为什么必须装
- Nacos:Dubbo 的注册中心(服务注册与订阅的数据总线)
- dubbo-admin:Dubbo 的可视化治理控制台(服务查询、详情、测试)
- 两者定位对照表 + 调用关系图
- Nacos 安装与启动
- 压缩包解压启动(Windows / Linux 命令)
- Docker 一条命令启动
- 控制台验证与关闭
- dubbo-admin 安装与启动
- 工程结构(server / ui / distribution)
- 源码构建启动、发行包直接启动
- 注册中心地址配置项
- 控制台验证
- 整套环境联通性验证清单
- 实战坑:standalone 忘记加、8848 占用、内存、端口冲突、控制台看不到服务、防火墙
- 端口与配置速览表
为什么入门案例要装这两个东西
Dubbo 的架构里,Provider(服务提供方)和 Consumer(服务消费方)之间不直接认识对方,它们都通过 Registry(注册中心)来"交换名片"。顺着这条链路走一遍:
- Provider 启动时,把自己能提供的服务注册到注册中心;
- Consumer 启动时,向注册中心订阅自己需要的服务;
- 注册中心把 Provider 地址列表返回给 Consumer,之后地址有变化还会长连接推送;
- Consumer 从地址列表里按负载均衡算法挑一台调用。
所以注册中心是整个分布式调用能"自动发现"的前提。这套课程和交友项目工程里,注册中心用的是 Nacos 而不是老牌 Zookeeper,原因后面单独说。
而 dubbo-admin 是一个旁路组件------它不参与实际调用,只是连到同一个注册中心上,把里面注册了哪些服务、有哪些实例、谁调用了谁可视化出来,还能做服务测试和动态配置。没有它,Dubbo 照样跑,但你排查问题时只能靠日志和命令行,非常难受。
| 组件 | 角色 | 作用 | 默认端口 | 是否必需 |
|---|---|---|---|---|
| Nacos | 注册中心(Registry) | Provider 注册、Consumer 订阅、配置管理 | 8848(HTTP 控制台同端口) | 必需,不装 Dubbo 跑不起来 |
| dubbo-admin | 治理控制台(Monitor/Admin) | 服务查询、实例详情、服务测试、动态配置 | 8080 | 非必需,但强烈建议装 |
两者与 Provider / Consumer 的关系,用一张图看清:
#mermaid-svg-gOEm11YuDHpHchR5{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-gOEm11YuDHpHchR5 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-gOEm11YuDHpHchR5 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-gOEm11YuDHpHchR5 .error-icon{fill:#552222;}#mermaid-svg-gOEm11YuDHpHchR5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-gOEm11YuDHpHchR5 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-gOEm11YuDHpHchR5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-gOEm11YuDHpHchR5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-gOEm11YuDHpHchR5 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-gOEm11YuDHpHchR5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-gOEm11YuDHpHchR5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-gOEm11YuDHpHchR5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-gOEm11YuDHpHchR5 .marker.cross{stroke:#333333;}#mermaid-svg-gOEm11YuDHpHchR5 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-gOEm11YuDHpHchR5 p{margin:0;}#mermaid-svg-gOEm11YuDHpHchR5 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-gOEm11YuDHpHchR5 .cluster-label text{fill:#333;}#mermaid-svg-gOEm11YuDHpHchR5 .cluster-label span{color:#333;}#mermaid-svg-gOEm11YuDHpHchR5 .cluster-label span p{background-color:transparent;}#mermaid-svg-gOEm11YuDHpHchR5 .label text,#mermaid-svg-gOEm11YuDHpHchR5 span{fill:#333;color:#333;}#mermaid-svg-gOEm11YuDHpHchR5 .node rect,#mermaid-svg-gOEm11YuDHpHchR5 .node circle,#mermaid-svg-gOEm11YuDHpHchR5 .node ellipse,#mermaid-svg-gOEm11YuDHpHchR5 .node polygon,#mermaid-svg-gOEm11YuDHpHchR5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-gOEm11YuDHpHchR5 .rough-node .label text,#mermaid-svg-gOEm11YuDHpHchR5 .node .label text,#mermaid-svg-gOEm11YuDHpHchR5 .image-shape .label,#mermaid-svg-gOEm11YuDHpHchR5 .icon-shape .label{text-anchor:middle;}#mermaid-svg-gOEm11YuDHpHchR5 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-gOEm11YuDHpHchR5 .rough-node .label,#mermaid-svg-gOEm11YuDHpHchR5 .node .label,#mermaid-svg-gOEm11YuDHpHchR5 .image-shape .label,#mermaid-svg-gOEm11YuDHpHchR5 .icon-shape .label{text-align:center;}#mermaid-svg-gOEm11YuDHpHchR5 .node.clickable{cursor:pointer;}#mermaid-svg-gOEm11YuDHpHchR5 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-gOEm11YuDHpHchR5 .arrowheadPath{fill:#333333;}#mermaid-svg-gOEm11YuDHpHchR5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-gOEm11YuDHpHchR5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-gOEm11YuDHpHchR5 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gOEm11YuDHpHchR5 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-gOEm11YuDHpHchR5 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gOEm11YuDHpHchR5 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-gOEm11YuDHpHchR5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-gOEm11YuDHpHchR5 .cluster text{fill:#333;}#mermaid-svg-gOEm11YuDHpHchR5 .cluster span{color:#333;}#mermaid-svg-gOEm11YuDHpHchR5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-gOEm11YuDHpHchR5 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-gOEm11YuDHpHchR5 rect.text{fill:none;stroke-width:0;}#mermaid-svg-gOEm11YuDHpHchR5 .icon-shape,#mermaid-svg-gOEm11YuDHpHchR5 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-gOEm11YuDHpHchR5 .icon-shape p,#mermaid-svg-gOEm11YuDHpHchR5 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-gOEm11YuDHpHchR5 .icon-shape .label rect,#mermaid-svg-gOEm11YuDHpHchR5 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-gOEm11YuDHpHchR5 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-gOEm11YuDHpHchR5 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-gOEm11YuDHpHchR5 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 1.注册服务
2.订阅服务
3.推送地址列表
4.基于地址调用
读取服务列表/元数据
可视化展示
Provider
服务提供者
Nacos 注册中心
:8848
Consumer
服务消费方
dubbo-admin
控制台 :8080
浏览器 http://localhost:8080
注意 dubbo-admin 只从 Nacos 读数据,它不介入 Provider 与 Consumer 之间的 RPC 流量。所以哪怕控制台挂了,业务调用也不受影响。
为什么用 Nacos 而不是 Zookeeper
Dubbo 2.7 以前默认搭配 Zookeeper 做注册中心,那时候 Zookeeper 是主流选择。到了 Dubbo 2.7+,官方把注册中心做成了可插拔的 SPI,Nacos、Zookeeper、Redis 都能接。这套课程选 Nacos,主要几点:
- Nacos 一个组件同时覆盖服务发现 和配置管理,不用再单独引 Zookeeper + 配置中心两套东西;
- 有自带的可视化控制台,看服务列表直观;
- 交友项目整个工程的技术栈(Spring Cloud Alibaba 系)本来就用 Nacos,提前统一口径。
换句话说,后面写 Provider 时注册中心地址会写成 nacos://127.0.0.1:8848,而不是 zookeeper://127.0.0.1:2181。这一点在配置 dubbo-admin 时特别容易踩,因为它源码里的默认值恰恰是 Zookeeper。
Nacos 的安装与启动
课程资料用的是 Nacos 1.4.1 ,解压后目录长这样(bin 放脚本,conf 放配置,target 放运行 jar):
tree
nacos-server-1.4.1/
└── nacos/
├── bin/
│ ├── startup.sh # Linux/Mac 启动
│ ├── startup.cmd # Windows 启动
│ ├── shutdown.sh # Linux/Mac 关闭
│ └── shutdown.cmd # Windows 关闭
├── conf/
│ ├── application.properties # 主配置(端口、数据源、鉴权)
│ ├── nacos-mysql.sql # 若改用 MySQL 存储需执行的建表脚本
│ ├── schema.sql
│ └── cluster.conf.example # 集群配置示例
├── target/
│ └── nacos-server.jar # 实际运行的 Spring Boot 应用
└── LICENSE / NOTICE
方式一:解压压缩包直接启动
第一步,解压到没有中文、没有特殊字符的目录。带中文的路径会让 Nacos 启动时报路径解析异常,这是硬性要求,不是建议。
第二步,进 bin 目录执行启动命令。关键是加 -m standalone:
bash
# Linux / macOS:在 nacos/bin 目录下
sh startup.sh -m standalone
# Windows:在 nacos\bin 目录下
startup.cmd -m standalone
-m 是"模式"的意思,standalone 即单机模式。不加这个参数会怎样? 脚本里 MODE 默认值是 cluster(集群),于是 Nacos 会尝试按集群模式启动,去读 cluster.conf 找其它节点,找不到就报错退出。开发阶段一律加 -m standalone。
启动脚本进入 standalone 分支后,JVM 参数会被调成小内存配置:
text
# nacos/bin/startup.sh 中 standalone 分支的关键片段
if [[ "${MODE}" == "standalone" ]]; then
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g ..."
fi
也就是说,单机模式默认堆只有 512m,集群模式默认 2g。机器内存小的时候,如果非要跑集群模式,光这一项就能把机器压垮。
第三步,看到下面这行就说明起来了:
text
nacos is starting with standalone
nacos is starting,you can check the /xxx/nacos/logs/start.out
方式二:Docker 一条命令
不想装 JDK 折腾解压的话,Docker 起 Nacos 最省事:
bash
docker run -d \
--name nacos \
-p 8848:8848 \
-e MODE=standalone \
nacos/nacos-server
-e MODE=standalone 等价于脚本里的 -m standalone,漏了它容器会按集群模式启动然后失败。生产环境还要额外挂载数据卷、配 MySQL 数据源(见 conf/nacos-mysql.sql),本地学习用默认的内嵌存储即可。
验证 Nacos 是否可用
浏览器打开:
text
http://localhost:8848/nacos
默认账号密码都是 nacos / nacos(1.4.1 默认 nacos.core.auth.enabled=false,但控制台仍会要求登录)。登录进去应该能看到左侧的「配置管理」「服务管理」「命名空间」等菜单,服务管理 → 服务列表里此时是空的或只有 Nacos 自身。页面能打开、能登录,就说明 Nacos 这个注册中心本身没问题了。
关闭 Nacos
bash
# Linux / macOS:nacos/bin 目录下
sh shutdown.sh
# Windows:nacos\bin 目录下
shutdown.cmd
dubbo-admin 的安装与启动
dubbo-admin 是 apache 旗下的独立 Web 应用,本质就是一个 Spring Boot 工程,前端用 Vue。资料里给的是已解压的完整源码 + 已经构建好的发行包,这两条路都能走通。
工程结构
tree
dubbo-admin/
└── dubbo-admin/
├── pom.xml # 父 pom,版本 revision = 0.3.0-SNAPSHOT
├── dubbo-admin-server/ # 后端 Spring Boot 服务
│ └── src/main/resources/
│ └── application.properties # 注册中心地址就在这改
├── dubbo-admin-ui/ # 前端 Vue 工程
├── dubbo-admin-test/ # 测试模块
├── dubbo-admin-distribution/ # 打包发行模块
│ ├── target/
│ │ └── dubbo-admin-0.3.0-SNAPSHOT.jar # 可执行 fat jar
│ └── src/bin/
│ ├── startup.sh / startup.cmd # 发行版启动脚本
│ ├── shutdown.sh / shutdown.cmd
│ └── config/application.properties # 发行版外置配置
└── dubbo-governance.log
版本信息实测确认:父 pom 里 <revision>0.3.0-SNAPSHOT</revision>,发行包 jar 名为 dubbo-admin-0.3.0-SNAPSHOT.jar。讲义里写的是 dubbo-admin-0.1.jar,那是更早版本的叫法,以你本地 distribution/target 下实际的 jar 名为准。
关键一步:改注册中心地址
dubbo-admin 源码里的默认配置指向的是 Zookeeper,而我们的 Nacos 在这。改错这一处,控制台能启动、但服务列表永远是空的。
源码方式改这里:
properties
# dubbo-admin-server/src/main/resources/application.properties
# 默认是 zookeeper,注释掉,改成 nacos
# admin.registry.address=zookeeper://127.0.0.1:2181
# admin.config-center=zookeeper://127.0.0.1:2181
# admin.metadata-report.address=zookeeper://127.0.0.1:2181
admin.registry.address=nacos://127.0.0.1:8848
admin.config-center=nacos://127.0.0.1:8848
admin.metadata-report.address=nacos://127.0.0.1:8848
admin.root.user.name=root
admin.root.user.password=root
这三项分别是注册中心地址、配置中心地址、元数据上报地址,指向 Nacos 时三者都写同一个地址即可。admin.root.user.* 是控制台的登录账号,默认就是 root / root。
发行包方式则改外置配置 dubbo-admin-distribution/src/bin/config/application.properties,其中端口和注册中心地址已经按 Nacos 预置好:
properties
# dubbo-admin-distribution/src/bin/config/application.properties
server.port=8080
admin.registry.address=nacos://127.0.0.1:8848
admin.config-center=nacos://127.0.0.1:8848
admin.metadata-report.address=nacos://127.0.0.1:8848
admin.root.user.name=root
admin.root.user.password=root
如果 Nacos 那边开了鉴权,地址里可以挂参数:nacos://127.0.0.1:8848?username=nacos&password=nacos。
启动方式一:源码构建 + Spring Boot 运行
在 dubbo-admin 工程根目录(有 pom.xml 的那层)执行:
bash
# 构建(跳过测试,构建耗时较长)
mvn clean package -D maven.test.skip=true
# 启动(只启动 server 模块)
mvn --projects dubbo-admin-server spring-boot:run
mvn clean package 会把前端 dubbo-admin-ui 一起编译并塞进 server 的静态资源里,所以第一次构建要耐心等。注意 -D maven.test.skip=true 中间有个空格写法坑(-Dmaven.test.skip=true 更常见),两种写法 Maven 都能识别。
启动方式二:发行包直接跑
构建产物已经是一个 fat jar,最省事的方式就是直接 java -jar:
bash
# 进入发行包 target 目录
cd dubbo-admin-distribution/target
# 直接运行(jar 名以实际为准)
java -jar dubbo-admin-0.3.0-SNAPSHOT.jar
发行模块还带了一组脚本,模拟的是生产部署形态(lib/dubbo-admin.jar + 外置 config/),里面已经写好了 Xms/Xmx 参数:
bash
# dubbo-admin-distribution/src/bin/startup.sh 的核心逻辑
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT="${JAVA_OPT} -jar ${BASE_DIR}/lib/${SERVER}.jar"
nohup $JAVA ${JAVA_OPT} dubbo.admin >> ${BASE_DIR}/logs/catlog.out 2>&1 &
验证 dubbo-admin 是否可用
浏览器打开:
text
http://localhost:8080
登录页用 root / root 进入。登录后应该能看到「服务查询」「服务治理」「配置管理」等侧边菜单,主页会有 Dubbo 版本、健康状态之类的概览信息。只要控制台能登录、菜单能正常切换,就说明 dubbo-admin 装好了。
至于服务列表为空------这是正常的,原因见下面的坑。
整套环境的联通性验证
装完两个组件别急着写代码,按顺序确认一遍,能省掉后面大部分"明明配了却不生效"的排查:
#mermaid-svg-fVzI6s13MdhPIreL{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-fVzI6s13MdhPIreL .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-fVzI6s13MdhPIreL .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-fVzI6s13MdhPIreL .error-icon{fill:#552222;}#mermaid-svg-fVzI6s13MdhPIreL .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-fVzI6s13MdhPIreL .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-fVzI6s13MdhPIreL .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-fVzI6s13MdhPIreL .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-fVzI6s13MdhPIreL .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-fVzI6s13MdhPIreL .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-fVzI6s13MdhPIreL .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-fVzI6s13MdhPIreL .marker{fill:#333333;stroke:#333333;}#mermaid-svg-fVzI6s13MdhPIreL .marker.cross{stroke:#333333;}#mermaid-svg-fVzI6s13MdhPIreL svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-fVzI6s13MdhPIreL p{margin:0;}#mermaid-svg-fVzI6s13MdhPIreL .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-fVzI6s13MdhPIreL .cluster-label text{fill:#333;}#mermaid-svg-fVzI6s13MdhPIreL .cluster-label span{color:#333;}#mermaid-svg-fVzI6s13MdhPIreL .cluster-label span p{background-color:transparent;}#mermaid-svg-fVzI6s13MdhPIreL .label text,#mermaid-svg-fVzI6s13MdhPIreL span{fill:#333;color:#333;}#mermaid-svg-fVzI6s13MdhPIreL .node rect,#mermaid-svg-fVzI6s13MdhPIreL .node circle,#mermaid-svg-fVzI6s13MdhPIreL .node ellipse,#mermaid-svg-fVzI6s13MdhPIreL .node polygon,#mermaid-svg-fVzI6s13MdhPIreL .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-fVzI6s13MdhPIreL .rough-node .label text,#mermaid-svg-fVzI6s13MdhPIreL .node .label text,#mermaid-svg-fVzI6s13MdhPIreL .image-shape .label,#mermaid-svg-fVzI6s13MdhPIreL .icon-shape .label{text-anchor:middle;}#mermaid-svg-fVzI6s13MdhPIreL .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-fVzI6s13MdhPIreL .rough-node .label,#mermaid-svg-fVzI6s13MdhPIreL .node .label,#mermaid-svg-fVzI6s13MdhPIreL .image-shape .label,#mermaid-svg-fVzI6s13MdhPIreL .icon-shape .label{text-align:center;}#mermaid-svg-fVzI6s13MdhPIreL .node.clickable{cursor:pointer;}#mermaid-svg-fVzI6s13MdhPIreL .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-fVzI6s13MdhPIreL .arrowheadPath{fill:#333333;}#mermaid-svg-fVzI6s13MdhPIreL .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-fVzI6s13MdhPIreL .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-fVzI6s13MdhPIreL .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fVzI6s13MdhPIreL .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-fVzI6s13MdhPIreL .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fVzI6s13MdhPIreL .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-fVzI6s13MdhPIreL .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-fVzI6s13MdhPIreL .cluster text{fill:#333;}#mermaid-svg-fVzI6s13MdhPIreL .cluster span{color:#333;}#mermaid-svg-fVzI6s13MdhPIreL div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-fVzI6s13MdhPIreL .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-fVzI6s13MdhPIreL rect.text{fill:none;stroke-width:0;}#mermaid-svg-fVzI6s13MdhPIreL .icon-shape,#mermaid-svg-fVzI6s13MdhPIreL .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-fVzI6s13MdhPIreL .icon-shape p,#mermaid-svg-fVzI6s13MdhPIreL .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-fVzI6s13MdhPIreL .icon-shape .label rect,#mermaid-svg-fVzI6s13MdhPIreL .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-fVzI6s13MdhPIreL .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-fVzI6s13MdhPIreL .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-fVzI6s13MdhPIreL :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 否
是
否
是
- 启动 Nacos
sh startup.sh -m standalone
2. 浏览器打开
localhost:8848/nacos
能登录?
检查 JAVA_HOME / 端口 8848 / 看 logs/start.out
3. 改 dubbo-admin 注册中心为 nacos://127.0.0.1:8848
4. 启动 dubbo-admin
java -jar / mvn spring-boot:run
5. 打开 localhost:8080
root/root 能登录?
查 8080 是否被占用 / 看 catlog.out 报错
6. 环境就绪
服务列表为空属正常
| 检查点 | 操作 | 预期结果 | 不通过怎么查 |
|---|---|---|---|
| Nacos 进程 | 执行启动命令 | 输出 nacos is starting with standalone |
nacos/logs/start.out 看异常 |
| Nacos 控制台 | 浏览器访问 8848/nacos | 能登录,看到服务管理菜单 | 端口占用、JAVA_HOME 未配 |
| dubbo-admin 配置 | 改 application.properties | 三项地址均为 nacos://127.0.0.1:8848 |
漏改会连 Zookeeper 失败 |
| dubbo-admin 进程 | 启动 jar / spring-boot:run | 日志出现 Started DubboAdminApplication |
logs/catlog.out 看报错 |
| dubbo-admin 控制台 | 浏览器访问 8080,root/root | 能登录,菜单正常 | 端口冲突、注册中心连不上 |
| 两者连通 | 控制台看服务列表 | 为空(当前正常) | 待 Provider 启动后再看 |
实战坑
启动 Nacos 忘了加 -m standalone。 最常见的第一个坑。不加参数时脚本 MODE 默认 cluster,Nacos 会去解析 cluster.conf 找集群节点,找不到直接退出。报错信息往往很隐晦,别在这上面浪费时间,记住单机就写 -m standalone。
8848 端口被占用。 阿里把这个端口定成 8848 是有梗的(珠峰高度)。如果本机别的程序占了,Nacos 启动失败。要么关掉占用进程,要么改 conf/application.properties 里的 server.port=8848 换成别的端口------注意改完 dubbo-admin 里的 nacos://127.0.0.1:8848 也要跟着改,否则连不上。
内存不足。 单机模式 Nacos 默认 -Xms512m -Xmx512m,一般够用;但如果机器本身内存紧张,或者你改错了模式跑成了集群(默认 -Xms2g -Xmx2g),很容易 OOM。要调就改 bin/startup.sh(Windows 改 startup.cmd)里那几行 JAVA_OPT 的 Xms/Xmx/Xmn 数值,别去改 jar。同理 dubbo-admin 的 bin/startup.sh 里也有 -Xms512m -Xmx512m -Xmn256m。
dubbo-admin 端口冲突。 默认 8080,这个端口太大众,极容易被别的 Spring Boot 应用、Tomcat 占用。改 application.properties 里的 server.port 即可,比如改成 8081。
控制台看不到任何服务。 这是本篇最容易让人误判环境的点。现在服务列表为空是完全正常的,因为还没有任何 Provider 启动、没往 Nacos 里注册任何东西。dubbo-admin 只是把注册中心里已有的东西显示出来,注册中心本身是空的,它自然显示空。等下一篇写完 Dubbo 服务提供者、启动起来之后,服务列表里才会出现内容。看到空列表先别怀疑环境坏了。
dubbo-admin 与 Dubbo 版本兼容性。 控制台和 Dubbo 版本不匹配时,典型症状有两种:服务列表始终为空,或者点进详情接口直接报错。0.3.0-SNAPSHOT 这版对应 Dubbo 2.7 系,和课程用的 Dubbo 版本是配套的。如果自己从 GitHub 拉了别的版本,先确认兼容性,实在拿不准就以官方仓库 README 的版本说明为准。
连不上注册中心(防火墙 / 容器网络)。 如果 Nacos 跑在 Docker 或另一台机器上,dubbo-admin 里的 127.0.0.1 就要换成 Nacos 真实的 IP 或容器网络内的服务名;本机防火墙也要放行 8848。localhost 和 127.0.0.1 在本机等价,但跨机器时写成 localhost 必然连不上。
端口与配置速览
| 组件 | 关键属性 | 值 | 配置文件位置 |
|---|---|---|---|
| Nacos | server.port |
8848 |
nacos/conf/application.properties |
| Nacos | server.servlet.contextPath |
/nacos |
同上(所以访问要带 /nacos) |
| Nacos | 启动模式 | standalone(-m standalone) |
启动命令参数 |
| Nacos | 控制台账号 | nacos / nacos |
默认,未开鉴权 |
| Nacos | standalone JVM | -Xms512m -Xmx512m -Xmn256m |
nacos/bin/startup.sh |
| dubbo-admin | server.port |
8080 |
dubbo-admin-server/.../application.properties 或发行版 bin/config/application.properties |
| dubbo-admin | admin.registry.address |
nacos://127.0.0.1:8848 |
同上 |
| dubbo-admin | 控制台账号 | root / root |
admin.root.user.name/password |
| dubbo-admin | 版本 | 0.3.0-SNAPSHOT |
父 pom <revision> |
官方文档
总结
- 入门案例要跑起来,先装两样:Nacos 当注册中心(必需),dubbo-admin 当治理控制台(可选但强烈建议)。
- Nacos 启动的核心就一句
startup.sh -m standalone,-m standalone千万不能漏;浏览器访问http://localhost:8848/nacos,账号nacos/nacos。 - dubbo-admin 装好后的头等大事是把注册中心地址从默认的 Zookeeper 改成
nacos://127.0.0.1:8848,改错这一处控制台就永远是空的。发行包直接java -jar dubbo-admin-0.3.0-SNAPSHOT.jar,端口 8080,账号root/root。 - 现在控制台里看不到服务是正常的------还没有 Provider 注册进来,等下一篇写完服务提供者,服务列表才会有内容。