赞
踩
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
Nacos 支持三种部署模式:单机模式、集群模式和多集群模式。在实践中,我们往往习惯用单机模式快速构建一个 Nacos 开发/测试环境,而在生产中,出于高可用的考虑,一定需要使用 Nacos 集群部署模式。多集群模式一般用于多数据中心场景。
直连模式是比较容易理解的,也是最简单的部署方式了,如下图所示:
采用直连模式后,典型的开发场景配置如下:
server-addr: 192.168.10.128:8848,192.168.10.129:8848,192.168.10.130:8848
这种方式优点是部署比较简单、很直观。但是这种方式有很大的弊端,就是扩缩容、或者调整IP、机器置换、集群迁移等场景下,所有的应用都需要修改配置,很不灵活,生产环境不推荐。
直连模式分析:
VIP(Virtual IP) 模式可以很好的解决直连模式 IP 变化所带来的应用批量修改的问题。什么是 VIP 呢?
VIP是指虚拟IP,VIP的叫法来自阿里内部。
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
其实VIP模式也存在可读性问题,例如VIP的ip发生了变化,也需要修改应用代码,这种情况下最好给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 cases.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: cases.nacos.com:8848
模式分析
地址服务器是什么?顾名思义,是用来寻址地址的服务器,发送一个请求,返回一串地址列表。如下图所示:
注:简单来说,就是一个后端服务,包含一个返回服务器IP地址的接口,通过这个接口可以获取到定义的服务器IP.
如下示例代码:
- @Controller
- public class AddressServerController {
- @RequestMapping("/cases/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 的变化,进而及时更新地址列表。如下图所示:
模式分析
我采用VIP+域名模式进行搭建Nacos2.0.3 三节点的高可用集群。
环境要求:
系统 | 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 |
在对应的服务器上拉取镜像
- docker pull nacos/nacos-server:2.0.3
- docker pull nginx:1.20.1
以192.168.10.128为例:
新建目录(可以自定义) 若干 :
mkdir /data/nacos-docker/ -p
mkdir /data/nacos-docker/env/ -p
mkdir /data/nacos-docker/init.d/ -p
新建docker-compose-nacos.yaml文件,内容如下:
- version: "3"
- services:
- nacos:
- hostname: nacos
- image: nacos/nacos-server:2.0.3
- container_name: bdyh-nacos
- privileged: true
- networks:
- - pknet
- volumes:
- - ./cluster-logs:/home/nacos/logs
- - ./init.d/custom.properties:/home/nacos/init.d/custom.properties
- ports:
- - "7848:7848"
- - "8848:8848"
- - "9848:9848"
- - "9555:9555"
- - "9849:9849"
- env_file:
- - ./env/nacos-ip.env
- restart: on-failure
- networks:
- pknet:
- external: true
注:其中端口 7848、8848、9848、9849是必须要开放的端口,8848是web页面端口,7848是集群数据同步接口,9848、9849是nacos 2.0.0以上的版本必须开发的端口。
新版本部署
Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。新增端口是在配置的主端口(server.port)基础上,进行一定偏移量自动生成。
端口 | 与主端口的偏移量 | 描述 |
---|---|---|
9848 | 1000 | 客户端gRPC请求服务端端口,用于客户端向服务端发起连接和请求 |
9849 | 1001 | 服务端gRPC请求服务端端口,用于服务间同步等 |
客户端拥有相同的计算逻辑,用户如同1.X的使用方式,配置主端口(默认8848),通过相同的偏移量,计算对应gRPC端口(默认9848)。因此如果客户端和服务端之前存在端口转发,或防火墙时,需要对端口转发配置和防火墙配置做相应的调整。
pknet是docker自定义的网络:
此处的10.139可以自定义,不冲突即可
sudo docker network create --driver bridge --subnet 10.139.0.0/16 --gateway 10.139.0.1 pknet
在/data/nacos-docker/env/目录下新建nacos-ip.env文件,内容如下:
- #nacos dev env
- #如果支持主机名可以使用hostname,否则使用ip,默认也是ip
- PREFER_HOST_MODE=ip
- MODE=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端口,不写默认就是8848
- NACOS_APPLICATION_PORT=8848
- #数据源平台 仅支持mysql或不保存empty
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=192.168.10.131
- MYSQL_SERVICE_DB_NAME=caseRetrieval-config
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=bdyh@2020
- MYSQL_DATABASE_NUM=1
- #JVM调优参数
- JVM_XMS=2g
- JVM_XMX=2g
- JVM_XMN=2g
- JVM_MS=128m
- JVM_MMS=320m
注:NACOS_SERVER_IP=192.168.10.128,需对应调整为部署机器的ip,mysql数据源自行调整
在/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 prometheus
- management.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文件中对应的路径即可):
利用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即可。
在192.168.10.127上部署nginx
新建目录若干:
mkdir -p /data/nginx
mkdir -p /data/nginx/conf/
mkdir -p /data/nginx/conf.d
mkdir -p /data/nginx/log
在/data/nginx目录下新建docker-compose-nginx.yml文件,内容如下:
- version: '3.7'
-
- services:
- nginx:
- image: nginx:1.20.1
- container_name: bdyh-nginx
- restart: always
- environment:
- TZ: Asia/Shanghai
- volumes:
- - /data/nginx/log:/var/log/nginx
- - /data/nginx/conf.d:/etc/nginx/conf.d
- - /data/nginx/conf/nginx.conf:/etc/nginx/nginx.conf
- ports:
- - "80:80"
- networks:
- - pknet
- networks:
- 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 cases.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 << EOF
- 192.168.10.127 cases.nacos.com
- EOF
192.168.10.127:8848/nacos/
server-addr: cases.nacos.com:8848
可以关闭双写,从而释放性能,具体的关闭方式是通过API进行:
curl -X PUT 'localhost:8848/nacos/v1/ns/operator/switches?entry=doubleWriteEnabled&value=false'
关闭后可以从logs/naming-server.log
日志中观察到Disable Double write, stop and clean v1.x cache and features
字样。说明关闭双写。
如果这篇文章对您有帮助或者有所启发的话,请帮忙点赞、转发,您的支持是我坚持更新的最大动力。
最后,欢迎关注架构至美微信公众号,查看历史文章,希望我的文章可以给您带来收获,哪怕只是一点点。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。