3-CloudAlibaba
-Nacos
(集群)学习笔记2020.10.19
前言: (官网)
生产环境都是要保证高可用, 所以需要搭建
Nacos
集群, 来保证不会由于只有一个注册中心情况下挂了, 整个微服都出现问题, 由于Nacos
默认使用的是内置嵌入式数据库derby
, 如果搭建集群会出现数据一致性问题, 每个Nacos
中数据库数据都不同。所以需要使用自定义
MySQL
数据库, 目前也仅支持MySQL
。 (前面笔记1-注册中心中配置过自定义数据库进行持久化配置)从官网上的集群部署架构图上看, 推荐模式是域名 + VIP模式,可读性好,而且换ip方便;
类似
nginx
模式, 请求发送到nginx
由nginx
转发到具体的nacos
。
需要3个
Nacos
+MySQL
, 参考官网的docker
的集群方式。
1.0 docker
方式启动nacos
集群
1.1 根据之前下载好的镜像启动集群方式容器 (并自定义MySQL
数据库)
我这里3个
nacos
都是在同一个机子上面, 正常的环境是部署在不同的服务器, 通过外网连接的。Docker创建容器时默认采用bridge网络,自行分配
ip
,不允许自己指定, 所以我需要自己创建一个网络组才能自定义指定IP
。docker network create -d bridge --subnet=172.18.0.0/16 --gateway=172.18.0.1 自定义名称
1.2 启动假设nacos
容器机子1 (由于机子内存小所以指定了jvm内存)
[root@VM-0-9-centos ~]# docker run -id --name zhihai_nacos-1 --network zhihao --ip 172.18.0.5 -e MODE=cluster -e NACOS_SERVERS="172.18.0.5:8848 172.18.0.6:8848 172.18.0.7:8848" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=172.17.0.1 -e MYSQL_SERVICE_PORT=3307 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=root -e JVM_XMS=128m -e JVM_XMX=128m -e JVM_XMN=64m -p 8848:8848 (镜像ID)
我这里使用的是同一个机子, 所以使用到了指定网络组
--network zhihao
、与--ip 172.17.0.5
指定了容器IP, 正式环境部署机子在不同地方是不需要的, 并且由于我nacos
三个服务使用了自定义网络组, 无法通过MySQL
容器IP
去访问了, 换一种通过bridge
网络的网关IP172.17.0.1
或者直接公网IP
去访问部署在bridge
网络的数据库。
-e MODE=cluster
表示是集群模式启动。
-e NACOS_SERVERS="172.17.0.5:8848 172.17.0.6:8848 172.17.0.7:8848"
指定集群机子的IP与端口, 正式部署不同机子的情况下是外网, 例如: 119.xxxx:8848 119.xxxx:8848 119.xxxx:8848 只是IP不同。
1.3 启动假设nacos
容器假设机子2
[root@VM-0-9-centos ~]# docker run -id --name zhihai_nacos-2 --network zhihao --ip 172.18.0.6 -e MODE=cluster -e NACOS_SERVERS="172.18.0.5:8848 172.18.0.6:8848 172.18.0.7:8848" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=172.17.0.1 -e MYSQL_SERVICE_PORT=3307 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=root -e JVM_XMS=128m -e JVM_XMX=128m -e JVM_XMN=64m -p 8849:8848 (镜像ID)
1.4 启动假设nacos
容器假设机子3
[root@VM-0-9-centos ~]# docker run -id --name zhihai_nacos-3 --network zhihao --ip 172.18.0.7 -e MODE=cluster -e NACOS_SERVERS="172.18.0.5:8848 172.18.0.6:8848 172.18.0.7:8848" -e SPRING_DATASOURCE_PLATFORM=mysql -e MYSQL_SERVICE_HOST=172.17.0.1 -e MYSQL_SERVICE_PORT=3307 -e MYSQL_SERVICE_DB_NAME=nacos -e MYSQL_SERVICE_USER=root -e MYSQL_SERVICE_PASSWORD=root -e JVM_XMS=128m -e JVM_XMX=128m -e JVM_XMN=64m -p 8850:8848 (镜像ID)
全部启动完成后, 进行访问机子1的地址
http://公网IP:8848/nacos
。然后点菜单的集群管理, 看到如下界面说明配置成功。
2.0 进行测试
进行注册测试, 重现突然其中一个注册中心节点挂了的情况下, 微服是否还能正常调用。
2.1 应用中的application.yml
server:
port: 8080
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
# 配置Nacos地址 (集群情况下也是只需要指定一个, nacos会将注册进去的服务, 自动同步到集群的nacos)
server-addr: 119.xx.xxx.xxx:8848
2.2 启动应用,注册上去
然后在菜单服务管理中可以看到, 并且访问其他节点的
nacos
中的服务管理也可以看到注册上去的服务
[[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pjkvT92h-1603175522565)(https://s1.ax1x.com/2020/10/19/0x6iOx.jpg)]
这个时候服务之间是可以正常调用的。
2.3 假设突然nacos-1
注册中心突然挂了
这个时候, 8848管理界面已经无法访问。
继续进行服务之间的正常调用, 发现是没有受到影响, 服务之间是可以继续进行调用的。
到此我们就配置完成官网说的
直连ip模式,机器挂则需要修改ip才可以使用
如果配置错误或者想换IP
什么的, 需要删除容器重新创建。
3.0 搭配nginx
进行转发(推荐方式)
也就是官网说的挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好
与 penAPI 域名 + VIP模式,可读性好,而且换ip方便,推荐模式
3.1 增加nginx
的nginx.conf
转发规则配置文件
我这里早在之前就已经配置好目录挂载的
nginx
#upstream的负载均衡 (公网方式)
upstream myNacosServices {
server 119.xx.xx.xxx:8848;
server 119.xx.xx.xxx:8848;
server 119.xx.xx.xxx:8848;
}
server {
# 监听端口
listen 8868 default_server;
#域名可以有多个,用空格隔开 (PS: 域名 + VIP模式需要自己购买域名, 这里使用挂载VIP模式)
server_name localhost;
# / 拦截访问/** 后面所有请求转发
location / {
#proxy_pass 指定负载均衡名称
proxy_pass http://myNacosServices/;
}
}
配置完毕, 重启
nginx
容器, (PS我nginx
也是部署在docker上面),所以需要开放容器访问端口 :8868
然后通过
nginx
去访问nacos
管理界面: http://119.xx.xxx.xxx:8868/nacos 能访问到说明配置欧克。
3.2 修改应用中的application.yml
server:
port: 8080
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
# 配置Nacos地址, 配置为访问刚才刚刚配置好的nginx规则与监听端口
server-addr: 119.xx.xxx.xxx:8868
启动注册服务上去, 然后进行查看服务管理是否存在, 并重复一套流程测试, 没有问题说明一切正常,
到此就配置完成。
1