Spring Cloud Alibaba-搭建生产可用的Nacos集群

docker启动容器指令

docker 使用mysql数据库启动
1.x版本

docker run -it -e MODE=standalone \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_MASTER_SERVICE_HOST=192.168.100.169 \
-e MYSQL_MASTER_SERVICE_DB_NAME=nacos_config \
-e MYSQL_MASTER_SERVICE_PORT=3306 \
-e MYSQL_MASTER_SERVICE_USER=root \
-e MYSQL_MASTER_SERVICE_PASSWORD=Password1 \
-v /home/docker/nacos/logs:/home/nacos/logs \
--restart=always \
--name nacos -p 8848:8848 nacos/nacos-server

2.x版本

  1. 修改配置文件内容
# spring
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
spring.datasource.platform=mysql
nacos.cmdb.dumpTaskInterval=3600
nacos.cmdb.eventTaskInterval=10
nacos.cmdb.labelTaskInterval=300
nacos.cmdb.loadDataAtStart=false
db.num=${MYSQL_DATABASE_NUM:1}
db.url.0=jdbc:mysql://<ip>:<port>/<db>?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false
#db.url.1=jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT:3306}/${MYSQL_SERVICE_DB_NAME}?${MYSQL_SERVICE_DB_PARAM:characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useSSL=false}
db.user=root
db.password=123456
### The auth system to use, currently only 'nacos' and 'ldap' is supported:
nacos.core.auth.system.type=${NACOS_AUTH_SYSTEM_TYPE:nacos}
### worked when nacos.core.auth.system.type=nacos
### The token expiration in seconds:
nacos.core.auth.plugin.nacos.token.expire.seconds=${NACOS_AUTH_TOKEN_EXPIRE_SECONDS:18000}
### The default token:
nacos.core.auth.plugin.nacos.token.secret.key=${NACOS_AUTH_TOKEN:SecretKey012345678901234567890123456789012345678901234567890123456789}
### Turn on/off caching of auth information. By turning on this switch, the update of auth information would have a 15 seconds delay.
nacos.core.auth.caching.enabled=${NACOS_AUTH_CACHE_ENABLE:false}
nacos.core.auth.enable.userAgentAuthWhite=${NACOS_AUTH_USER_AGENT_AUTH_WHITE_ENABLE:false}
nacos.core.auth.server.identity.key=${NACOS_AUTH_IDENTITY_KEY:serverIdentity}
nacos.core.auth.server.identity.value=${NACOS_AUTH_IDENTITY_VALUE:security}
server.tomcat.accesslog.enabled=${TOMCAT_ACCESSLOG_ENABLED:false}
# default current work dir
server.tomcat.basedir=file:.
## spring security config
### turn off security
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/**}
# metrics for elastic search
management.metrics.export.elastic.enabled=false
management.metrics.export.influx.enabled=false
nacos.naming.distro.taskDispatchThreadCount=10
nacos.naming.distro.taskDispatchPeriod=200
nacos.naming.distro.batchSyncKeyCount=1000
nacos.naming.distro.initDataRatio=0.9
nacos.naming.distro.syncRetryDelay=5000
nacos.naming.data.warmup=true
docker run -d -v /root/nacos/conf/application.properties:/home/nacos/conf/application.properties -v /root/nacos/logs:/home/nacos/logs --privileged=true --restart=always --name nacos -p 8848:8848 -p 9848:9848 -e MODE=standalone nacos/nacos-server


搭建生产可用的Nacos集

  • 本节详细探讨如何搭建一个生产可用的Nacos集群。讨论的内容主要包括:使用MySQL作为存储持久化数据,以及如何搭建Nacos集群。

安装MySQL数据库

  • 生产环境需使用MySQL作为后端存储,因此需要搭建MySQL。生产中,MySQL建议至少主备模式,高可用MySQL更佳。
  • 高可用MySQL的搭建可参考:https://blog.csdn.net/jx_jy/article/details/80165584
  • 注意:Nacos支持的MySQL版本为:5.6.5+

导入初始化脚本

  • 找到 conf/nacos-mysql.sql ,将其导入到数据库中。

配置数据库连接

  • 找到 conf/application.properties ,添加如下内容:
# 表明用MySQL作为后端存储
spring.datasource.platform=mysql
db.num=1

# MySQL JDBC地址
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
# 数据库账号
db.user=nacos
# 数据库密码
db.password=nacos

部署架构图

  • 下图是来自Nacos官方的部署架构图:

    图片

主机规划

节点 端口
127.0.0.1 8848
127.0.0.1 8849
127.0.0.1 8850

复制三份Nacos安装包,将 conf/application.properties 中的
 server.port=8848
 改为
 server.port=8848
 server.port=8849
 server.port=8850

开始搭建

  • 找到 conf/cluster.conf.example ,将其改名为 conf/cluster.conf ,并将内容改为类似如下,即:以ip:端口 的形式列出Nacos集群中所有实例的地址列表
# ip:port
  127.0.0.1:8848
  127.0.0.1:8849
  127.0.0.1:8850

  • 启动所有Nacos实例

配置代理服务器

  • 安装NGINX并启动
  • 为NGINX添加如下配置(对于Linux操作系统,如在安装NGINX时未自定义目录,则可在 /etc/nginx/conf.d 新建文件,命名为 nacos.conf ,内容如下;同时删除 default.conf 即可):
  upstream nacos {
  server 127.0.0.1:8848;
  server 127.0.0.1:8849;
  server 127.0.0.1:8850;
}

server {
  listen 80;
  server_name  localhost;
  location /nacos/ {
    proxy_pass http://nacos/nacos/;
  }
}

测试

优化&最佳实践

  • 实际项目中,建议为Nacos绑定一个域名,这样即使未来有迁移Nacos的需求,客户端也无需修改配置
  • 本文为了演示方便,将所有Nacos实例都部署在了一台机器中;实际项目中,请将Nacos部署在不同机器中,从而实现更好的容灾与隔离

nacos配置详情

# 如果选择固定Ip注册可以配置
spring.cloud.nacos.discovery.ip = 10.2.11.11
spring.cloud.nacos.discovery.port = 9090

# 如果选择固定网卡配置项
spring.cloud.nacos.discovery.networkInterface = eth0

# 如果想更丰富的选择,可以使用spring cloud 的工具 InetUtils进行配置
# 具体说明可以自行检索: https://github.com/spring-cloud/spring-cloud-commons/blob/master/docs/src/main/asciidoc/spring-cloud-commons.adoc
spring.cloud.inetutils.default-hostname
spring.cloud.inetutils.default-ip-address
spring.cloud.inetutils.ignored-interfaces[0]=eth0 	# 忽略网卡,eth0
spring.cloud.inetutils.ignored-interfaces=eth.* 	# 忽略网卡,eth.*,正则表达式
spring.cloud.inetutils.preferred-networks=10.34.12 	# 选择符合前缀的IP作为服务注册IP
spring.cloud.inetutils.timeout-seconds
spring.cloud.inetutils.use-only-site-local-interfaces
#————————————————
spring.cloud.nacos.discovery.server-addr  #Nacos Server 启动监听的ip地址和端口
spring.cloud.nacos.discovery.service  #给当前的服务命名
spring.cloud.nacos.discovery.weight  #取值范围 1 到 100,数值越大,权重越大
spring.cloud.nacos.discovery.network-interface #当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
spring.cloud.nacos.discovery.ip  # 优先级最高
spring.cloud.nacos.discovery.port  # 默认情况下不用配置,会自动探测
spring.cloud.nacos.discovery.namespace # 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

spring.cloud.nacos.discovery.access-key  # 当要上阿里云时,阿里云上面的一个云账号名
spring.cloud.nacos.discovery.secret-key # 当要上阿里云时,阿里云上面的一个云账号密码
spring.cloud.nacos.discovery.metadata    #使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
spring.cloud.nacos.discovery.log-name   # 日志文件名
spring.cloud.nacos.discovery.enpoint   # 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
ribbon.nacos.enabled  # 是否集成Ribbon 默认为true

参考文档

Q.E.D.


爱调味品的大哥