在微服务项目中,只部署一个Nacos, 就会面临一个问题。 那就是单点故障。 一旦发送单点故障,会导致整个微服务崩坏。 所以在生产环境中,是一定要搭建Nacos集群的。 一、集群结构图Nacos原始集群结构(官网提供): DNS:域名,其实指代的是一个Nacos客户端,在项目中就是任何一个使用Nacos的微服务。 SLB:负载均衡器,作用和SpringCloud中的Ribbon差不多。不过这里的SLB是对各个Nacos节点做负载均衡。 AZ:第三层的AZ就代表一个Nacos集群中的Nacos节点。 经由原始架构的启发,可以有如下的Nacos集群架构的具体实现: 架构解释: Nacos客户端:使用Nacos作配置中心或者注册中心的微服务项目。 Nginx:利用Nginx的反向代理和负载均衡完美实现原始架构图中的SLB(负载均衡器)。 Mysql集群:Nacos各个节点之间并不能直接通讯,所以可以把Nacos数据存储在Mysql中, 让所有节点从Mysql集群当中存取共享数据。之所以使用集群,是为了保证Mysql的高可用。 二、搭建集群 1) 明确目标需要的3个Nacos节点情况 节点部署ipportNacos1 192.168.137.129 8841 Nacos2 192.168.137.129 8843 Nacos3 192.168.137.129 8844 这里为了更方便的修改配置,三个Nacos节点都在Windows上配置好。 再使用finalShell(一种ssh工具),把已经配置好的三个Nacos节点分别上传到三台服务器上运行即可。 注意: 这里没有使用连续端口,因为Nacos2.0以后启动一个Nacos就会占用连续的两个端口。 如果使用连续的端口,当启动第二个Nacos集群节点时,会报如下错误: Address already in use: bind而Nacos1.0到Nacos2.0之间的版本,则可以使用连续的端口号。 2) 下载和解压Nacos https://github.com/alibaba/nacos/releases在releases页面往下拖一点,每个发布版本的最后就有对应Linux和Windows的对应安装包。 这里就以2022年8月8号发布的最新版2.11版本为例子。 下载完成后解压安装包: 虽然是Linux环境下的安装包。但是在Windows下仍然可以解压。 并且Linux环境下的安装包和Windows环境下的安装包目录结构完全一致。 其实也很容易理解,就像在Linux和Windows下运行同一个SpringBoot项目。 SpringBoot项目的结构是一样的。 小技巧: 基于上面的特点,我们可以使用任意安装包,在Windows下完成配置,再上传到Linux下运行。 3) 按官方建表文件搭建Nacos数据库3.1 线上Nacos建表文件地址: https://github.com/alibaba/nacos/blob/master/distribution/conf/nacos-mysql.sql直接打开这个地址(此地址就是官方地址),里面是官方提供的Nacos数据库的建表语句。 3.2 本地Nacos建表文件位置: 如果地址打不开或者没网络,刚才下载的安装包里也有nacos-mysql.sql这个文件 如上图所示,在nacos/conf目录下,就有nacos-mysql.sql这个文件。 注意: 最好是使用Mysql,要不然可能建表会出现各种意外。 这个文件中也明显带了-mysql标识。 3.2 开始搭建Nacos数据库 由于搭建Mysql集群比较复杂,这里不做缀述。 这里就用本地单体Mysql来演示。 使用本地还是集群最终使用都是一样的。只是Mysql集群搭建比较复杂。 3.2.1 创建数据库,库名就叫nacos 3.2.2 执行nacos-mysql.sql 使用nacos-mysql.sql和去官方提供的线上建表文件里复制建表语句都是一样的。 但是建议使用本地的nacos-mysql.sql,因为这个文件一定是完全适配所下载的Nacos的版本的。 执行成功后数据库表如下: 注意点: 执行这个文件可能会报如下错误: Invalid default value for 'gmt_create'有以下解决方法: 将datetime类型改为timestamp类型。 去掉DEFAULT CURRENT_TIMESTAMP。 将Mysql数据库版本升级至5.6.5以上。 我不建议修改官方提供的文件,语句那么多也不好改,而且官网这么写说不定有特定作用。 所有出现这个问题,只要提升我们自己数据库的版本就行。 建议就用Mysql 5.7版本。 4) 配置单个Nacos先不要着急一下搞三个Nacos节点,可以先配完一个,再复制三份。 三个节点相同的配置,就没必要配三次。 4.1 修改conf目录下的application.properties文件,增加如下配置: #数据平台 就是目前使用的哪种数据库 即mysql oracle等数据库 spring.datasource.platform=mysql #db.num 集群中有几台mysql #这里暂时只有一台,因为这里主要是Nacos集群的搭建,所以没有用较大篇幅演示mysql集群的搭建 db.num=1 # 数据库的url 用户名和密码 db.url.0=jdbc:mysql://192.168.137.129:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=root一开始的时候这些配置是被注释了的: 我们只要解开对应注释,改为自己的配置即可。 4.2 修改conf目录下的cluster.conf.example文件
首先把cluster.conf.example重命名为cluster.conf
然后打开文件,在里面添加Nacos各个节点的ip和端口号 # 为了方便查看集群效果,我把三个Nacos节点放在一个Linux上 # 实际生产环境,只需要在Windows下配置好,然后再分别上传到三台对应的Linux服务器上即可 192.168.137.129:8841 192.168.137.129:8843 192.168.137.129:8845最终配置效果如下: 把上面配置好点的节点复制两份。 这时候三个Nacos节点都是一样的配置。 分别把三个Nacos节点重命名为nacos8841、nacos8843、nacos8845。 分别修改三个中Nacos节点的application.properties文件。 主要是为了修改三个节点的端口号:
nacos8841: server.port=8841
nacos8843: server.port=8843
nacos8845: server.port=8845 6) 使用finallshell把三个Nacos节点上传到Linux上6.1 在 /usr/local/下创建nacos-cluster来放三个Nacos节点 cd /usr/local/ # 进入/usr/local/目录 mkdir nacos-cluster # 创建nacos-cluster文件夹 cd nacos-cluster # 进入nacos-cluster目录6.2 使用finallshell上传三个Nacos节点 再次声明: 为了方便查看集群效果,把三个Nacos节点放在一个Linux上 实际生产环境,只需要在Windows下配置好,然后再分别上传到三台对应的Linux服务器上即可 6) 使用启动所有Nacos节点并查看效果6.1 分别启动这三个Nacos节点 # 集群启动命令 (集群启动也是nacos的默认启动方式) sh startup.sh -p embedded # 拓展一个单机启动命令(可以用作测试) sh startup.sh -m standalone出现红框处的这两句,就代表其中一个Nacos集群节点启动成功! 按照相同的方式把所有节点都启动起来即可。 6.2 尝试不使用反向代理直接访问 # 开启三个Nacos节点的对外访问 端口 firewall-cmd --zone=public --add-port=8841/tcp --permanent firewall-cmd --zone=public --add-port=8843/tcp --permanent firewall-cmd --zone=public --add-port=8845/tcp --permanent #重启防火墙 firewall-cmd --reload访问下面任意一个地址: :8841/nacos :8843/nacos :8845/nacos效果如下: 在节点列表中可以看到集群中各个节点的状态。 UP代表启动正常,DOWN代表该节点并不在线。 由此集群基本架构搭建完毕。 三、使用Nginx做集群的反向代理和负载均衡修改 Nginx 配置文件conf目录下的nginx.conf: # 定义一组需要反向代理的服务器 # 对它们的默认的负载均衡策略是轮询策略 upstream nacos-cluster { server 192.168.137.129:8841; server 192.168.137.129:8843; server 192.168.137.129:8845; } # 下述配置的含义为: # 当我们访问8999端口时 # 根据反向代理配置,会将请求转发到 对应的服务上。 server { listen 8999; server_name 192.168.137.129; location /nacos { #监听的请求路径为/nacos proxy_pass ; #反向代理配置 } }配置完成后,开启需要监听的8999端口: # 开启8999 端口 firewall-cmd --zone=public --add-port=8999/tcp --permanent #重启防火墙 firewall-cmd --reload浏览器访问: 访问这个地址,Nginx会自动根据负载均衡策略帮我们完成堵在均衡! SpringBoot中的Nacos配置改为如下配置: spring: cloud: nacos: server-addr: 192.168.137.129:8999 # Nacos地址(ip + 端口号) 四、后记4.1 关于集群节点部分 为了快速实现集群效果,这里把所有集群节点部署在一台Linux上。 实际部署的话,应该分别部署在三台Linux服务器上。 这样可以有效的做好容灾和隔离。 4.2 关于Nginx部分 想要具体了解Nginx怎么使用,可以看我Nginx专栏下的内容 (责任编辑:) |