
【摘要】基于Docker实现Nacos2.0.3版本三节点高可用集群的搭建。
一、Naocs简介
Nacos
致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
二、Nacos部署方式
Nacos 支持三种部署模式:单机模式
、集群模式
和多集群模式
。在实践中,我们往往习惯用单机模式快速构建一个 Nacos 开发/测试环境,而在生产中,出于高可用的考虑,一定需要使用 Nacos 集群部署模式。多集群模式一般用于多数据中心场景。
三、Nacos部署方式对比
3.1 直连模式
直连模式是比较容易理解的,也是最简单的部署方式了,如下图所示:

采用直连模式后,典型的开发场景配置如下:
server-addr: 192.168.10.128:8848,192.168.10.129:8848,192.168.10.130:8848
这种方式优点是部署比较简单、很直观。但是这种方式有很大的弊端,就是扩缩容、或者调整IP、机器置换、集群迁移等场景下,所有的应用都需要修改配置,很不灵活,生产环境不推荐。
直连模式分析:
高可用性,集群本身的扩缩容必须要改动业务代码才能被感知到,出现节点故障需要紧急下线、紧急扩容等场景,让业务修改代码是不现实的,不符合高可用的原则;
可伸缩性,同上,可伸缩性不好;
架构简单,用户理解成本低;
有引入额外的组件,没有新增组件的运维成本;
3.2 VIP模式
VIP(Virtual IP)
模式可以很好的解决直连模式 IP 变化所带来的应用批量修改的问题,如下图所示:

那么什么是 VIP 呢?
VIP是指虚拟IP,VIP的叫法来自阿里内部,如下图所示:

Real Server:处理实际请求的后端服务器节点;
Director Server:指的是负载均衡器节点,负责接收客户端请求,并转发给 RS;
VIP:Virtual IP,DS 用于和客户端通信的 IP 地址,作为客户端请求的目标 IP 地址;
IP:DS 用于和内部 RS 通信的 IP 地址;
RIP:Real IP,后端服务器的 IP 地址;
CIP:Client IP,客户端的 IP 地址;
VIP模式
的好处就是帮助Nacos Client 屏蔽了后端 RIP,相对于 RIP 而言,VIP 很少会发生变化。以扩容场景为例,只需要让 VIP 感知到即可,Nacos Client 只需要关注 VIP,避免了扩容引起的代码改造。只要是具备负载均衡能力的组件,均可以实现 VIP 模式,如下所示:

例如用nginx来实现VIP模式,如下图所示:

nginx配置如下:
#配置nginx反向代理upstream nacos_server {server 192.168.10.128:8848 weight=1 max_fails=1 fail_timeout=10s;server 192.168.10.129:8848 weight=1 max_fails=1 fail_timeout=10s;server 192.168.10.130:8848 weight=1 max_fails=1 fail_timeout=10s;}server {listen 80;server_name nacos;location {proxy_pass http://nacos_server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header REMOTE-HOST $remote_addr;add_header X-Cache $upstream_cache_status;add_header Cache-Control no-cache;}}
开发场景配置如下:
server-addr: 192.168.10.127:8848

nginx配置如下:
#配置nginx反向代理upstream nacos_server {server 192.168.10.128:8848 weight=1 max_fails=1 fail_timeout=10s;server 192.168.10.129:8848 weight=1 max_fails=1 fail_timeout=10s;server 192.168.10.130:8848 weight=1 max_fails=1 fail_timeout=10s;}server {listen 80;server_name nacos.com;location {proxy_pass http://nacos_server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header REMOTE-HOST $remote_addr;add_header X-Cache $upstream_cache_status;add_header Cache-Control no-cache;}}
开发场景配置如下:
server-addr: nacos.com
模式分析如下:
高可用性。域名的可用性需要由 DNS 域名服务器负责,可用性保障较高;VIP 需要由高可用的负责均衡组件支持,且流量经过负载均衡转发,对 VIP 的实现有较高可用性的要求。
可伸缩性。水平扩缩容时,只需要让 VIP 感知即可,可伸缩性好。
依赖了域名解析系统和负载均衡系统,生产部署时,需要有配套设施的支持。
3.3 地址服务器模式
地址服务器是什么?顾名思义,是用来寻址地址的服务器,发送一个请求,返回一串地址列表。如下图所示:

注:简单来说,就是一个后端服务,包含一个返回服务器IP地址的接口,通过这个接口可以获取到定义的服务器IP
如下示例代码:
@Controllerpublic class AddressServerController {@RequestMapping("/nacos/serverlist")public ResponseEntity<String> serverlist() {return ResponseEntity.ok().header("Content-Type", "text/plain").body("192.168.10.128:8848\r\n" +"192.168.10.129:8848\r\n" +"192.168.10.130:8848\r\n");}}
使用地址服务器可以完成集群地址和客户端配置的解耦,解决直连模式中无法动态感知集群节点变化的问题。客户端根据地址服务器返回的列表,随后采取直连模式连接;并且在客户端启动后,会启动一个定时器,轮询感知 AddressServer 的变化,进而及时更新地址列表。如下图所示:

模式分析如下:
高可用性。域名的可用性需要由 DNS 域名服务器负责,可用性保障较高;地址服务器的职责单一,有较高的可用性;运行时 Client 直连 Nacos Server 节点,可用性靠 nacos-sdk 保障。
可伸缩性。水平扩缩容时,只需要让地址服务器感知即可,可伸缩性好。
依赖了域名解析系统和地址服务器,生产部署时,需要有配套设施的支持。
四、Nacos实战
采用Nginx
+域名模式
进行搭建Nacos2.0.3
三节点的高可用集群。
4.1 环境要求
| 系统 | ip | 插件 |
| centos7 | 192.168.10.127 | docker、docker-compose、nginx |
| centos7 | 192.168.10.128 | docker、docker-compose、nacos |
| centos7 | 192.168.10.129 | docker、docker-compose、nacos |
| centos7 | 192.168.10.130 | docker、docker-compose、nacos |
4.2 拉取镜像
#在对应的服务器上拉取镜像docker pull nacos/nacos-server:2.0.3docker pull nginx:1.20.1
4.3 docker-compose部署nacos
#以192.168.10.128为例:#新建目录(可以自定义) 若干 :mkdir data/nacos-docker/ -pmkdir data/nacos-docker/env/ -pmkdir data/nacos-docker/init.d/ -p
#新建docker-compose-nacos.yaml文件,内容如下:version: "3"services:nacos:hostname: nacosimage: nacos/nacos-server:2.0.3container_name: bdyh-nacosprivileged: truenetworks:- pknetvolumes:- ./cluster-logs:/home/nacos/logs- ./init.d/custom.properties:/home/nacos/init.d/custom.propertiesports:- "7848:7848"- "8848:8848"- "9848:9848"- "9555:9555"- "9849:9849"env_file:- ./env/nacos-ip.envrestart: on-failurenetworks:pknet:external: true
4.4 新版本部署扩展
Nacos2.0
版本相比1.X新增了gRPC
的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。
| 端口 | 与主端口的偏移量 | 描述 |
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
| 9849 | 1000 | 服务端gRPC请求服务端端口,用于服务间同步等 |
注:客户端拥有相同的计算逻辑,用户如同1.X的使用方式,配置主端口(默认8848),通过相同的偏移量,计算对应gRPC端口(默认9848)。因此如果客户端和服务端之前存在端口转发,或防火墙时,需要对端口转发配置和防火墙配置做相应的调整。
4.5 自定义Docker网络
sudo docker network create --driver bridge --subnet 10.139.0.0/16 --gateway 10.139.0.1 pknet###说明:pknet是docker自定义的网络名称,此处的10.139可以自定义,不冲突即可
4.6 添加
Nacos的环境变量
在/data/nacos-docker/env/目录下新建nacos-ip.env文件,内容如下:
#nacos dev env#如果支持主机名可以使用hostname,否则使用ip,默认也是ipPREFER_HOST_MODE=ipMODE=cluster#多网卡情况下,指定ip或网卡NACOS_SERVER_IP=192.168.10.128#集群中其它节点[ip1:port ip2:port ip3:port]NACOS_SERVERS=192.168.10.128:8848 192.168.10.129:8848 192.168.10.130:8848#nacos的web端口,不写默认就是8848NACOS_APPLICATION_PORT=8848#数据源平台 仅支持mysql或不保存emptySPRING_DATASOURCE_PLATFORM=mysqlMYSQL_SERVICE_HOST=192.168.10.131MYSQL_SERVICE_DB_NAME=nacos-configMYSQL_SERVICE_PORT=3306MYSQL_SERVICE_USER=rootMYSQL_SERVICE_PASSWORD=123456MYSQL_DATABASE_NUM=1#JVM调优参数JVM_XMS=2gJVM_XMX=2gJVM_XMN=2gJVM_MS=128mJVM_MMS=320m
4.7 挂载nacos的配置文件
在/data/nacos-docker/init.d目录下新建custom.properties文件,内容如下:
#spring.security.enabled=false#management.security=false#security.basic.enabled=false#nacos.security.ignore.urls=/**#management.metrics.export.elastic.host=http://localhost:9200# metrics for prometheusmanagement.endpoints.web.exposure.include=*# metrics for elastic search#management.metrics.export.elastic.enabled=false#management.metrics.export.elastic.host=http://localhost:9200# metrics for influx#management.metrics.export.influx.enabled=false#management.metrics.export.influx.db=springboot#management.metrics.export.influx.uri=http://localhost:8086#management.metrics.export.influx.auto-create-db=true#management.metrics.export.influx.consistency=one#management.metrics.export.influx.compressed=true
目录结构如下(若是自定义,请注意修改docker-compose文件中对应的路径):

4.8 利用docker-compose编排nacos容器
docker-compose -p nacos -f docker-compose-nacos.yaml up -d
日志查看:
docker logs -f bdyh-nacos

注:192.168.10.128 192.168.10.129 192.168.10.129都是同样的部署方式,注意修改特定的机器IP即可。
4.9 利用nginx+域名的方式做负载均衡
#在192.168.10.127上部署nginx#新建目录若干:mkdir -p data/nginxmkdir -p data/nginx/conf/mkdir -p data/nginx/conf.dmkdir -p data/nginx/log
在/data/nginx目录下新建docker-compose-nginx.yml文件,内容如下:
version: '3.7'services:nginx:image: nginx:1.20.1container_name: bdyh-nginxrestart: alwaysenvironment:TZ: Asia/Shanghaivolumes:- data/nginx/log:/var/log/nginx- data/nginx/conf.d:/etc/nginx/conf.d- data/nginx/conf/nginx.conf:/etc/nginx/nginx.confports:- "80:80"networks:- pknetnetworks:pknet:external: true
在/data/nginx/conf/目录下新建nginx.conf文件,内容如下:
user root;worker_processes auto;error_log var/log/nginx/error.log warn;pid var/run/nginx.pid;events {worker_connections 1024;}http {include etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log var/log/nginx/access.log main;sendfile on;#tcp_nopush on;keepalive_timeout 65;#gzip on;include /etc/nginx/conf.d/*.conf;}
在/data/nginx/conf.d/目录下新建nacos-cluster.conf文件,内容如下:
#配置nginx反向代理upstream nacos_server {server 192.168.10.128:8848 weight=1 max_fails=1 fail_timeout=10s;server 192.168.10.129:8848 weight=1 max_fails=1 fail_timeout=10s;server 192.168.10.130:8848 weight=1 max_fails=1 fail_timeout=10s;}server {listen 80;server_name nacos.com;location / {proxy_pass http://nacos_server;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header REMOTE-HOST $remote_addr;add_header X-Cache $upstream_cache_status;add_header Cache-Control no-cache;}}
利用docker-compose编排nginx容器:
docker-compose -p nginx -f docker-compose-nginx.yml up -d
在需要访问nacos的机器上配置hosts地址:
cat >> /etc/hosts << EOF192.168.10.127 nacos.comEOF
五、访问Nacos控制台
浏览器访问:192.168.10.127:80/nacos/
六、服务注册
Spring Boot项目如下配置:spring:cloud:nacos:config:# 用nacos中的 命名空间(Namespace) 隔离不同的项目namespace: prod# 配置中心地址server-addr: nacos.comdiscovery:namespace: prod# 服务注册地址server-addr: nacos.com
七、关闭双写
关闭双写,从而释放性能,具体的关闭方式是通过API进行:
curl -X PUT 'localhost:8848/nacos/v1/ns/operator/switches?entry=doubleWriteEnabled&value=false'




