在使用 Nacos 时进行了一些配置的调整,过程中也遇到了一些问题,所以对 Nacos 部署上的一些要点进行了整理,详见官方文档:https://nacos.io/zh-cn/docs/v2/quickstart/quick-start.html
部署 Nacos 需要 JDK 环境,版本要求为 1.8 及其以上版本。如果采用源码部署方案,则需要 Maven,版本要求为 3.2 及其以上版本。
一、单机部署
-
单机模式下,最简化运行无须进行配置,可直接启动:
bin/startup.sh -m standalone建议在
Nacos主目录下启动,Nacos的work目录和start.out日志采用的相对路径。首次启动时,
Nacos默认账户为Nacos,默认密码为Nacos。 -
停止
Nacos服务:bin/shutdown.sh
二、配置 MySQL 数据库
Nacos 支持使用 MySQL 作为外置数据库,需要准备一个 MySQL 服务,版本要求为 5.6.5+ 。
-
为
Nacos创建库,使用conf/mysql-schema.sql文件初始化数据库表。 -
修改
conf/application.properties,开启数据库相关的配置,并配置为实际的数据库地址和账户信息。### Count of DB: db.num=1 ### Connect URL of DB: db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=username db.password.0=password ### 数据库连接池配置: hikariCP db.pool.config.connectionTimeout=30000 db.pool.config.validationTimeout=10000 db.pool.config.maximumPoolSize=20 db.pool.config.minimumIdle=2 -
重启
Nacos配置即生效。
三、权限校验
Nacos 默认没有开启权限校验,没有登录 api 接口依旧可以访问,需要手动配置权限。开启权限校验后,服务上需要配置 username 和 password 才可正常注册。
-
修改
conf/application.properties:设置
nacos.core.auth.enabled为true。nacos.core.auth.enabled=truenacos.core.auth.server.identity.key和nacos.core.auth.server.identity.value配置,将这两个配置项分别作为Header头的key和value,添加到Header可绕过权限校验。可以理解为一个自定义的固定
Token。nacos.core.auth.server.identity.key=serverIdentity nacos.core.auth.server.identity.value=security -
重启
Nacos配置即生效。 -
服务上需要添加
username和password两个配置项,否则将抛出 403 异常。本文使用的服务端版本为
2.1.2,nacos-client版本最开始使用的1.4.2出现了403异常,通过将nacos-client升级到2.0.3解决。Tips:但是升级版本后我又降回版本进行测试,该 403 问题又消失了,只记得的异常信息包含了
[check-update] get changed dataId error, code: 403。
四、context-path 配置
nacos 默认的 context-path 为 /nacos,通过配置这里更换路径前缀。
server.servlet.contextPath=/
修改后在服务的配置文件上也需要做对应的配置,否则将抛出 404 异常。
spring.cloud.nacos.discovery.context-path配置idea可能会有黄色提示,但是这部分配置是会生效的,且不可缺失。
spring:
cloud:
nacos:
discovery:
context-path: /
config:
context-path: /
五、配置启动内存
Nacos 单机启动时内存配置默认为 -Xms512m -Xmx512m -Xmn256m,集群启动时内存默认配置为 -Xms2g -Xmx2g -Xmn1g。
打开 bin/startup.sh 文件,定位到 86-97 行这段区间:
if [[ "${MODE}" == "standalone" ]]; then
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
if [[ "${EMBEDDED_STORAGE}" == "embedded" ]]; then
JAVA_OPT="${JAVA_OPT} -DembeddedStorage=true"
fi
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
fi
六、1.x与2.x区别
服务端:
Nacos 1.x 占用了两个端口:
8848端口,可通过server.port配置,提供Web管理端访问,客户端模块通过该端口进行服务注册和配置同步;7848端口,对8848端口-1000得到端口号,是Nacos集群通信的端口,用于节点选举来确定集群主节点。
Nacos 2.x 额外占用了两个端口:
9848端口,对8848端口+1000得到端口号,是客户端gRPC请求的端口,用于客户端向Nacos发起连接和请求;9849端口,对8848端口+1001得到端口号,是NacosgRPC请求方式进行集群通信的端口,用于Nacos集群间数据同步。
Nacos单机模式启动时依旧要占用7848和9849两个端口,让我不是很能理解。
客户端:
Nacos 1.x 通过 Http 方式(8848 端口)与服务端进行通信,2.x 的服务端向下兼容到 1.x 的客户端。
Nacos 2.x 也需要通过 Http 方式(8848 端口)与服务端进行通信,但只用于权限校验等操作,主要功能通过 gRPC 方式(9848 端口)与服务端进行通信,不能向下兼容到 1.x 的服务端。
对于客户端访问而言,如果客户端是
1.x版本仅需要开通8848端口,如果是2.x版本需要增加开通9848端口。
七、我的 Maven 配置
在使用 Nacos 前我使用的 SpringBoot 2.3.12.RELEASE 和 Spring Cloud Hoxton.SR12,在全局父 pom.xml 配置如下:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
-
全局父
pom.xml添加配置:<dependencyManagement> <dependencies> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.7.RELEASE</version> <type>pom</type> <scope>import</scope> </dependencies> </dependencyManagement>导入
Spring Cloud Alibaba依赖不是必须,可直接指定Nacos依赖的版本为2.2.7.RELEASE -
使用
Nacos客户端的微服务模块的pom.xml添加如下配置:<dependencies> <!-- 配置中心 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!-- 注册中心 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>