返回 导航

SpringBoot / Cloud

hangge.com

SpringCloud - 服务注册与配置中心Nacos使用详解2(集群部署)

作者:hangge | 2020-12-03 08:10
    在前文中我介绍了如何搭建单节点的服务注册中心,但这个在生产环境中显然并不合适。而 Nacos Eureka 一样,可以通过集群部署来构建高可用的服务注册中心,以增强系统的可用性。
    集群部署准备环境跟单机部署相同,额外的要求就是 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/binnacos2/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}"
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
./startup.sh -p 8848
./startup.sh -p 8849
./startup.sh -p 8850
./shutdown.sh 8848
./shutdown.sh 8849
./shutdown.sh 8850

(11)启动后我们也可以通过登录任一个 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 控制台的集群管理界面看到节点的信息。
提示:集群下的 Nacos 节点状态分为 FOLLOWER LEADER 两种,跟我们熟悉的主从架构相似。

(7)由于使用 MySQL 进行数据持久化,假设我们随便在某个服务实例上新建一个命名空间,那么在另外 2 个服务实例上也都能访问到:

(8)当然在数据库表内也可以看到:
提示:数据库的相关连接信息可以在 git 包下的 env/mysql.env 文件中找到。

附:使用 Nginx 实现负载均衡(反向代理)

(1)当集群搭建完毕后,我们便可以利用一些硬件或者软件工具(比如 Nginx)来做负载均衡,这样来自同一个用户的 HTTP 请求就会被自动分发到不同的实例上去。而 Nginx 的安装步骤可以参考我之前写的这篇文章:

(2)安装完毕后对 nginx.conf 文件进行编辑,增加如下高亮部分内容:
修改说明:
  • 首先配置上游服务器,即 3 nacos server3 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)

回到顶部