先聊个现象很多人学微服务Spring Cloud 那套东西看了一堆视频结果卡在第一步——Nacos 装不上、启动报错、明明官网下载了却起不来。我见过太多人在这一步磨掉一整天最后发现是版本不对、JDK 环境没配好或者压根没搞懂 standalone 模式是什么意思。这篇教程不整虚的我把 Nacos 从下载、解压、配置到启动、验证、接入微服务的完整流程捋一遍界面长什么样、文件改哪里、命令敲什么、报错怎么查全部按实操顺序写出来。这篇内容我尽量写得像你坐在我旁边我一步步点给你看一样。适合刚接触 Nacos 的入门选手也适合被安装折磨过、想一次跑通的老手。你会搞明白 Nacos 到底是干嘛的、为什么 Spring Cloud 项目离不开它、注册中心和配置中心是怎么工作的以及最关键的——怎么在 Windows、Linux 和 Docker 三种环境下把它跑起来。1. Nacos 到底是干嘛的装之前先把定位搞清楚1.1 注册中心解决的核心问题在单体应用时代服务就一个地址写死在配置文件里不存在“找服务”的问题。一旦拆成微服务订单服务要调用用户服务你怎么知道用户服务部署在哪台机器、哪个端口、有几台实例这就是服务发现问题。如果靠人肉维护一份 IP 清单服务一扩缩容就全乱套。Nacos 作为注册中心干的事情就是让每个服务启动的时候主动向它报到告诉它“我叫什么名字、我在哪个 IP 哪个端口、我目前是健康的”。其他服务要调用的时候来 Nacos 这里查一下“用户服务现在有几台活的”拿到列表再去调用。这个过程叫服务注册与服务发现。服务宕机了也不用担心Nacos 通过心跳机制能感知到自动把不健康的实例摘掉。1.2 配置中心的必要性环境隔离与动态刷新除了注册中心Nacos 还有一个同样高频使用的身份——配置中心。以前配置写在 application.yml 里改一个参数要重新打包、重新发布。在微服务架构下服务一多配置文件满天飞你根本分不清哪个机器上跑的是哪个版本的配置。把配置扔到 Nacos 上以后配置和代码分离改配置不需要重启服务Nacos 会把变更推给客户端实现所谓的“动态刷新”和“热更新”。环境隔离也方便dev、test、prod 各一套命名空间互不干扰。这点在后文的实操中我会重点演示。1.3 选型对比Nacos 凭什么流行市面上常见的注册中心有 Eureka、Consul、Zookeeper、Nacos。Eureka 2.x 已停止开发Consul 在国内用的人相对少Zookeeper 更多是作为分布式协调工具而不是专门的注册中心而且它没有配置中心能力。Nacos 是阿里开源出来的既做注册中心又做配置中心支持 AP 和 CP 两种模式切换中文文档友好社区活跃Spring Cloud Alibaba 体系首选。这也是为什么你现在搜 Spring Cloud 整合教程十个里有九个用的都是 Nacos。2. 安装前的版本选择和下载这一步最容易被坑2.1 版本怎么选2.x 和 3.x 差异不小打开 Nacos 官网下载页你会看到一堆版本号第一次装的人很容易随便下载一个最新的结果启动报错。Nacos 的版本策略不像普通软件那样“越新越好”它和你的 JDK、客户端版本、Spring Cloud Alibaba 版本都有关联。目前主流的生产版本分两条线2.x 和 3.x。Nacos 2.x 是过去几年最普及的稳定线2.2.x、2.3.x、2.4.x 都有不少公司在用对 Spring Cloud Alibaba 2021.x、2022.x、2023.x 都有对应的兼容组合。Nacos 3.x 是较新的大版本引入了模块化架构、RPC 协议增强等变化如果你用的是 Spring Cloud Alibaba 2023.x 以上的新项目可以考虑但如果你只想赶紧跑通、不想折腾兼容问题我建议选 2.x 的近期稳定版比如 2.2.1 或 2.3.2。2.2 下载渠道官网慢就换国内镜像Nacos 是 Java 写的下载下来的东西叫“nacos-server-x.x.x.zip”或 tar.gz不是安装包 exe这点要有心理准备——它解压即用。官网地址是 github.com/alibaba/nacos/releases英文界面找到对应版本后往下拉看到 Assets 区域点后缀为 zip 或 tar.gz 的包下载。如果你的网络访问 GitHub 慢那就用国内镜像搜“nacos 2.2.1 国内镜像下载”很多云厂商的镜像站都有同步。下载完之后对比一下文件大小zip 包一般在 100MB 以上如果只有几十 KB八成是下载到了源码包或者下错了文件。注意不要下载源码包Source code那个需要自己 Maven 编译费时费力。我们要的是 nacos-server 开头的二进制包。2.3 环境要求JDK 和内存是硬指标Nacos 是个 Java 应用所以本机必须先装 JDK。2.x 版本官方支持 JDK 8 及以上我实测 JDK 8 和 JDK 11 都跑得很稳如果你要用 3.x建议 JDK 17 起步。装完之后命令行敲java -version确认一下能输出版本号就没问题。内存方面Nacos 默认 JVM 参数分配得比较夸张默认启动可能要占 1G 到 2G 内存。你本机如果只有 8G 内存跑着 IDEA 再跑 Nacos 可能会卡。等会儿我会教你怎么改启动脚本把内存调小。3. Windows 单机安装最简单也最能跑通全流程3.1 解压和基础配置修改在 Windows 上装 Nacos我用的路径是D:\nacos你可以按自己习惯放但路径里尽量不要有中文和空格。解压之后你会看到这样一个目录结构bin启动和关闭脚本所在目录Windows 下是startup.cmd和shutdown.cmdLinux 下是startup.sh和shutdown.shconf核心配置文件目录最重要的就是application.propertiesdataNacos 内置数据库存数据的目录启动后自动生成logs日志目录排查问题全靠这里面先说一下端口。Nacos 默认的主端口是 8848它还有一个 9848 的 gRPC 端口2.x 版本客户端和服务端通信走的是 gRPC所以不要只放行 88489848 也要放行否则服务注册会超时。这两个端口如果被你本机其他程序占用可以在conf/application.properties里改server.port但 9848 对应的偏移端口是主端口加 1000改动后要自己算清楚偏移量。3.2 standalone 模式设置和启动命令因为我们要单机测试不搞集群所以必须让 Nacos 以 standalone 模式启动。Windows 下有两种方式第一种直接改bin\startup.cmd找到set MODEcluster改成set MODEstandalone。第二种不改文件启动的时候用命令行参数指定。在bin目录下打开 CMD执行startup.cmd -m standalone我个人推荐第二种因为不污染文件以后要跑集群模式还能随时切回去。启动之后会弹出新的命令行窗口里面滚动一堆日志。看到Nacos started successfully in the XXX mode.这行字就说明启动成功了。顺便说一下临时想关掉服务在同样的bin目录下执行shutdown.cmd3.3 控制台登录和初始账号处理启动成功之后打开浏览器输入http://localhost:8848/nacos你会看到一个登录页面背景是深色渐变中间是用户名和密码输入框。默认账号密码都是nacos/nacos。重要提醒首次登录后请立刻去左侧菜单“权限控制”里改掉默认密码。Nacos 默认凭据是公开的生产环境不改密码等于把注册中心裸奔在外别人可以直接往你注册中心塞假服务。登录进去之后你会看到控制台的主界面。左侧是功能菜单包括服务管理、配置管理、命名空间、权限控制等。第一次进来服务列表是空的配置列表也是空的。不用慌接下来的章节我会带你逐个验证。4. Linux 服务器安装生产环境更常用4.1 上传解压和配置文件修改实际工作中Windows 装 Nacos 大多数是为了本地开发调试真正的测试环境和生产环境都是 Linux 服务器。我在 CentOS 7 和 Ubuntu 20.04 上都装过流程基本一样。先把下载好的 tar.gz 包上传到服务器假设放在/opt目录然后解压tar -zxvf nacos-server-2.2.1.tar.gz mv nacos /usr/local/nacos进入配置目录重点看conf/application.properties。单机模式其实不用改太多默认配置就能跑。生产环境我通常会检查两点一是修改server.port避免和已有服务冲突二是确认数据库配置——如果要用 MySQL 存储配置数据就要在配置文件里启用 MySQL 数据源这个我放到后面“高级配置”里再说。4.2 启动脚本和开机自启Linux 下启动命令是# 进入 bin 目录 cd /usr/local/nacos/bin # 单机模式启动 sh startup.sh -m standalone启动后怎么看是否成功先看进程ps -ef | grep nacos再看日志tail -f /usr/local/nacos/logs/start.out看到Nacos started successfully就妥了。这时在浏览器访问http://服务器IP:8848/nacos注意云服务器要在安全组里放行 8848 和 9848 端口本地虚拟机的话要关防火墙或放行端口。如果想让 Nacos 开机自启用 systemd 比较正规。在/etc/systemd/system/nacos.service写入[Unit] DescriptionNacos Server Afternetwork.target [Service] Typeforking ExecStart/usr/local/nacos/bin/startup.sh -m standalone ExecStop/usr/local/nacos/bin/shutdown.sh Userroot Restarton-failure [Install] WantedBymulti-user.target然后执行systemctl daemon-reload systemctl enable nacos systemctl start nacos4.3 生产环境注意点内存、日志和权限生产服务器上跑 Nacos我踩过几个坑先说最重要的内存。Nacos 默认的 JVM 参数里-Xms和-Xmx可能是 1g 或 2g如果你的服务器总共才 2G 内存一启动就可能把系统搞到 OOM。解决办法是修改bin/startup.sh里的 JVM 参数比如改成JAVA_OPT${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m还有个权限问题Nacos 解压后默认属主是 root如果你用普通用户启动可能遇到日志目录没有写权限的情况。建议把整个目录授权给运行用户chown -R nacos:nacos /usr/local/nacos用专门的用户运行比直接 root 跑安全得多。5. Docker 方式安装最快上手的路径之一5.1 docker run 跑单机 Nacos不想在机器上装 JDK、不想解压、想快速起一个环境来联调那 Docker 是最省心的方式。前提是你已经装好了 Docker拉取镜像可能稍微慢一点耐心等就行。单机模式最简单的启动命令docker run --name nacos -d \ -p 8848:8848 \ -p 9848:9848 \ -e MODEstandalone \ nacos/nacos-server:v2.2.1MODEstandalone环境变量就相当于执行了startup.sh -m standalone不需要再改配置文件。启动之后用docker logs -f nacos查看日志看到成功信息后就可以访问控制台了。5.2 docker-compose 编排配置和数据卷直接用 docker run 适合临时测试如果你想长期使用我建议用 docker-compose把数据目录和配置文件挂载出来否则容器一删数据全没了。新建一个docker-compose.ymlversion: 3 services: nacos: image: nacos/nacos-server:v2.2.1 container_name: nacos environment: - MODEstandalone - PREFER_HOST_MODEhostname - NACOS_SERVER_PORT8848 ports: - 8848:8848 - 9848:9848 volumes: - ./nacos/logs:/home/nacos/logs - ./nacos/conf/application.properties:/home/nacos/conf/application.properties执行docker-compose up -d这样做的好处是配置文件在宿主机上可以直接改改完docker restart nacos就生效。日志也能在宿主机上直接查看排查问题方便很多。5.3 Docker 启动常见坑Docker 方式跑 Nacos 有两个高频坑。第一个是 gRPC 端口没映射出去。2.x 版本的 Nacos 客户端默认会用主端口加 1000 的端口进行 gRPC 通信你只映射了 8848 没映射 9848服务注册时客户端会一直报连接超时。第二个坑是时区问题容器默认是 UTC 时间你看到日志里的时间和本地时间差了 8 个小时看着很别扭。启动的时候加一个环境变量-e TZAsia/Shanghai一句话的事别等到后面看日志才反应过来说时间对不上。6. 装完之后马上做的三件事验证注册中心和配置中心6.1 检查集群节点和健康状态Nacos 装好只是开始你得验证它是不是真的能用。第一件事是看看节点状态。浏览器访问http://localhost:8848/nacos/v1/core/cluster/nodes如果是以 standalone 模式启动的这个接口返回的是单个节点的信息里面有节点的 IP、状态、版本等。看到这个接口有响应说明 Nacos 的 HTTP 服务是通的。不过这个接口返回的是 JSON浏览器里看可能有点乱我一般习惯用命令行验证curl -X GET http://localhost:8848/nacos/v1/core/cluster/nodes如果返回了节点列表哪怕只有一个节点也说明集群状态模块是正常的。这个接口在做集群扩容、节点健康检查的时候特别有用建议记住。6.2 注册一个服务测试控制台界面虽然漂亮但注册中心的核心能力还是要用真实的服务来验证。打开 Nacos 控制台左侧点“服务管理—服务列表”里面现在是空的。我们手动注册一个临时服务试试在命令行里执行curl -X POST \ http://localhost:8848/nacos/v1/ns/instance?serviceNametest-serviceip127.0.0.1port8080回到控制台刷新服务列表就能看到test-service已经出现了点击它的详情能看到实例的 IP 和端口。这说明整个注册链路是通的。不用的时候把它删掉可以用注销接口也可以直接在控制台上操作。提示注册中心的本质就是一个“电话本”服务上下线都会实时更新。你手动注册的这个服务没有心跳上报过一会儿 Nacos 会把它标记为不健康这是正常现象不是故障。6.3 配置中心发布配置并验证动态刷新Nacos 作为配置中心核心价值是动态刷新。我们来实际测一遍。控制台左侧点“配置管理—配置列表”点击右上角“新建配置”。Data ID 填my-config.propertiesGroup 保持DEFAULT_GROUP配置格式选 properties配置内容写一行app.namenacos-demo发布之后现在我们要验证客户端能不能拉到这个配置。这里需要借助一个小工具或者直接写一个简单的 Spring Boot 项目。我平时图省事直接用一个测试类测试但这里为了你快速验证我推荐一种更直观的方式。在 Spring Boot 项目中引入依赖dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependencybootstrap.yml 里配置spring: application: name: my-config cloud: nacos: config: server-addr: localhost:8848 file-extension: properties然后写一个 Controller用RefreshScope和Value读取配置RestController RefreshScope public class ConfigController { Value(${app.name:default}) private String appName; GetMapping(/config) public String getConfig() { return appName; } }启动项目访问/config返回的是nacos-demo。回到 Nacos 控制台把配置内容改成app.namenacos-prod发布。不重启服务直接刷新浏览器/config接口返回的已经变成nacos-prod了。这就是配置热更新。这一步你能跑通Nacos 的两个核心功能就算彻底掌握了。7. 高频问题排查实录全是踩过的坑7.1 账号密码能登录但服务注册失败 401这个问题的关键词在热搜里排得很靠前说明被坑的人非常多。现象是你在浏览器里用 nacos/nacos 能正常登录控制台但服务启动时往 Nacos 注册却报 401 Unauthorized。第一次遇到这个问题我排查了很久。401 说明是鉴权没过但你明明能登录控制台为什么会鉴权失败原因其实出在客户端上Nacos 默认开启了鉴权浏览器登录控制台时服务端给你发了 token你有“门票”所以能进。但你的微服务客户端在注册时如果没有在配置文件里配置用户名密码它就拿不到 token直接被拦在门外。解决办法是在你的服务配置里加上 Nacos 的账号密码spring: cloud: nacos: discovery: server-addr: localhost:8848 username: nacos password: nacos config: server-addr: localhost:8848 username: nacos password: nacos如果你确认用户名密码都对了还是报 401那就查一下系统时间和 Nacos 服务器时间是否一致。因为 token 是有时效的客户端时钟和服务端时钟偏差太大token 会被判定为无效。我用虚拟机联调时遇到过一次宿主机和虚拟机时间差了 5 分钟找了大半天。7.2 启动失败端口占用和 JVM 崩溃Windows 上双击 startup.cmd 后窗口一闪而过什么错误都看不到这个场景我太熟了。解决办法是用命令行方式启动让日志停留在当前窗口startup.cmd -m standalone如果启动过程中报端口占用用命令查一下是被谁占了netstat -ano | findstr 8848找到 PID 后在任务管理器里直接结束进程或者换成其他端口。JVM 崩溃更隐蔽常见于老电脑或者 32 位 JDK报错里能看到类似Could not reserve enough space for 1048576KB object heap的信息这就是堆内存设太大了按前面说的把-Xms和-Xmx调小就解决。7.3 Nacos 适配达梦数据库国产化改造必看搜“Nacos 适配达梦数据库”的人多半是遇到信创要求了。Nacos 默认用内嵌数据库 Derby 存数据如果要切换成达梦数据库思路并不复杂但操作起来要细心。核心步骤是改conf/application.properties里的数据源配置。先要下载达梦数据库的 JDBC 驱动 jar放到 Nacos 的 lib 目录下然后在配置文件里把数据源相关的配置改成达梦的驱动类和 URL。Nacos 2.2.1 之后的版本支持通过spring.datasource.platform指定如果你用的是dm数据库需要确认你拿到的版本是否内置了达梦的适配逻辑没有的话还要自己补充数据源插件。这块没有官方开箱即用的方案很多情况要靠自己改代码或者找人定制。我的建议是先确认你的 Nacos 版本和达梦数据库版本再去搜对应版本的适配方案。千万别一上来就乱改配置文件会导致数据源初始化失败。7.4 sentinel feign nacos 组合报错还有一个高频场景是微服务整合了 Sentinel、Feign 和 Nacos 三个组件启动时报一堆错。这类组合报错十有八九和依赖版本冲突有关。Spring Cloud Alibaba 各个组件版本是成套发布的你单独用最新版的 Nacos 客户端但 Sentinel 用的是旧版就可能出现类冲突。遇到这种问题先别急着改代码去查一下 Spring Cloud Alibaba 的版本对应关系。注册中心和配置中心用 Nacos、限流熔断用 Sentinel、声明式调用用 FeignOpenFeign这些都是 Spring Cloud Alibaba 生态的一员版本必须匹配。我的经验是直接用 Spring Cloud Alibaba 官方推荐的版本组合不要贪新。7.5 内存居高不下JVM 参数调优最后说一个容易被忽略的问题Nacos 本身不太吃 CPU但内存占用很可观。如果你的服务器配置不高建议在启动脚本里把堆内存调到合理范围。Nacos 2.x 跑个测试环境512MB 堆内存完全够用生产环境根据节点规模再往上加。修改方法前面提过Windows 改startup.cmdLinux 改startup.sh找到初始化 JVM 参数的set JAVA_OPT或JAVA_OPT把-Xms和-Xmx调到你想要的值。改完之后重启 Nacos用jmap -heap 进程ID可以查看堆内存分配情况确认参数是否生效。8. 装完之后怎么接微服务生态一句话总结核心流程Nacos 装好、验证通过之后接下来就是把它接入你的微服务项目。这里我给一个最小路径Spring Cloud 项目引依赖配地址加注解三步走。先在父工程里引入 Spring Cloud Alibaba 的依赖管理然后在你的服务模块里引入 Nacos Discovery 和 Nacos Config 的 starter配置好 server-addr启动类上加EnableDiscoveryClient注解。启动项目控制台的服务列表里能看到你的服务名这就完成了服务注册。Feign 调用远端接口时通过服务名就能定位到具体的实例不需要硬编码 IP。整合 Knife4j 做 API 文档也是常见需求Swagger 依赖加好之后配置好分组即可它和 Nacos 本身没有直接关联只是同一个项目中会一起用。Dubbo 项目也能用 Nacos 做注册中心把 Dubbo 的注册中心地址指向 Nacos 即可。我个人在实际项目里的体会是Nacos 安装只是整个微服务架构里最小的一环但这一环不跑通后面全白搭。花半小时把环境搭好、把注册中心和配置中心都手动验证一遍后面排查问题会省很多时间。如果你不想看一堆视频就按这篇文章的顺序操作一遍基本上能一次跑通。
