Nacos实战指南:从安装到Spring Cloud Alibaba集成
我前后装了不下二十次 Nacos从单机调试到生产集群都折腾过。很多人卡在下载完不知道下一步干嘛或者明明启动了却连不上这次直接把整个流程拆开讲配合实际踩坑记录照着走就行。需要明确的是这是一个围绕入门到可用的完整链路的实战记录不涉及集群部署和复杂调优适合刚接触微服务、需要在本地或测试环境跑通注册中心和配置中心的人。阅读本文大约需要十分钟建议打开终端边看边做。1. 下载之前先想清楚你要 Nacos 解决什么问题很多人下载 Nacos 只是因为它和 Spring Cloud Alibaba 绑定得比较紧但并不知道装完之后要拿它干什么。在动手之前先搞清楚 Nacos 的两个核心身份后面配置才不迷糊。1.1 注册中心服务之间的通讯录微服务架构下服务 A 要调用服务 B总不能让 A 把 B 的 IP 和端口硬编码在配置文件里。集群环境下实例会扩缩容、会迁移IP 一直在变。Nacos 在这里充当的就是通讯录的角色每个服务启动时主动把我叫什么、我在哪IP端口登记上去调用方只需要问 Nacos我要找的服务现在有哪些实例就能拿到可用列表。1.2 配置中心配置的统一管理面板传统单体应用配置写在本地文件里改了要重启。微服务动辄几十个服务每个服务一份配置改一处要挨个通知、挨个改、挨个重启效率很低。Nacos 把配置集中管理起来推到各个服务里配合动态刷新机制改了配置不用重启服务就能生效这是很多人最看重的价值。1.3 结合当前主流技术栈的选型判断我知道你会纠结Eureka 行不行Consul 行不行ZooKeeper 行不行我的建议是如果你的技术栈是 Spring Cloud Alibaba直接选 Nacos因为它作为注册中心和配置中心是一体化的不需要同时维护三套中间件。Eureka 2.x 已经停止开发Consul 在配置管理上不如 Nacos 直观ZooKeeper 更适合做分布式协调而不是配置管理。Nacos 在中文文档、社区活跃度、与 Dubbo / Spring Cloud Alibaba 的适配程度上都有明显优势。2. 环境准备与版本选择先搞清楚你的 JDK 和操作系统安装 Nacos 之前必须确认两件事JDK 版本和操作系统环境。这个坑我踩过希望你不要重复。2.1 JDK 版本8 够用17 要留意Nacos 2.x 要求 JDK 8 及以上。我最初用 JDK 11 跑的 Nacos 2.0.3 完全没问题但后来在一台只有 JDK 17 的机器上启动时就报了模块访问报错。查阅资料才明白JDK 17 对反射和模块化限制更严格老版本 Nacos 会触发防御性代码问题。如果你的机器只有 JDK 17建议直接使用 2.2.0 以上版本这些版本对 JDK 17 做了适配。如果公司强制要求 JDK 8Nacos 2.2.x 和 2.3.x 也都兼容。检查 JDK 版本java -version如果提示找不到 java需要先安装 JDK。不建议用过于古老的版本建议 JDK 8 至少是 8u202 以上版本。2.2 操作系统兼容性对比操作系统支持情况注意事项Linux (CentOS / Ubuntu)完全支持生产环境首选需要配置内存参数Windows完全支持开发调试方便但生产环境不建议macOS完全支持注意启动脚本权限问题我日常开发用 macOS测试环境是 LinuxWindows 也跑过只要注意启动脚本不同Linux/macOS 是startup.shWindows 是startup.cmd没有本质区别。2.3 版本选择的建议去 GitHub Releases 页面下载时会看到一堆版本。我的建议是不要追求最新版本等待社区验证尽量选 GAGeneral Available版本不要选 Beta 或 RC 版本2.2.3、2.3.2 是我实际用过比较稳的版本2.4 及以上还没在生产环境大面积验证过可以继续观察推荐固定一个已知稳定的版本去学习和使用不要经常追新。版本换来换去问题比收益多。3. 下载与安装两种方式我都用过下载安装这块网上教程五花八门我用过源码编译也用过直接下载发行包现在只推荐第二种。原因后面细说。3.1 直接从 GitHub Releases 下载发行包Nacos 每个 Release 版本都会提供编译好的压缩包Linux/macOS 选择nacos-server-2.3.2.tar.gzWindows 选择nacos-server-2.3.2.zip下载后解压即可不需要编译这是最省事的方式。执行# Linux / macOS tar -zxvf nacos-server-2.3.2.tar.gz mv nacos-server-2.3.2 nacos # Windows # 直接右键解压 nacos-server-2.3.2.zip3.2 为什么我不建议源码编译早期我试过从 GitHub 拉源码再mvn -Prelease-nacos -DskipTests clean install编译整个过程要下载大量依赖耗时十几分钟到半个小时不等而且经常因为网络原因失败。如果你不是要改 Nacos 源码完全没有必要走这条路。发行包一样是官方构建产物直接用就好。3.3 目录结构说明解压后的目录结构有必要先弄清楚nacos/ ├── bin/ # 启动和关闭脚本 ├── conf/ # 配置文件重点修改 application.properties ├── data/ # 运行数据目录首次启动后生成 └── logs/ # 启动日志和运行日志conf目录下的application.properties是核心配置文件后面要反复改它。logs目录下有个start.out文件启动失败时先看这个。3.4 单机模式启动前必改的三个地方启动之前先把两个重要的配置改掉否则后面会遇到很隐蔽的问题。第一修改conf/application.properties中是否有内置数据库相关配置需要确认默认配置。默认情况下 Nacos 使用内嵌数据库 Derby 存储配置数据单机学习没问题但如果要持久化并且怕数据丢失建议改为 MySQL。第二单机模式启动时默认会占用 JVM 内存较多。如果你的机器内存只有 4G 甚至更少建议先调整bin/startup.sh里的 JVM 参数把初始堆内存调小一点。第三注意 Windows 和 Linux 的启动脚本参数不同。4. 启动 Nacos单机模式从启动到访问控制台这里直接走一遍完整的启动流程并把常见报错一并讲清楚。4.1 Linux / macOS 启动命令cd nacos/bin # 单机模式启动 sh startup.sh -m standalone启动后观察日志tail -f ../logs/start.out看到类似下面的输出说明启动成功2024-01-15 14:30:22,678 INFO Nacos started successfully in stand alone mode. use embedded storage然后访问控制台http://localhost:8848/nacos默认账号密码都是nacos首次登录后建议马上修改密码。4.2 Windows 启动命令打开cmd注意用管理员权限进入解压目录的bin文件夹startup.cmd -m standaloneWindows 上启动有个很常见的坑端口 8848 被占用。启动脚本不会自动检测端口冲突会直接报Address already in use。如果遇到这种情况先排查占用进程netstat -ano | findstr 8848 taskkill /PID 进程号 /F4.3 启动脚本的 JVM 参数调整如果你发现启动很慢或者启动后机器卡顿明显很大概率是 JVM 参数没有调整。默认脚本里JVM_XMS512m、JVM_XMX512m不同版本参数略不同如果你机器内存充足可以保持但如果只有 4G 内存建议改为JVM_XMS256m JVM_XMX256m如果是 Windows修改startup.cmd里相应参数。这一步虽然不是必须的但对资源有限的测试机体验提升非常明显。4.4 防火墙和外部访问问题在这个地方先暂停一下因为部署场景不一样结论会不同。我不建议在生产环境或局域网测试环境中绕过安全措施把 Nacos 暴露出去。如果只是本机开发使用默认配置就够如果是局域网其他机器要访问 Nacos 服务端需要自行评估安全风险Nacos 的鉴权能力不足时应该通过网络策略和防火墙控制访问来源。可以在conf/application.properties中开启 Nacos 自带的鉴权能力相关配置项nacos.core.auth.enabledtrue nacos.core.auth.plugin.nacos.token.secret.key你自定义的超长Base64密钥密钥需要超过 32 个字符建议用 Base64 编码的随机字符串。开启鉴权后所有客户端和页面登录都需要提供账号密码或 token能挡住大量裸奔带来的安全风险。生产环境一定要开这个没有讨价还价的余地。5. 切换 MySQL 存储为什么默认的 Derby 只适合学习Nacos 默认使用内嵌的 Derby 数据库存储配置数据这就是为什么解压完不需要装数据库就能直接跑起来。但 Derby 有两个明显的问题数据只存在本地文件不方便查看和管理单机模式下数据存在data目录里想备份迁移很别扭所以即使单机使用我也建议切换到 MySQL。5.1 初始化数据库在 MySQL 中执行 Nacos 提供的建表脚本conf/mysql-schema.sql。mysql -uroot -p nacos/conf/mysql-schema.sql脚本会创建nacos_config数据库以及相关表结构不需要手动建库。5.2 修改配置文件编辑conf/application.properties找到以下配置项并修改spring.sql.init.platformmysql db.num1 db.url.0jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseUnicodetrueuseSSLfalseserverTimezoneAsia/Shanghai db.user.0你的数据库用户名 db.password.0你的数据库密码同时注释默认的 Derby 相关配置。5.3 重启后验证重启 Nacos 后在 MySQL 里执行SELECT * FROM nacos_config.config_info;如果能看到配置表结构说明切换成功。需要注意切换存储后原来在 Derby 里的配置不会自动迁移需要手动重新创建。这也是我建议一开始就切换 MySQL 的原因。5.4 关于 Nacos 支持 DB2 吗这个高频问题很多从 DB2 转过来的团队会问 Nacos 是否支持 DB2。在 2.x 主线版本里官方只保证了 MySQL 和 Derby 的完整兼容性DB2 不在官方测试范围内。但 Nacos 的数据源层留了扩展点社区有人做过适配方案核心思路是自定义数据源插件把 SQL 语法兼容层补上。如果你确实有这种需求需要先评估改造工作量而不是上来就改 JDBC 驱动因为 Nacos 内置的 SQL 语句是 MySQL 方言直接换驱动大概率跑不通。6. 集成 Spring Cloud Alibaba让服务注册到 NacosNacos 装好只是第一步让服务真正用起来才是关键。简单演示一个 Spring Boot 服务如何注册到 Nacos。6.1 引入依赖以 Maven 为例在pom.xml中加入dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId version2021.1/version /dependency版本号要和你的 Spring Cloud Alibaba 版本对应2.2.x 版本用的 release 版本体系不太一样具体要对齐 Spring Cloud Alibaba 版本说明。6.2 配置 application.ymlspring: application: name: order-service cloud: nacos: discovery: server-addr: 127.0.0.1:8848 username: nacos password: nacos启动项目后在 Nacos 控制台的服务管理页面就能看到order-service已经注册成功。6.3 为什么控制台看不到服务这是最常遇到的问题之一。按照我的经验依次排查Nacos 是否以单机模式启动成功看start.out日志服务是否真的启动成功看服务自身日志server-addr是否写正确端口是不是 8848不要加/nacos后缀Nacos 版本和服务端版本是否兼容客户端版本过旧或过新都可能导致注册失败如果你开了鉴权username和password是否配置正确网络策略是否限制了 8848 端口的访问顺着这串排查九成能找到问题。7. 配置中心使用从创建配置到动态刷新注册中心解决了服务发现的问题配置中心才是提升运维效率的王牌功能。7.1 创建第一个配置在 Nacos 控制台进入配置管理→配置列表点击右上角号新建配置。关键参数说明参数说明示例Data ID配置的唯一标识格式通常是服务名.后缀order-service.yamlGroup配置分组默认DEFAULT_GROUPDEFAULT_GROUP配置格式可选 TEXT / JSON / YAML / PropertiesYAML配置内容具体的配置项db.url: jdbc:mysql://...7.2 客户端读取配置在 Spring Boot 项目中引入配置中心依赖dependency groupIdcom.alibaba.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-config/artifactId /dependency必须使用bootstrap.yml或通过启动参数指定配置中心地址spring: application: name: order-service cloud: nacos: config: server-addr: 127.0.0.1:8848 file-extension: yaml group: DEFAULT_GROUP启动后order-service.yaml这个 Data ID 的配置会被自动加载。7.3 动态刷新配置的一个关键点配置中心的动态刷新指的是在 Nacos 控制台改完配置后客户端能自动感知并更新而不需要重启服务。在配置类上加上RefreshScope注解RestController RefreshScope public class ConfigController { Value(${order.timeout:10}) private Integer timeout; GetMapping(/timeout) public Integer getTimeout() { return timeout; } }在 Nacos 控制台修改order-service.yaml中的order.timeout调接口就能看到新值不需要重启。这个机制非常实用但要提醒的是RefreshScope对Bean和ConfigurationProperties的刷新规则有一些细节差异用了自定义 Bean 的话要注意验证。7.4 配置热更新常见问题排查如果改了配置没有生效按这个顺序查配置是否保存成功并发布了控制台右上角有发布按钮很多人忘了点客户端连接的是不是同一个 Nacos 服务端是否加了RefreshScopeData ID 的后缀和file-extension是否一致配置项 key 是否拼写正确8. 常见问题排查我整理过一张排错手册这些年我整理了 Nacos 常见问题的一个排查思路列出来供参考8.1 启动失败或访问不了控制台现象可能原因处理方式启动后立即退出JDK 版本不兼容检查 JDK 版本换用 8 或适配版本8848端口被占用被其他服务占用lsof -i:8848找到进程并处理访问控制台超时防火墙未放行检查防火墙策略调整访问来源控制页面报 502内存不足导致进程假死调整 JVM 参数8.2 客户端注册不上客户端注册报错时最常见的是ErrCode:400或Client not connected。前者通常是参数格式有问题比如server-addr配错了后者多半是客户端和服务端版本差异过大建议两边版本对齐。检查一下客户端的 nacos-client 版本不要相差太多尤其在 1.x 和 2.x 混用时协议不一致会导致很多莫名的问题。8.3 鉴权开启后客户端连不上这点特别提醒一下。如果你开启了鉴权客户端的application.yml里不仅要有username和password还需要确认 config 和 discovery 两个模块都配置了账号密码。我见过只给 discovery 配了没给 config 配结果服务注册成功但配置拉取失败的情况。更隐蔽的是如果配置中心开启鉴权后bootstrap.yml 里忘记配置服务启动会卡在拉取配置阶段超时表面上看是启动慢实际上是鉴权问题。8.4 日志文件是排查的第一入口任何时候都不要拍脑袋猜问题。先看日志Nacos 服务端日志nacos/logs/start.out和nacos/logs/nacos.log客户端日志服务自身控制台输出中搜nacos关键字日志里一般会直接写明原因大多数问题都能定位。9. 内存占用与资源优化本地开发机的亲身体验Nacos 本身是一个 Java 程序启动后占用一定内存是正常的。在我的 8G 内存 MacBook 上同时跑 Nacos、MySQL、三个微服务内存就非常紧张了。这里分享几个针对资源受限环境的优化思路。9.1 修改 JVM 启动参数上面提过在bin/startup.sh里可以调整JVM_XMS256m JVM_XMX256m实测在 2G 内存的云服务器上Nacos 单机模式 一个微服务可以稳定跑起来不会频繁 Full GC。9.2 关闭不需要的模块Nacos 2.x 的一些版本支持模块化裁剪但初中期不建议自行裁剪容易引出问题。更稳妥的方式是只启动单机模式-m standalone这个模式默认就已经关闭了集群相关的复杂逻辑资源开销相对较小。9.3 日志滚动配置运行时间长了logs目录会越来越大。建议在conf/nacos-logback.xml中调整日志保留策略maxFileSize50MB/maxFileSize maxHistory7/maxHistory这样单个日志文件超过 50MB 会自动切割只保留最近 7 天避免日志把磁盘撑爆。10. 生产环境额外建议这几条是花钱买来的教训如果只是自己学习看到这里就可以动手了。但如果要上生产环境下面几条必须看。10.1 集群模式的必要性单机模式部署的 Nacos 存在单点问题。如果 Nacos 挂了所有服务依然可以继续通过本地缓存进行服务调用但新上线的服务实例无法注册配置更新也无法下发。生产环境至少三节点集群起步。集群部署需要配合 MySQL 高可用方案这不是一个单独的 Nacos 问题而是一个整体架构设计问题。10.2 持久化到 MySQL 并做好备份使用内置 Derby 的 Nacos 一旦所在机器磁盘损坏配置数据基本就丢了。切换到 MySQL 后配合 MySQL 自身的备份机制容灾能力会好很多。生产环境要做好配置数据的定期备份演练很多人做了备份但从没演练过恢复真出事才发现备份文件是坏的。10.3 开启鉴权并严格控制网络访问生产环境的 Nacos 一定要开启鉴权。Nacos 控制台如果裸奔在公网上等同于把整个微服务架构的注册信息和配置信息拱手让人。就算开启了鉴权也要在防火墙或安全组层面限制只有内网 IP 能访问。10.4 配置变更要有流程意识Nacos 的配置中心权限控制粒度比较粗谁登录都能改配置。生产环境建议设置只读账号给普通开发查看核心人员才有配置变更权限。哪怕 Nacos 支持配置版本回滚几十个服务同时引用同一个配置时一次错误的变更可能引发大面积故障回滚也需要时间。11. 从零开始的完整演示今天一口气跑通全部流程把上面的内容串成一个完整流程你来跟着做。11.1 安装并启动 Nacos检查java -version确认 JDK 8下载 Nacos 发行包并解压修改conf/application.properties如有需要切换到 MySQL执行sh startup.sh -m standalone启动浏览器访问http://localhost:8848/nacos使用nacos/nacos登录修改默认密码11.2 创建配置在控制台配置管理页面新建配置Data ID:order-service.yamlGroup:DEFAULT_GROUP配置格式:YAML内容:order: timeout: 511.3 创建项目新建一个 Spring Boot 项目引入依赖配置bootstrap.yml启动后验证Nacos 控制台的服务列表中能看到服务通过接口能读到配置值修改 Nacos 中的配置观察动态刷新是否生效11.4 收尾操作验证完成后用sh shutdown.sh停止 Nacos观察日志确认正常关闭。我自己实际操作中最快的记录是十分钟内从零到跑通配置读取加服务注册。一步一步来不要急这个问题并不复杂。12. 几个容易混淆的概念顺手理清楚分享几个新手经常混淆的问题。12.1 服务端版本与客户端版本Nacos 服务端的版本和spring-cloud-starter-alibaba-nacos-discovery中的版本是两回事。服务端是独立部署的进程客户端是嵌入在你的应用中的组件。这两者需要保持兼容。最简单的方式是参考 Spring Cloud Alibaba 的版本说明它会告诉你推荐的 Nacos 服务端版本。不要盲目用最新客户端去连旧服务端也不要用旧客户端连新服务端。12.2 Nacos 与 Spring Cloud Config 的区别Nacos 配置中心是配置管理和服务发现一体化而且支持动态刷新。Spring Cloud Config 本身只是一个配置服务器通常需要配合 Bus 来实现刷新配置存到 Git 中。如果你已经在用 Spring Cloud Alibaba 体系集成 Nacos 配置中心是最顺手的选择。12.3 命名空间、Group、Data ID 的关系这三个概念很容易混乱我用一句话总结Data ID 是配置本身的文件名Group 是业务分组的名字Namespace 是环境隔离的大分区常见用法是用 namespace 区分 dev、test、prod 环境用 group 区分同一环境下的不同业务线用 Data ID 标识具体配置项。12.4 关于 Nacos 热更新 的本质热更新不是 Nacos 主动推配置而是客户端会通过长轮询检测到配置变更然后触发本地的 refresh 动作。理解了这一点你就能明白为什么配置类上要加RefreshScope——它就是为了让 Spring 容器感知变化并重建对应的 Bean。不加这个注解即使 Nacos 已经告诉你配置变了你的应用也不会重新加载。最后再分享一个小技巧遇到任何诡异问题第一步不是百度而是把 Nacos 服务端日志和客户端日志同时打开对比两个时间点发生了什么。大多数看似玄学的问题在日志里都有明确的线索。整个流程走下来Nacos 其实并不复杂花个小半天把所有细节跑通后面用起来就会非常顺手。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →