Nacos集群架构
1.nacos部署说明
nacos支持三种部署方式:
- 单机模式 - 用于测试和单机试用
- 集群模式 - 用于生产环境,确保高可用
- 多集群模式 - 用于多数据中心场景
集群部署架构:https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
架构图:
部署生成使用的集群模式
具体拆分
2.nacos集群配置
使用虚拟机进行伪集群部署,将nacos复制3份
分别修改conf/application.properties中的启动端口为3333,4444,5555
server.port=3333/4444/5555
修改启动内存(虚拟机内存不够),在bin/startup.sh中
修改cluster.conf,这里它的原始名称为:cluster.conf.example,我们需要把它保留同时复制出一个cluster.conf来进行更改
192.168.56.10:3333 192.168.56.10:4444 192.168.56.10:5555
持久化配置
Nacos默认自带嵌入式数据库derby,所以我们每次创建一个Nacos实例就会有一个derby,当有多个Nacos节点的时候,就会出现一致性问题,所以Nacos支持了外部数据库统一数据管理MySql。
derby切换到mysql,具体配置方式可以参考官网:https://nacos.io/zh-cn/docs/deployment.html
1.我们需要找到Nacos安装目录下的conf目录中的Sql脚本,然后在数据库中进行执行
注意:需要我们先创建好数据库并且使用: CREATE DATABASE nacos_config; USE nacos_config;
2.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
#注意:这里需要注意几个点,一个是url地址需要改,另外数据库的用户和密码也需要更改,同时还有一个是官网上在#db.url.0=jdbc:mysql**这个属性上少了一个属性为**serverTimezone=UTC**需要我们手动添加 spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&serverTimezone=UTC db.user=root db.password=root
测试:重启Nacos服务,此时之前所创建的Namespace+Group+DataID将全部消失,因为这些数据是保存在之前Nacos内嵌的derby数据库中,现在使用的是本地的MySql数据库,此时我们可以添加配置测试,在查看数据库nacos_config中的config_info表,此时就会有新添加的配置内容。并且在集群管理有多个节点列表
此时我们nacos集群已经搭建完成,但是我们对外提供服务的时候应该只要暴露一个地址即可,我们可以在nacos上层在搭建一个nginx
nginx.conf中添加如下配置:
# upstream千万不要有下划线,不然无法转发 upstream nacoscluster { server 192.168.56.10:3333; server 192.168.56.10:4444; server 192.168.56.10:5555; } server { listen 1111; server_name localhost; location / { proxy_pass http://nacoscluster; } error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } }
启动nginx:nginx -c nginx.conf
3.服务注册到集群
将之前的yml文件中server-addr修改为nginx地址
server: port: 9002 spring: application: name: nacos-provider cloud: nacos: discovery: # 换成nginx的地址 server-addr: http://192.168.56.10:1111 management: endpoints: web: exposure: include: '*'
我本地不知道为什么换成nginx地址后启动异常:
使用官网提供的命令测试又是可以的 curl -X POST 'http://192.168.56.10:1111/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080' curl -X GET 'http://192.168.56.10:1111/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName' curl -X POST "http://192.168.56.10:1111/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld" curl -X GET "http://192.168.56.10:1111/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"