SpringCloud - 服务注册与配置中心Nacos使用详解2(集群部署)
作者:hangge | 2020-12-03 08:10
在前文中我介绍了如何搭建单节点的服务注册中心,但这个在生产环境中显然并不合适。而 Nacos 同 Eureka 一样,可以通过集群部署来构建高可用的服务注册中心,以增强系统的可用性。
(2)下载后将其解压:
(3)进入 nacos/conf 目录,创建一个 cluster.conf 配置文件:
(4)在文件中增加如下配置,该配置标示本地有三个不同的端口启动该服务:
(5)由于集群需要使用 MySQL 来实现服务配置的数据持久化,所以我们创建一个名为 nacos_config 的数据库,然后使用官方提供的 sql 脚本(点击获取)进行初始化,结果如下:
(8)接着修改 nacos2 和 nacos3 中的 conf/application.properties 文件,将端口分别改成 8849 和 8850:
(10)当然如果我们不想复制三个 nacos 文件夹的话,可以直接修改启动和停止脚本,增加一个端口参数,让我们能指定端口:
集群部署准备环境跟单机部署相同,额外的要求就是 Nacos 需要 3 个或 3 个以上 Nacos 节点构成集群,并且使用 MySQL 作为数据源,主要用于服务配置的数据持久化。
二、集群部署
1,通过二进制方式部署
由于正常情况下需要 3 个或 3 个以上 Nacos 节点构成集群,这里我们采用伪集群的方式进行演示。即在同一个服务器上启动三 Nacos(分别使用不同端口)来构建集群。
(1)我们可以下载源码自行编译,也可以直接下载官方发行包使用(最新稳定版本),比如我这里下载 1.2.0 版本的发行包:
wget https://github.com/alibaba/nacos/releases/download/1.2.0/nacos-server-1.2.0.tar.gz
(2)下载后将其解压:
tar -xvf nacos-server-1.2.0.tar.gz
(3)进入 nacos/conf 目录,创建一个 cluster.conf 配置文件:
cd ./nacos/conf vi cluster.conf
(4)在文件中增加如下配置,该配置标示本地有三个不同的端口启动该服务:
注意:因为是伪集群,所以这里只是端口不同但 IP 是一样的。实际生产环境下,会使用不同节点进行部署,那么应该是 IP 不同,而端口统一都是 8848。
192.168.60.133:8848 192.168.60.133:8849 192.168.60.133:8850
(5)由于集群需要使用 MySQL 来实现服务配置的数据持久化,所以我们创建一个名为 nacos_config 的数据库,然后使用官方提供的 sql 脚本(点击获取)进行初始化,结果如下:
注意:MySQL 数据库建议使用 5.7 版的,如果版本太高(比如 8),可能会造成 Nacos 服务启动失败。
(6)然后修改配置文件 conf/application.properties 里数据库连接配置部分:
(7)由于是伪集群,需要在同一台服务启动三个服务。我们将整个 nacos 文件夹复制出两份,分别命名为 nacos2 和 nacos3:
注意:如果不想复制多个文件夹的话,可以修改启动脚本,增加端口参数,这样我们就能通过指定不同的端口进行启动多个服务。具体操作步骤直接跳到第(10)步查看。
cp -p -r nacos nacos2 cp -p -r nacos nacos3
(8)接着修改 nacos2 和 nacos3 中的 conf/application.properties 文件,将端口分别改成 8849 和 8850:
(9)分别启动 nacos/bin、nacos2/bin 以及 nacos3/bin 下的 startup.sh 命令文件启动服务(不带任何参数标示集群启动):
./startup.sh
(10)当然如果我们不想复制三个 nacos 文件夹的话,可以直接修改启动和停止脚本,增加一个端口参数,让我们能指定端口:
- startup.sh 文件做如下高亮部分内容修改:
export SERVER="nacos-server" export MODE="cluster" export FUNCTION_MODE="all" # 新加 export SERVER_PORT="8848" # 增加端口参数 while getopts ":m:f:s:p:" opt do case $opt in m) MODE=$OPTARG;; f) FUNCTION_MODE=$OPTARG;; s) SERVER=$OPTARG;; # 新加 p) SERVER_PORT=$OPTARG;; ?) echo "Unknown parameter" exit 1;; esac done # 新加 JAVA_OPT="${JAVA_OPT} -Dserver.port=${SERVER_PORT}"
- shutdown.sh 文件做如下高亮部分内容修改:
cd `dirname $0`/../target target_dir=`pwd` # 新加内容 PORT=$1 if [ ! $PORT ]; then echo "please select stop port!" >&2 exit 1 fi # 添加PORT过滤 pid=`ps ax | grep -i 'nacos.nacos' | grep ${PORT} | grep ${target_dir} | grep java | grep -v grep | awk '{print $1}'` if [ -z "$pid" ] ; then echo "No nacosServer running." exit -1; fi
- 最后我们执行如下命令可以启动三个 Nacos 服务(指定不同的端口):
./startup.sh -p 8848 ./startup.sh -p 8849 ./startup.sh -p 8850
- 如果要停 止Nacos 服务,则执行如下命令:
./shutdown.sh 8848 ./shutdown.sh 8849 ./shutdown.sh 8850
(11)启动后我们也可以通过登录任一个 Nacos 控制台的集群管理界面看到节点的信息。
(12)由于使用 MySQL 进行数据持久化,假设我们随便在某个服务实例上新建一个命名空间,那么在另外 2 个服务实例上也都能访问到:
(5)启动后通过 docker ps 命令可以发现,通过 docker-compose 部署,除了运行了三个 Nacos 容器,还运行了一个 MySQL 容器(而且该数据库不需要我们像上面那样手动初始化建表语句)。
(3)配置完毕后重启 Nginx 服务,当我们访问 Nginx 的 /nacos 接口时,请求会被自动随机转发到某一个 Nacos 实例上:
提示:集群下的 Nacos 节点状态分为 FOLLOWER ,LEADER 两种,跟我们熟悉的主从架构相似。
(12)由于使用 MySQL 进行数据持久化,假设我们随便在某个服务实例上新建一个命名空间,那么在另外 2 个服务实例上也都能访问到:
(13)当然在数据库表内也可以看到:
2,使用 Docker 部署
(1)Nacos 官方 Docker 部署方式 Git 地址如下:
(2)其中 example 目录下为用于 Docker Compose 启动的 yml 文件:
- standalone-derby.yaml:用于单机部署(内存模式)
- standalone-mysql-xx.yaml:用于单机部署(Mysql 模式)
- cluster-hostname.yaml:用于集群部署
(3)首先我们执行如下命令拉取仓库:
git clone --depth 1 https://github.com/nacos-group/nacos-docker.git
(4)假设我们使用集群部署,执行如下命令进入仓库目录,并启动服务:
cd nacos-docker docker-compose -f example/cluster-hostname.yaml up -d
(5)启动后通过 docker ps 命令可以发现,通过 docker-compose 部署,除了运行了三个 Nacos 容器,还运行了一个 MySQL 容器(而且该数据库不需要我们像上面那样手动初始化建表语句)。
提示:cluster-hostname.yaml 其实也仅仅是官方提供的一个伪集群样例(因为这三个 Nacos 容器仍然运行在同一个服务器上)。实际应用中,我们可以根据这个 yml 文件进行修改,将容器手动或者通过 K8S 自动部署到不同节点上。
(6)启动后我们也可以通过登录任一个 Nacos 控制台的集群管理界面看到节点的信息。
(7)由于使用 MySQL 进行数据持久化,假设我们随便在某个服务实例上新建一个命名空间,那么在另外 2 个服务实例上也都能访问到:
提示:集群下的 Nacos 节点状态分为 FOLLOWER 和 LEADER 两种,跟我们熟悉的主从架构相似。
(7)由于使用 MySQL 进行数据持久化,假设我们随便在某个服务实例上新建一个命名空间,那么在另外 2 个服务实例上也都能访问到:
(8)当然在数据库表内也可以看到:
提示:数据库的相关连接信息可以在 git 包下的 env/mysql.env 文件中找到。
附:使用 Nginx 实现负载均衡(反向代理)
(1)当集群搭建完毕后,我们便可以利用一些硬件或者软件工具(比如 Nginx)来做负载均衡,这样来自同一个用户的 HTTP 请求就会被自动分发到不同的实例上去。而 Nginx 的安装步骤可以参考我之前写的这篇文章:
(2)安装完毕后对 nginx.conf 文件进行编辑,增加如下高亮部分内容:
修改说明:
- 首先配置上游服务器,即 3 个 nacos server,3 个 nacos server 的权重都是 1,意味着请求将平均分配到 3 个 nacos server 上。
- 然后在 server 中配置拦截规则,将拦截到的请求转发到定义好的 nacos server 上。
upstream nacosserver { server 192.168.60.133:8848 weight=1; server 192.168.60.133:8849 weight=1; server 192.168.60.133:8850 weight=1; } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { root html; index index.html index.htm; } location /nacos/ { proxy_pass http://nacosserver/nacos/; }
(3)配置完毕后重启 Nginx 服务,当我们访问 Nginx 的 /nacos 接口时,请求会被自动随机转发到某一个 Nacos 实例上:
全部评论(0)