概述Nacos 一个组件同时干两件事服务注册发现和分布式配置管理等于把 Eureka 和 Spring Cloud Config 合进了一个进程。这篇先把它是什么说清楚再给两条能直接跑起来的安装路径Docker 与压缩包最后列一遍装不上时最常撞的坑。纲要定位Nacos 属于 Spring Cloud Alibaba 生态不是 Spring Cloud 官方组件双重身份既是注册中心对标 Eureka也是配置中心对标 Spring Cloud ConfigEureka 是否停维官方停的是从没发布的 2.x1.x项目用的1.10仍在迭代两套注册中心都要会依赖接入父工程dependencyManagement引入spring-cloud-alibaba-dependencies安装方式Dockerdocker run ... -e MODEstandalone nacos/nacos-server压缩包解压 →startup.sh -m standalone/startup.cmd -m standalone→shutdown.sh端口默认8848Nacos 2.x 另加9848 / 9849两个 gRPC 端口容器映射漏了就连不上验证http://localhost:8848/nacos默认账号密码都是nacos存储默认内嵌 Derby生产换 MySQLspring.datasource.platformmysql实战坑漏MODEstandalone、8848 被占、控制台 404、密码被改、容器起了但页面打不开为什么 Eureka 都学完了还要再看一个注册中心课程里 Eureka 是第一天的主角很多人第一反应是「重复建设」。其实两个原因一个是能力一个是生态。先说生态。Nacos 是阿里巴巴的产品团队早期在 Spring Cloud 官网的Spring Cloud Alibaba页面上就能找到它和 Sentinel、Seata 并列。国内项目选它很大程度上是因为它在阿里内部经过大规模验证文档和社区都是中文的出问题好查。再说能力。Eureka 只做服务注册发现这一件事做得很稳但也就到此为止。Nacos 在注册发现之外还带了一块distributed configuration分布式配置这就意味着项目里原本要单独搭一套配置中心的需求可以直接被它接管。顺带辟个谣网上说「用 Nacos 是因为 Eureka 停止维护了」这个说法不成立。Eureka 官方宣布停止维护的是 2.x 版本——那个版本从来没正式发布过属于没出生就夭折。而 Spring Cloud 一直用的 1.x 分支一直在改目前最新是1.10本项目用的也正是这个版本。所以两边都不算过时学两套是正常要求。Nacos 的双重身份按照官方自己的说法Nacos 是「一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台」。拆开看就是两块职能。职能解决的问题对标组件典型使用场景服务注册与发现服务实例的地址动态变化调用方怎么知道该调哪台Eureka服务上下线、多实例负载均衡、健康检测分布式配置管理配置散落在各服务的配置文件中改一次要重新打包发布Spring Cloud Config灰度开关、公共配置抽取、运行期热更新服务管理附带实例的分级存储、权重、命名空间隔离无直接对标同机房优先、按环境隔离一个组件能顶两个是因为它把服务列表和配置数据放进了同一套存储与推送通道里。注册发现用的是「实例元数据 变更推送」配置管理用的是「配置内容 变更推送」底层的长连接和持久化可以复用这也是它比「Eureka Config」两套系统叠起来更省运维的原因。Nacos Server :8848注册 / 心跳推送实例变更启动时拉取实例列表配置变更推送配置变更推送服务注册表实例 IP / 端口 / 权重配置仓库DataId Groupuser-service提供者order-service消费者控制台 http://localhost:8848/nacosNacos 和 Eureka 的差异两者整体结构是像的都要注册、都能拉取服务列表、都用心跳做健康检测。差别在实例模型和一致性策略上。对比项EurekaNacos所属生态Spring Cloud NetflixSpring Cloud Alibaba实例类型只有一种心跳停止即剔除临时实例 非临时实例永久实例健康检测客户端上报心跳服务端被动判断临时实例走心跳非临时实例由服务端主动探测实例剔除心跳异常即剔除临时实例剔除非临时实例不剔除列表更新客户端定时拉取有延迟支持服务端主动推送更新更快一致性AP默认 AP存在非临时实例时走 CP配置管理无需要另搭 Config内置控制台简单列表页配置管理 / 服务管理 / 命名空间等完整菜单把实例配成永久实例的写法一行就够spring:cloud:nacos:discovery:ephemeral:false# false 非临时实例服务宕机也不会从列表剔除依赖坐标它属于 Spring Cloud Alibaba这一点容易踩坑。Nacos 的 starter 不在org.springframework.cloud下面而在com.alibaba.cloud下面。父工程要用dependencyManagement把它引进来做版本仲裁子模块才能省掉版本号。dependencyManagementdependencies!-- Spring Cloud 官方依赖管 Eureka、Gateway 这些 --dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependency!-- Spring Cloud Alibaba管 Nacos 这些 --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion2.2.5.RELEASE/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagement子模块只需要引客户端 starter版本由父工程决定!-- nacos 服务发现客户端 --dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency配套的版本关系是本项目验证过的Spring Boot2.3.9.RELEASE Spring CloudHoxton.SR10 Spring Cloud Alibaba2.2.5.RELEASE。这三个版本不匹配的话启动时容易出现NoClassDefFoundError。安装包目录结构从官网或课前资料拿到nacos-server-1.4.1.zipWindows或nacos-server-1.4.1.tar.gzLinux/Mac解压到非中文路径下。解压后的骨架非常干净nacos ├── bin │ ├── startup.sh # Linux/Mac 启动脚本 │ ├── startup.cmd # Windows 启动脚本 │ ├── shutdown.sh # Linux/Mac 关闭脚本 │ └── shutdown.cmd # Windows 关闭脚本 ├── conf │ ├── application.properties # 主配置端口与数据源在这里改 │ ├── cluster.conf.example # 集群节点列表样例单机用不到 │ ├── nacos-mysql.sql # 切 MySQL 时用的建表脚本 │ └── nacos-logback.xml # 日志配置 ├── target │ └── nacos-server.jar # 真正的可执行包Nacos 自己也是 Java 写的 ├── LICENSE └── NOTICEbin是可执行脚本conf是配置target下面那个 jar 就是整个服务端。它自己就是 Spring Boot 应用所以本机必须有 JDK。安装方式一Docker推荐镜像里已经打包好 JDK 和 Nacos不用管环境变量命令一条搞定。dockerrun-d\--namenacos\-p8848:8848\-eMODEstandalone\nacos/nacos-server参数逐个说明参数作用不写会怎样-d后台运行前台占住终端日志刷屏--name nacos容器命名方便后续logs/stop只能靠容器 ID 操作-p 8848:8848宿主机端口映射到容器浏览器才能访问容器里跑着外面够不着-e MODEstandalone单机模式默认按集群模式启动找不到cluster.conf里配置的节点启动失败或反复报错nacos/nacos-server镜像名省略 tag 拉 latest2.x—MODEstandalone是这里唯一必须记住的环境变量。开发阶段永远是单机集群搭建是另一篇文章的事。如果本机拉的是 2.x 镜像端口映射要一起把 gRPC 端口带上dockerrun-d\--namenacos\-p8848:8848\-p9848:9848\-p9849:9849\-eMODEstandalone\nacos/nacos-server1.4.1 这个版本只需要 88489848/9849是 2.x 才引入的关于这两个端口见下面的端口表。安装方式二压缩包Windows解压之后进bin目录双击startup.cmd会用默认参数启动要显式单机启动就开个命令行startup.cmd -m standalone-m是 mode 的缩写standalone表示单机模式和 Docker 里的MODEstandalone是同一回事。Linux / Mac先确认 JDK 装好了然后上传压缩包并解压# 解压tar-xvfnacos-server-1.4.1.tar.gz# 删除安装包可选rm-rfnacos-server-1.4.1.tar.gz# 进 bin 目录单机方式启动cdnacos/binshstartup.sh-mstandalone# 关闭shshutdown.sh不写-m standalone直接sh startup.sh脚本会按集群模式去启动然后因为找不到集群配置而失败。这是压缩包安装里最常见的一次性错误。端口与端口冲突Nacos 默认占用 8848官方文档里的说法是「8848 成功人士的标配」。这个端口被占用时服务起不来或控制台打不开。端口用途版本8848主端口HTTP 控制台与 OpenAPI同时承担 2.x 的 gRPC 主通道全版本9848客户端 gRPC 请求端口值为8848 10002.x 新增9849服务端 gRPC 通信端口集群节点间同步用值为8848 10012.x 新增7848集群 Raft 通信端口2.x 新增1.4.1 这套安装只需要开 8848容器映射也只写 8848 就够。一旦升级到 2.x9848/9849必须在防火墙和docker run -p里一起放出来否则会出现「控制台能打开但客户端注册不上」的诡异现象——原因就是 HTTP 通了、gRPC 没通。8848 被占用又关不掉那个进程时改端口进conf/application.properties找到主端口配置项改掉即可。### Default web server port: server.port8848 ### Default web context path: server.servlet.contextPath/nacos改完端口访问路径也要跟着换。比如改成8849控制台地址就是http://localhost:8849/nacos。注意server.servlet.contextPath/nacos这一行别删删了根路径就没有/nacos前缀浏览器直接访问会 404。启动验证启动成功后命令行会打印版本和端口信息形如nacos 1.4.1/port 8848。然后浏览器访问http://localhost:8848/nacos默认账号和密码都是nacos两者相同容易记。登录进去看到的控制台左侧菜单大致是这样┌────────────────────────────────────────────┐ │ Nacos 命名空间: public ([用户名])│ ├──────────────┬─────────────────────────────┤ │ 配置管理 │ 配置列表 / 历史版本 / │ │ │ 导入导出 / 监听查询 │ │ 服务管理 │ 服务列表 / 订阅者列表 / │ │ │ 发布者列表 │ │ 命名空间 │ 环境隔离public / dev / test│ │ 集群管理 │ 节点列表 / 节点元数据 │ └──────────────┴─────────────────────────────┘登录卡住的话先按顺序确认三件事用户名密码是不是nacos/nacos、端口是不是改过、访问地址有没有漏掉/nacos后缀。存储配置Derby 与 MySQLNacos 默认把数据写进内嵌的 Derby 数据库单机开发够用但不适合生产——多节点之间数据不共享也谈不上高可用。生产环境建议切 MySQL。配置都在conf/application.properties里默认这几行是注释掉的打开并填上自己的库信息即可# 使用 MySQL 作为数据源 spring.datasource.platformmysql # 数据库实例数量 db.num1 # 连接地址库名一般叫 nacos db.url.0jdbc:mysql://127.0.0.1:3306/nacos?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseUnicodetrueuseSSLfalseserverTimezoneUTC db.user.0nacos db.password.0nacos切库之前要先用conf/nacos-mysql.sql把表建好否则启动时会因为找不到config_info之类的表而报错。建库建表的完整脚本属于集群搭建的内容这里不展开。完整安装流程Docker压缩包是否是否准备 JDK 8选哪种安装方式docker run -d --name nacos-p 8848:8848 -e MODEstandalonenacos/nacos-server解压到非中文目录8848 是否被占用改 conf/application.properties 的 server.port保持 8848sh startup.sh -m standalone或 startup.cmd -m standalone浏览器访问 http://localhost:8848/nacosnacos / nacos 能否登录进入控制台安装完成排查端口 / 路径 /nacos 后缀 / 密码是否被改命令与配置速览项目内容说明Docker 启动docker run -d --name nacos -p 8848:8848 -e MODEstandalone nacos/nacos-server单机模式必须带-e MODEstandaloneDocker 日志docker logs -f nacos页面打不开时第一现场Linux 启动sh startup.sh -m standalone在nacos/bin目录执行Windows 启动startup.cmd -m standalone在nacos/bin目录执行关闭sh shutdown.sh只有压缩包方式需要容器用docker stop主端口server.port8848改在conf/application.properties上下文路径server.servlet.contextPath/nacos不要删影响访问地址控制台http://localhost:8848/nacos默认账号密码均为nacos数据源spring.datasource.platformmysql生产切换需先导入nacos-mysql.sql实战坑清单漏写MODEstandalone。容器和脚本都一样不带单机参数就按集群模式走找不到集群节点配置启动报错。压缩包方式是-m standaloneDocker 方式是-e MODEstandalone别混。8848 端口被别的程序占了。表现是启动日志里刷端口绑定异常或者启动了但访问不到。关掉占用进程或者改server.port。访问控制台 404。多数是地址写成了http://localhost:8848漏了/nacos后缀少数情况是server.servlet.contextPath被误删。注意 8848 是主端口端口的根路径不提供服务。账号密码不是默认值。nacos/nacos登录不上去先怀疑这台机器上的 Nacos 被改过密码或者连到了同事的实例上。Docker 容器起来了控制台打不开。分三步行docker ps确认容器在运行不看-a-a会把已退出的也列出来docker logs -f nacos看日志日志里若出现 Derby 或数据源初始化失败说明存储层没起来容器会因为健康检查失败自动退出。这种情况下容器状态是Exited不是端口问题。2.x 镜像只映射了 8848。控制台能开但业务服务注册不上日志里是 gRPC 相关异常。加上-p 9848:9848 -p 9849:9849再试。本机没装 JDK。压缩包方式下startup.sh第一步就检查JAVA_HOME装 JDK 8 并配好环境变量再启动。官方文档Nacos 官网Nacos GitHub 主页Nacos Release 下载页Spring Cloud Alibaba 官网总结Nacos 是 Spring Cloud Alibaba 的组件坐标在com.alibaba.cloud下父工程靠dependencyManagement统一管版本。它一个进程干了注册中心和配置中心两件事。本篇只用到注册发现配置管理在后续章节展开但装的时候不用为两者分别部署。单机启动的死命令是standaloneDocker 用-e MODEstandalone压缩包用-m standalone。默认端口8848、默认账号密码nacos/nacos、访问路径带/nacos后缀这三条记牢能省掉大部分排查。1.4.1 版本只关心 8848上到 2.x 之后9848 / 9849这两个 gRPC 端口在容器映射和防火墙里都要一起放行。开发用内嵌 Derby 没问题生产记得用nacos-mysql.sql建库后切 MySQL。