Java 项目实战: 交友项目 - 安装 Nacos 注册中心与 Dubbo 监控中心

概述

写 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(注册中心)来"交换名片"。顺着这条链路走一遍:

  1. Provider 启动时,把自己能提供的服务注册到注册中心;
  2. Consumer 启动时,向注册中心订阅自己需要的服务;
  3. 注册中心把 Provider 地址列表返回给 Consumer,之后地址有变化还会长连接推送;
  4. 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;} 否
是
否
是

  1. 启动 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 注册进来,等下一篇写完服务提供者,服务列表才会有内容。
相关推荐
李福春1 小时前
斗破Google ADK Java苍穹-第2境斗者-凝旋筑基-Java环境
java·开发语言·gemini·llmagent·深圳同盟·腾讯云架构师技术同盟·adk java
霸道流氓气质1 小时前
LLM API密钥管理与轮换策略:Spring Vault动态密钥、熔断限流协同与多Provider路由的 Java 生产级实现
java·后端·spring
兔头?2 小时前
使用JDK21新特性虚拟线程时遇到的坑
java
m0_587383002 小时前
无人自助拼豆系统从需求分析到落地部署全流程实战开发指南
java·经验分享·后端·struts·小程序·架构·需求分析
a努力。2 小时前
四维解析Agent记忆架构:从零实战LangGraph长期记忆
java·开发语言·数据库
碧海银沙音频科技研究院2 小时前
炬芯ATS308X的扩音器:麦克风到扬声器直通功能实现
java·linux·运维
Rain的Java大神之路2 小时前
被问麻了!Function Calling、MCP、Skill 到底啥关系?一张图讲透三层架构,附 Java 生产落地全流程+30个坑
java·后端·ai编程
Wang's Blog2 小时前
Java 项目部署之 Docker工具快速入门: Docker Compose 初识与安装
java·开发语言·docker