1. docker-compose.yml
version: "3"
services:
nacos:
hostname: nacos # 域名
container_name: nacos # 容器名
image: nacos/nacos-server:v2.2.3 # 镜像版本,高版本目前没研究,一般会报错
volumes: # 数据卷,这里主要指定了 日志 和 配置文件的同步
- ./application.properties:/home/nacos/conf/application.properties
- /opt/docker/nacos/logs/:/home/nacos/logs
ports: # 端口映射规则:宿主机ip:容器ip
- 1061:8848 # 这个是 UI 页面的端口
- 2061:9848 # 这个是 客户端访问的端口,需要配置为上一个端口的 + 1000
- 2062:9849 # 这个是 服务端访问使用的端口,需要配置为上一个端口 + 1
environment:
- PREFER_HOST_MODE=hostname # 运行模式:主机名,如果使用 ip 不需要此项
- MODE=standalone # 单机运行
- JVM_XMS=128M # 启动时堆内存分配大小
- JVM_XMX=128M # 运行时堆内存分配上限
- JVM_XMN=64M # 新生代的内存大小(建议为上限的 20% - 50%)
这里需要注意数据卷中,第一个文件是覆盖容器内的配置文件,我们可以在这个文件里配置自己想要的配置,具体参考下方
2. application.properties
# WEB 服务器的相关配置
server.servlet.contextPath=${SERVER_SERVLET_CONTEXTPATH:/nacos}
server.contextPath=/nacos
server.port=${NACOS_APPLICATION_PORT:8848}
server.tomcat.accesslog.max-days=30
server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}i %{Request-Source}i
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
server.error.include-message=ALWAYS
server.tomcat.basedir=file:.
# 跳过验证的请求
nacos.security.ignore.urls=${NACOS_SECURITY_IGNORE_URLS:/,/error,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/**,/v1/console/health/**,/actuator/**,/v1/console/server/**}
# 启动数据持久化模式
spring.sql.init.platform=mysql
# 数据库的数量
db.num=1
# 数据库连接
db.url.0=jdbc:mysql://mysql:3306/nacos
# 账号
db.user.0=nacos
# 密码
db.password.0=nacos
# 指定了 CMDB 数据的转储任务间隔,单位为秒
nacos.cmdb.dumpTaskInterval=3600
# 指定了 CMDB 事件任务的间隔,单位为秒
nacos.cmdb.eventTaskInterval=10
# 指定了 CMDB 标签任务的间隔,单位为秒
nacos.cmdb.labelTaskInterval=300
# 指定了在启动时是否加载 CMDB 数据的设置
nacos.cmdb.loadDataAtStart=false
# 开启鉴权
nacos.core.auth.enabled=true
# 授权系统,目前仅支持 nacos 或 ldap
nacos.core.auth.system.type=nacos
# 授权系统为 nacos 时的令牌过期时间
nacos.core.auth.plugin.nacos.token.expire.seconds=18000
# 鉴权插件用于生成用户登陆临时 accessToken 所使用的密钥,《随便写大于32个字符》
nacos.core.auth.plugin.nacos.token.secret.key=V1ZWb1YyRkhTblJhUkU1aFZqSjRORmxXWkVka1ZuQXpVRlF3UFE9PQ==
# 服务端的身份标识密钥,《随便写大于32个字符》
nacos.core.auth.server.identity.key=V1ZWb1YyRkhTblJhUkU1aFZqSjRORmxXWkVka1ZuQXpVRlF3UFE9PQ==
# 服务端的身份标识值,《随便写大于32个字符》
nacos.core.auth.server.identity.value=V1ZWb1YyRkhTblJhUkU1aFZqSjRORmxXWkVka1ZuQXpVRlF3UFE9PQ==
# 是否启用身份认证缓存
nacos.core.auth.caching.enabled=false
# 是否启用用户代理(User-Agent)的身份认证白名单机制
nacos.core.auth.enable.userAgentAuthWhite=false
# 禁用将指标导出到 elasticsearch
management.metrics.export.elastic.enabled=false
# 禁用将指标导出到 influxDB
management.metrics.export.influx.enabled=false
# 分发任务的线程数量
nacos.naming.distro.taskDispatchThreadCount=10
# 分发任务的周期,单位为毫秒
nacos.naming.distro.taskDispatchPeriod=200
# 批量同步键的数量
nacos.naming.distro.batchSyncKeyCount=1000
# 节点启动时从其他节点同步数据的比例。如果设置为0.9,则表示节点启动时将尝试从其他节点同步90%的数据
nacos.naming.distro.initDataRatio=0.9dx
该文件笔者是从容器内部拷贝出来,并且做了修改以及没响配置的注释,主要是数据库的配置和鉴权的配置
3. pom.xml
在 springboot 项目中引入对应的客户端版本
<!-- Nacos 客户端 -->
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-client</artifactId>
<version>2.2.3</version>
</dependency>
4. bootstrap.yml
配置相关的连接信息
# spring.cloud.nacos.username: 账号
# spring.cloud.nacos.password: 密码
# spring.cloud.nacos.discovery.server-addr: 注册中心地址
# spring.cloud.nacos.discovery.namespace: 注册中心命名空间,默认:public
# spring.cloud.nacos.discovery.group: 注册中心分组,默认:DEFAULT_GROUP
# spring.cloud.nacos.config.server-addr: 配置中心地址
# spring.cloud.nacos.config.namespace: 配置中心命名空间,默认:public
# spring.cloud.nacos.config.group: 配置中心分组,默认:DEFAULT_GROUP
# spring.cloud.nacos.config.file-extension: 配置文件后缀名
# spring.cloud.nacos.config.shared-configs: 配置中心的共享配置,主要如通用数据库等
# spring.cloud.nacos.config.extension-configs: 配置中心的扩展配置,常用于特殊处理,覆盖一些专有配置
spring:
cloud:
nacos:
username: nacos
password: nacos
discovery:
server-addr: 192.168.200.101:1061
config:
server-addr: ${spring.cloud.nacos.discovery.server-addr}
file-extension: yml
shared-configs:
- data-id: common-config.yml
refresh: true
5. 常见问题
5.1. 未开启鉴权,客户端连接不上
我们从 2.1 一下的版本升级到 2.2 之后,往往会出现上方的错误
这是因为鉴权配置没配,需要我们奖鉴权配上,主要配置如下
# 开启鉴权
nacos.core.auth.enabled=true
# 授权系统,目前仅支持 nacos 或 ldap
nacos.core.auth.system.type=nacos
# 鉴权插件用于生成用户登陆临时 accessToken 所使用的密钥,《随便写大于32个字符》
nacos.core.auth.plugin.nacos.token.secret.key=V1ZWb1YyRkhTblJhUkU1aFZqSjRORmxXWkVka1ZuQXpVRlF3UFE9PQ==
# 服务端的身份标识密钥,《随便写大于32个字符》
nacos.core.auth.server.identity.key=V1ZWb1YyRkhTblJhUkU1aFZqSjRORmxXWkVka1ZuQXpVRlF3UFE9PQ==
# 服务端的身份标识值,《随便写大于32个字符》
nacos.core.auth.server.identity.value=V1ZWb1YyRkhTblJhUkU1aFZqSjRORmxXWkVka1ZuQXpVRlF3UFE9PQ==
5.2. Server check fail, please check server 9848
springboot 项目在连接 nacos 服务器时,出现上方的错误,端口找不到
这是因为新版的 nacos grpc 连接时默认的端口 是在配置端口的基础上向上偏移1000 的端口,即我们配置了 8848,他会寻找 9848 端口进行连接,如果我们的 docker 没有开放这个端口亦或者防火墙没有开放该端口,程序就会报错
我们可以在容器启动时,放开这个端口,同时服务器防火墙放开这三个端口
ports: # 端口映射规则:宿主机ip:容器ip
- 1061:8848 # 这个是 UI 页面的端口
- 2061:9848 # 这个是 客户端访问的端口,需要配置为上一个端口的 + 1000
- 2062:9849 # 这个是 服务端访问使用的端口,需要配置为上一个端口 + 1