简介:Nacos 2.2.3是阿里开源的稳定版服务发现与配置中心组件,适合在Windows环境搭建微服务基础设施的开发者使用,可解决服务注册、动态配置、健康检查等常见问题。压缩包共16个文件,大小142.02MB,包含启动/关闭脚本(cmd/sh)、核心配置(properties/conf)、日志模板(xml)、MySQL与Derby初始化SQL以及服务端jar包,目录结构清晰,便于按需取用。资源附有license、notice、README等说明文件,可了解版本规格与使用条款;已有1872人学习下载,具有一定参考价值。解压后修改application.properties并运行启动脚本,即可在Windows下搭建Nacos服务注册与配置中心,适合需要快速上手服务发现、配置管理、命名空间隔离及集群部署配置的微服务开发者,也可作为本地联调与生产部署前的验证环境。
1. 为什么我把部署方式定为 nacos-server-2.2.3.zip
1.1 zip 发行包里到底打包了什么
刚拿到手的时候,我习惯先不看任何文档,直接把这个文件名拆开看。nacos-server-2.2.3.zip 表示这是 Nacos 服务端 2.2.3 版本的官方发行包,zip 封装的是已经编译好的二进制产物。解压后的根目录一般是 nacos,里面最核心的几个目录是 bin、conf、logs、data、target。
bin 放着启动和停止脚本,startup.sh 和 startup.cmd 是日常使用最多的,shutdown.sh 对应优雅关闭。conf 里是 application.properties 和 mysql-schema.sql 这类核心配置,后文要改的数据库连接就在这里。target 目录里有一个 nacos-server.jar,这才是真正运行的 Java 程序,外面脚本的作用只是给它设置 JVM 参数。知道这个结构对排错很有帮助,因为很多人一看到日志报错就怀疑 jar 包损坏,其实大部分问题和 jar 没关系,而是脚本、JDK 或者配置文件不对。
1.2 和源码包、Docker 镜像对比后我做了取舍
我这次部署的机器在内网,Docker 平台还没有铺开,直接传镜像不方便;源码包又需要 Maven 编译,内网拉取依赖不一定顺利。所以我把三个方案拉出来对比了一下:
| 部署方式 | 适合场景 | 上手成本 | 后续维护 |
|---|---|---|---|
| zip 发行包 | 内网环境、快速搭建、离线部署 | 低 | 中 |
| 源码包 | 二次开发、改源码、自定义构建 | 高 | 高 |
| Docker 镜像 | 已上容器平台、追求标准化交付 | 中 | 低 |
zip 包最大的优势是“离线友好”:一个文件拷贝到服务器上,解压就能启动,不需要额外安装工具链。而且 Nacos 2.2.3 这个版本在 2.x 系列里稳定度还不错,修复了不少 2.2.0 到 2.2.2 之间的已知问题。如果只是需要一个可用的服务端,不需要在源码层面做定制,zip 发行版是性价比最高的选择。
1.3 下载后先别急着解压,做一次校验
下载 zip 包这件事,看着简单,其实藏着一个高频坑:压缩包不完整。浏览器下载时网络一抖动,文件尾部丢了,一解压就报 “invalid zip archive: could not find eocd”。eocd 是 zip 格式的 End Of Central Directory 记录,相当于压缩包的目录索引,它位于文件最末尾,一旦缺失或损坏,整个 zip 都无法读取。所以我下载完会先做两件事:第一,对比官方 Release 页面给出的 sha256 校验值;第二,跑一遍完整性测试:
sha256sum nacos-server-2.2.3.zip unzip -t nacos-server-2.2.3.zip-w 参数可以校验解压路径是否包含不存在的目录,不过日常使用的 unzip -t 就够了。Windows 下用 7-Zip 打开压缩包后,菜单里有一个“测试”按钮,点击后能直接检查压缩包是否可读。这个习惯花不了几秒钟,但能避免后面所有“解压到一半报错”的尴尬。
2. 解压和启动前,先把环境和校验这件事做扎实
2.1 JDK 版本不是越高越好
Nacos 2.2.3 官方要求 JDK 8 及以上,但实测下来最好还是用 JDK 8 或 JDK 11。有人觉得新项目当然要上新 JDK,直接装了 JDK 17,结果启动时遇到模块化相关的反射异常,日志里一堆 IllegalArgumentException,折腾半天。原因在于 Nacos 2.2.x 的某些依赖还没完全适配高版本 JDK 的模块限制。如果你不确定团队其他组件用的是什么版本,直接用 JDK 8 最稳;已经装了 JDK 11 也能跑,但不要轻易上 17。
启动脚本 startup.sh 会调用 $JAVA_HOME/bin/java,所以 JAVA_HOME 必须配置正确。Linux 下可以在 /etc/profile 里加:
export JAVA_HOME=/usr/local/jdk1.8.0_212 export PATH=$PATH:$JAVA_HOME/bin执行 source /etc/profile 后验证。Windows 下配置完环境变量,一定要新开一个 cmd 窗口再验证,不要用旧窗口。这里有个很容易忽略的细节:如果 PATH 里有多个 JDK,java -version 看到的版本和 JAVA_HOME 可能不一致。所以我一般会把这样三条命令一起执行:
echo $JAVA_HOME java -version which java如果 which java 指向的路径和 JAVA_HOME 不一致,说明 PATH 里其他位置的 JDK 抢先了,需要调整顺序。
2.2 解压目录规划与权限处理
解压命令很简单:
unzip nacos-server-2.2.3.zip -d /opt/service注意解压后不是直接落在 /opt/service,而是 /opt/service/nacos。我习惯再做一个软链,方便以后升级版本时切换:
ln -s /opt/service/nacos /usr/local/nacos以后启动命令直接用 /usr/local/nacos/bin/startup.sh,升级的时候把新版本解压到 /opt/service,改一下软链指向就行,不用改系统里其他调用路径。
路径名里千万不要包含中文、空格和特殊字符。Nacos 的启动脚本在拼接路径的时候对这类情况处理得很脆弱,我见过因为目录名带了空格,启动时报找不到 nacos-server.jar 的情况,排查了很久才发现是路径问题。还有权限问题:Linux 下 unzip 解压不会保留 Unix 可执行权限,启动脚本经常没有 x 权限,直接执行会提示 Permission denied。需要手动加权限:
chmod +x /opt/service/nacos/bin/*.sh如果使用非 root 用户启动,还要确认 data、logs、conf 目录对该用户可写,否则启动时日志写不进去,进程会一直在启动状态,却看不到任何有效输出。
2.3 Nacos 2.x 的端口规划和防火墙上要有数
Nacos 2.x 和三年前的 1.x 有个重要区别:1.x 基本只关注 8848 这个 HTTP 端口,2.x 加入了 gRPC 通信,默认会占用三个端口:
- 8848:主 HTTP 端口,控制台和 HTTP API 都走这里
- 9848:客户端 gRPC 端口,服务注册、配置监听的长连接走这里
- 9849:服务端之间通信的 gRPC 端口
9848 和 9849 不需要在配置文件里显式设置,它们自动取主端口加 1000 和加 1001 的值。这也是很多人踩坑的地方:防火墙只放行了 8848,服务端页面能打开,但客户端注册时一直连接失败,因为 9848 被防火墙挡住了。所以部署之前,最好先把这三个端口一次性提交给运维放行,免得后面反复补规则。
3. 单机模式跑起来之后,我改了什么、查了什么
3.1 启动命令和第一次启动检查
单机模式启动命令是这样的:
cd /opt/service/nacos bash bin/startup.sh -m standalone-m standalone 表示以单机模式运行。这里的逻辑值得说清楚:如果不加 -m 参数,脚本会默认读取 conf/cluster.conf,如果这个文件不存在或者没有可用节点,启动会失败。所以先写清楚参数,比报了错再改效率高。Windows 下对应执行:
startup.cmd -m standalone启动后不要立刻访问页面,先看日志:
tail -f logs/start.out看到 “Nacos started successfully” 这种提示,或者日志里出现 Tomcat 启动在 8848 端口,再访问 http://localhost:8848/nacos,默认账号密码都是 nacos/nacos。我第一次启动时,日志一直停在一个位置不动,后来发现是 JDK 版本问题,换成 JDK 8 后很快就起来了。所以遇到日志不动,先环境、再端口、后配置,不要盲目重启。
3.2 JVM 内存参数:小机器上必须调
Nacos 的 JVM 参数写在启动脚本里,不需要额外配置文件。打开 bin/startup.sh,可以看到类似这样的内容:
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m"如果你的机器只有 1G 内存,这个默认配置会有点吃力。我一般会改成 256m:
JAVA_OPT="${JAVA_OPT} -Xms256m -Xmx256m"有人可能会问,是不是调得越小越好?不是。Nacos 本身是 Java 进程,堆内存太小会导致 Full GC 频繁,后续客户端多起来,服务发现和配置推送的响应会明显变慢。建议根据机器规格来:1G 内存机器开 256m/256m,2G 内存机器保持默认 512m 都行,内存充足就没必要动。
3.3 启动失败排查:我总结的“三查”链路
第一次启动 Nacos,大概率会遇到问题。我总结了一个“三查”链路:
- 查日志:logs/start.out 是最直接的信息来源。很多报错会直接说清楚,比如端口被占用、数据库连不上。
- 查端口:用 lsof -i:8848 或 netstat -anp | grep 8848,如果端口被占用,修改 conf/application.properties 里的 server.port。但要注意,只改 8848 不够,9848 和 9849 会自动变,防火墙规则也要跟着改。
- 查环境:执行 java -version 和 echo $JAVA_HOME,确认 JDK 版本和路径。
有一次我遇到服务启动成功了,页面也能打开,但是过一会被系统杀掉。后来看 dmesg 才发现是 OOM,进程被内核 kill 掉了。所以启动完不要马上离开,先 ps -ef | grep nacos 确认进程还在,再观察几分钟。
4. 从 Derby 切到 MySQL 才能算生产可用
4.1 默认 Derby 为什么只适合试水
Nacos 2.2.3 默认使用的数据库是内嵌 Derby,数据文件存放在解压目录的 data/derby-data 下。这个设计的好处是开箱即用,不需要额外装数据库就能体验完整功能。但坏处也很明显:数据和服务实例强绑定,想迁移、备份都得先停服务再去拷贝文件;集群模式下 Derby 没法多节点共享数据,官方明确不建议生产环境用。
我在测试环境跑了几天,页面上配置项越来越多,这时候才意识到迁移成本已经上来了。所以如果你的计划是长期使用,建议在第一次启动前就把 MySQL 配好,而不是先跑起来再说。
4.2 初始化脚本和配置修改
操作分三步。第一步,创建一个数据库,比如 nacos_config,字符集用 utf8mb4。第二步,导入官方提供的建表脚本:
mysql -uroot -p -h127.0.0.1 nacos_config < /opt/service/nacos/conf/mysql-schema.sql这个脚本会建出 config_info、his_config_info 等一系列表,Nacos 的配置和历史版本就存这里。第三步,修改 conf/application.properties,核心配置如下:
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=Asia/Shanghai db.user.0=nacos db.password.0=你的密码db.url.0 里的 serverTimezone 参数一定要加,尤其是 MySQL 8.x。不加的话,驱动在做日期处理时会报时区异常,启动日志里会出现 “The server time zone value” 的报错。
4.3 怎么验证持久化确实生效
配置完重启服务,不要只看启动日志里显示成功,那个不一定准。我建议做一次写入验证:在 Nacos 控制台新建一条测试配置,然后到 MySQL 里查:
SELECT COUNT(*) FROM nacos_config.config_info;如果数据出现在表里,说明切换成功。如果表里一直是空的,回头检查 spring.datasource.platform 是不是写成了 mysql,以及 db.url.0 的连接串是否真的可达。另一个判断方式是看启动日志,如果里面出现 Derby 相关内容,说明数据库配置没有生效,通常是因为修改的 application.properties 不是启动脚本实际读取的那个文件。
5. 集群部署时 gRPC 端口和 cluster.conf 比想象中更关键
5.1 三节点配置的正确姿势
单机模式跑通后,下一步通常就是集群。Nacos 集群最少要三个节点,不是随便三台机器就能跑,需要先把 conf/cluster.conf 文件写好。这个文件默认不存在,要手动创建,每一行写一个节点的地址和端口:
192.168.1.11:8848 192.168.1.12:8848 192.168.1.13:8848然后所有节点都指向同一个 MySQL,数据库配置和单机模式一样。启动时不加 -m standalone,直接执行 startup.sh 就会进入集群模式。启动顺序没有严格要求,但我习惯一个节点一个节点来,先看第一个节点的日志确认能正常选主,再启动后面两个,这样如果哪个节点配置有问题,能第一时间定位。
5.2 我踩过的集群坑:安全组只开了 8848
第一次搭集群,三个节点都起来了,控制台也都能访问,我以为万事大吉。结果用 Nacos 客户端一注册服务,客户端立刻报 “Connection refused”。我在服务端看了半天日志,一切正常。最后用 netstat 一看,发现 9848 端口根本没有被客户端访问到。问题出在云安全组上,我申请放行时只填了 8848,把 9848 和 9849 漏了。Nacos 2.x 的客户端和服务端建立的是 gRPC 长连接,必然要走 9848 端口,所以集群环境下,节点之间、客户端到服务端,防火墙和安全组都要把这三个端口一起放通。
5.3 时间同步和配置一致性容易被忽略
还有一个坑是节点间的时钟偏移。Nacos 集群里用了 Raft 协议做选主,Raft 对时间非常敏感。三台机器如果时间差超过一定范围,会出现节点互不相让、选主反复失败的怪现象,控制台能打开但服务列表一直拿不到。解决办法是给节点机器都配上 NTP 时间同步,集群部署前先核对一下 date。另外,cluster.conf 修改后不会热加载,必须重启所有节点才能生效;节点 IP 变更时不要只改某一台,要同时同步所有节点。
6. 那些在 zip 包上高频出现的解压和进程故障
6.1 “could not find eocd”的完整排查路径
这个报错在搜索热度里一直很高,我专门把它单独拿出来说。场景一般是这样:从某个镜像站下载了 nacos-server-2.2.3.zip,解压到一半,工具提示 “invalid zip archive: could not find eocd”。这个报错的含义是 zip 文件末尾的中央目录记录缺失或损坏,文件本身已经不是一个有效压缩包。
我的排查步骤是固定的:
- 先看文件大小,和官方 Release 页面标注的包大小对比,如果差了几十 MB,直接重新下载。
- 用 file 命令识别文件类型:
file nacos-server-2.2.3.zip。如果输出显示 HTML document,说明下载到的是网页错误页,多半是下载链接没带重定向参数,或者服务器返回了 302 但下载工具没跟上。 - 用 unzip -t 测试压缩包完整性,如果测试就报错,就不用继续解压了。
- 在确定文件没问题后再解压,整个过程顺序不要变。
建议下载时使用 wget 或者 curl 的 -L 参数,避免静态资源重定向后保存成错误页面。如果公司有内网镜像源,也要确认镜像源缓存的文件是完整的,我遇到过镜像源同步时只同步了一半,导致包大小差一点的情况。
6.2 解压后脚本没有执行权限和日志写不进去
这是 Linux 上非常常见的问题。unzip 默认不保留 Unix 可执行位,所以解压出来的 startup.sh 经常没有 x 权限,执行时提示 Permission denied。解决方法是 chmod +x。另一个更隐蔽的问题是目录权限:如果你用 root 用户解压,然后切换到普通用户启动,普通用户对 data 和 logs 目录没有写权限,启动日志会一直报 “Permission denied”,但因为你用的是 tail 看日志,可能根本看不到那一行。我会把整个 nacos 目录的属主改成运行用户:
chown -R nacos:nacos /opt/service/nacos然后再启动,省得后面各种文件读写的坑。
6.3 停服时不要直接 kill -9
Nacos 自带了优雅关闭脚本:
bash /opt/service/nacos/bin/shutdown.sh它会先把进程里的数据状态处理完,再关闭端口。如果图省事直接 kill -9,容易留下两个隐患:一是数据文件可能处于不一致状态,重启时会有异常;二是会残留 PID 文件和端口占用。如果已经发生了端口占用,可以用:
lsof -i:8848找到对应的 PID,再 kill 掉,然后重启。
最后提一下我自己的习惯。安装目录里我通常会把 zip 原件留一份,同时把 sha256 值也记录到一个文本文件里,升级或者回滚的时候直接对照。Nacos 的部署本身不算难,真正的复杂度都在后续维护上,而很多维护问题从解压 zip 包那一刻就已经开始了。
本文还有配套的精品资源,点击获取