Spring Cloud Alibaba:搭建Nacos集群

Spring Cloud Alibaba:搭建Nacos集群

博主准备搭建由三个Nacos节点组成的集群,先需要创建三台虚拟机,系统为CentOS7,每台虚拟机配置相同,内存2G以及磁盘8G。如何创建虚拟机请参考这篇博客:

  • VirtualBox安装CentOS7

还需要使用XShell来连接虚拟机,毕竟在VirtualBox上操作虚拟机比较麻烦。先使用VirtualBox进入虚拟机,查询该虚拟机的IP地址(使用ip addr或者ifconfig命令),然后使用XShell来连接它。

  • ip addr命令介绍

静态IP地址

为了避免动态分配IP地址而造成的麻烦,将每台虚拟机的IP地址设置为静态IP地址,这样以后使用XShell连接虚拟机,就不需要每次使用VirtualBox进入虚拟机查询新分配的IP地址了。

cd /etc/sysconfig/network-scripts/

Spring Cloud Alibaba:搭建Nacos集群_第1张图片
该配置文件对应虚拟机的网卡名,如下图所示:
Spring Cloud Alibaba:搭建Nacos集群_第2张图片
先在虚拟机中安装vim,用来编辑这些配置文件:

yum install -y vim

修改配置文件,设置静态IP地址:

vim ifcfg-enp0s3

Spring Cloud Alibaba:搭建Nacos集群_第3张图片

BOOTPROTO="static"     # 静态IP地址,默认为动态分配
ONBOOT="yes"           # 是否开机启用
IPADDR=192.168.1.195   # 设置的静态IP地址
NETMASK=255.255.255.0  # 子网掩码
GATEWAY=192.168.1.1    # 网关
DNS1=192.168.1.1       # DNS服务器

IP地址就设置成使用VirtualBox进入虚拟机查询到的IP地址,子网掩码一般都是24位(255.255.255.0,和本地电脑是一样的),为了简单,将GATEWAYDNS设置成本地电脑(Windows10)的网关即可:

ipconfig

Spring Cloud Alibaba:搭建Nacos集群_第4张图片
将三台虚拟机都设置静态IP地址之后,就可以将VirtualBox上的虚拟机关闭,再使用无界面启动方式启动这些虚拟机,然后使用XShell连接即可。
Spring Cloud Alibaba:搭建Nacos集群_第5张图片

搭建Nacos集群

博主将用shell脚本来实现Nacos集群的搭建(脚本的流程使用echo命令进行了说明,稍微修改也可用于创建单机Nacos服务):

#!/bin/bash

# author: itkaven
# input: nacos_version ip1 ip2 ip3 port  

jdk="jdk1.8.0_202"

if [ $# -ne "5" ]; then
    echo "请依次输入nacos的版本号、三台虚拟机的IP地址以及启动端口(指定一个即可)!"
else
    if [ -e "/usr/local/nacos" ]; then
        echo "nacos文件已经存在!"
    else
        echo "nacos文件不存在,等待下载!"
        yum install -y wget
        echo "准备从Github下载nacos压缩包(可能因为网络原因导致下载失败,再重新执行脚本即可)!"
        wget -P "/usr/local" --no-check-certificate "https://github.com/alibaba/nacos/releases/download/$1/nacos-server-$1.tar.gz"
        echo "nacos压缩包下载完成!"
        echo "开始解压nacos压缩包!"
        tar -zxvf "/usr/local/nacos-server-$1.tar.gz" -C "/usr/local"
        echo "删除nacos压缩包"
        rm -f "/usr/local/nacos-server-$1.tar.gz"
    fi
    cd "/usr/local/nacos/conf"
    echo "修改nacos的application.properties(根据用户输入的端口,配置nacos在指定端口上运行)!"
    sed -i "s#server.port=.*#server.port=$5#g" application.properties
    echo "添加nacos的集群配置(根据用户输入的三台虚拟机的IP地址和运行端口)!"
    echo -e "$2:$5\n$3:$5\n$4:$5" > ./cluster.conf
    if [ ! -e "/usr/local/$jdk" ]; then
        echo "没有安装JDK,准备安装JDK($jdk)!"
        if [ ! -e "/usr/local/jdk-8u202-linux-x64.tar.gz" ]; then
            echo "请上传JDK压缩包!"
        else
            echo "JDK压缩包已经上传!"
            echo "开始解压!"
            tar -zxvf "/usr/local/jdk-8u202-linux-x64.tar.gz" -C "/usr/local"
            echo "删除压缩包!"
            rm -f "/usr/local/jdk-8u202-linux-x64.tar.gz"
            echo "配置JDK环境变量!"
            echo "export JAVA_HOME=/usr/local/jdk1.8.0_202" >> /etc/profile
            source /etc/profile
            echo "export CLASSPATH=.:$JAVA_HOME/lib/" >> /etc/profile
            echo "export PATH=$PATH:$JAVA_HOME/bin" >> /etc/profile
            source /etc/profile
        fi
    else
        echo "已经安装JDK($jdk)!"
    fi
    echo "为了方便,关闭防火墙,让nacos集群可以通信,nacos通信会使用多个端口!"
    systemctl stop firewalld
    echo "以集群方式启动nacos(使用内置数据源)!"
    cd "/usr/local/nacos/bin"
    ./startup.sh -p embedded
fi

脚本的意图:

  • 安装JDK,需要提前将JDK压缩包放到虚拟机的/usr/local/路径下,博主不喜欢使用yum安装JDK,但使用wget命令下载JDK压缩包得到的是缺损包,因为Oracle官方有验证;所以博主采取了折中的方式,手动上传JDK压缩包,解压和环境变量就通过脚本完成。
  • 下载Nacos(从Github),再进行解压,修改默认配置文件application.properties中的server.port为指定的端口,并且将集群配置写入配置文件cluster.conf中(根据指定的三台虚拟机IP地址和启动端口)。
  • 关闭防火墙(方便Nacos集群相互通信),以集群方式启动Nacos,并且使用内置数据源,其实是博主懒,不想搭Mysql集群了,之后再补上。

将下载好的JDK压缩包放到每台虚拟机的/usr/local/路径下(如果JDK版本和博主不相同,脚本需要修改):
Spring Cloud Alibaba:搭建Nacos集群_第6张图片

Nacos的单机使用可以参考这篇博客:

  • Spring Cloud Alibaba:Nacos服务注册与发现

其实集群和单机的搭建方式是类似的,只不过搭建Nacos集群需要修改集群的配置文件(cluster.conf),以及需要使用集群方式运行Nacos(默认方式就是集群运行,单机运行还需要加-m standalone)。因此集群和单机搭建方式的不同之处就在于这两行:

echo -e "$2:$5\n$3:$5\n$4:$5" > ./cluster.conf
./startup.sh -p embedded

先将该shell脚本复制到三台虚拟机上。

vim nacos_server.sh

Spring Cloud Alibaba:搭建Nacos集群_第7张图片

保存后再退出:

  • 怎么保存退出 vim 编辑

修改nacos_server.sh脚本的权限(不然没有运行权限):

chmod 700 nacos_server.sh

运行nacos_server.sh脚本(报错就重新运行,一般是网络问题,毕竟博主把坑基本上踩了):

./nacos_server.sh 1.4.2 192.168.1.195 192.168.1.196 192.168.1.197 9000

1.4.2Nacos的版本号,三个IP地址就是三台虚拟机的IP地址,并且将Nacos运行在虚拟机的9000端口上(参数顺序固定)。

192.168.1.195
192.168.1.196
192.168.1.197 

等待nacos_server.sh脚本执行完成(博主已经执行过几次了,因此这里会比较简短)。
Spring Cloud Alibaba:搭建Nacos集群_第8张图片
nacos_server.sh脚本执行完成后,集群配置文件cluster.conf会被创建,并且添加指定的集群配置信息。
Spring Cloud Alibaba:搭建Nacos集群_第9张图片
配置文件application.properties中的server.port也被设置为指定的端口。
Spring Cloud Alibaba:搭建Nacos集群_第10张图片

可以查看Nacos的日志文件:

vim /usr/local/nacos/logs/start.out

Spring Cloud Alibaba:搭建Nacos集群_第11张图片

很明显Nacos集群启动成功了。
Spring Cloud Alibaba:搭建Nacos集群_第12张图片
Spring Cloud Alibaba:搭建Nacos集群_第13张图片
Spring Cloud Alibaba:搭建Nacos集群_第14张图片
此时,如果在某一个Nacos节点上创建一个配置文件,其他Nacos节点也会被同步创建该配置文件。
Spring Cloud Alibaba:搭建Nacos集群_第15张图片
刷新,其他Nacos节点也会出现该配置文件。
Spring Cloud Alibaba:搭建Nacos集群_第16张图片
Spring Cloud Alibaba:搭建Nacos集群_第17张图片
当然可以在任一Nacos节点上删除该配置文件。
Spring Cloud Alibaba:搭建Nacos集群_第18张图片
刷新,其他Nacos节点该配置文件也会被删除。
Spring Cloud Alibaba:搭建Nacos集群_第19张图片
Spring Cloud Alibaba:搭建Nacos集群_第20张图片

服务注册

创建alibaba maven工程作为父module,再创建nacosmoduleSpring Cloud Alibaba:搭建Nacos集群_第21张图片
alibaba module

pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>

    <groupId>com.kavengroupId>
    <artifactId>alibabaartifactId>
    <packaging>pompackaging>
    <version>1.0-SNAPSHOTversion>

    <description>Spring Cloud Alibabadescription>
    <modules>
        <module>nacosmodule>
    modules>

    <properties>
        <maven.compiler.source>8maven.compiler.source>
        <maven.compiler.target>8maven.compiler.target>
        <spring-cloud-version>Hoxton.SR9spring-cloud-version>
        <spring-cloud-alibaba-version>2.2.6.RELEASEspring-cloud-alibaba-version>
    properties>

    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.3.2.RELEASEversion>
    parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
    dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud-version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>${spring-cloud-alibaba-version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
project>

nacos module

pom.xml


<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>alibabaartifactId>
        <groupId>com.kavengroupId>
        <version>1.0-SNAPSHOTversion>
    parent>
    <modelVersion>4.0.0modelVersion>

    <artifactId>nacosartifactId>

    <properties>
        <maven.compiler.source>8maven.compiler.source>
        <maven.compiler.target>8maven.compiler.target>
    properties>

    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
    dependencies>
project>

application.yml

server:
  port: 8080

spring:
  application:
    name: nacos
  cloud:
    nacos:
      discovery:
        server-addr: "192.168.1.195:9000,192.168.1.196:9000,192.168.1.197:9000"

NacosApplication启动类:

package com.kaven.alibaba;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@SpringBootApplication
@EnableDiscoveryClient
public class NacosApplication {
     
    public static void main(String[] args) {
     
        SpringApplication.run(NacosApplication.class);
    }
}

@EnableDiscoveryClient注解要加上。

启动nacos服务:
Spring Cloud Alibaba:搭建Nacos集群_第22张图片
nacos服务成功注册在Nacos集群上。
Spring Cloud Alibaba:搭建Nacos集群_第23张图片
Spring Cloud Alibaba:搭建Nacos集群_第24张图片
Spring Cloud Alibaba:搭建Nacos集群_第25张图片
但这样部署Nacos集群存在一个弊端,如果某个Nacos节点宕机,则需要修改应用的配置文件才可以继续使用。

Nginx代理

为了方便,博主就在已有的虚拟机上部署Nginx,应用通过访问Nginx,可以间接访问Nacos集群,Nginx会将请求转发到内网中的Nacos集群(内网更加安全),并且会进行负载均衡。
Spring Cloud Alibaba:搭建Nacos集群_第26张图片

Nginx的安装与运行,博主在之前的博客中已经介绍过了:

  • 分布式篇 - Nginx安装与运行

博主就在192.168.1.196这台虚拟机上部署Nginx,部署Nginx不应该和Nacos集群在相同的服务器上,这里博主只是为了图方便。

根据上面这篇博客的步骤进行安装与运行Nginx即可。
在这里插入图片描述
Nginx部署成功了。
Spring Cloud Alibaba:搭建Nacos集群_第27张图片
修改配置文件:

[root@localhost sbin]# cd /usr/local/nginx/conf
[root@localhost conf]# ll
total 68
-rw-r--r--. 1 root root 1077 Nov 11 01:30 fastcgi.conf
-rw-r--r--. 1 root root 1077 Nov 11 01:30 fastcgi.conf.default
-rw-r--r--. 1 root root 1007 Nov 11 01:30 fastcgi_params
-rw-r--r--. 1 root root 1007 Nov 11 01:30 fastcgi_params.default
-rw-r--r--. 1 root root 2837 Nov 11 01:30 koi-utf
-rw-r--r--. 1 root root 2223 Nov 11 01:30 koi-win
-rw-r--r--. 1 root root 5231 Nov 11 01:30 mime.types
-rw-r--r--. 1 root root 5231 Nov 11 01:30 mime.types.default
-rw-r--r--. 1 root root 2656 Nov 11 01:30 nginx.conf
-rw-r--r--. 1 root root 2656 Nov 11 01:30 nginx.conf.default
-rw-r--r--. 1 root root  636 Nov 11 01:30 scgi_params
-rw-r--r--. 1 root root  636 Nov 11 01:30 scgi_params.default
-rw-r--r--. 1 root root  664 Nov 11 01:30 uwsgi_params
-rw-r--r--. 1 root root  664 Nov 11 01:30 uwsgi_params.default
-rw-r--r--. 1 root root 3610 Nov 11 01:30 win-utf
[root@localhost conf]# vim nginx.conf

Spring Cloud Alibaba:搭建Nacos集群_第28张图片

reload nginx

[root@localhost conf]# cd ..
[root@localhost nginx]# cd sbin
[root@localhost sbin]# ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@localhost sbin]# ./nginx -s reload

很显然Nginx代理成功了。
Spring Cloud Alibaba:搭建Nacos集群_第29张图片
修改nacos服务的application.yml

server:
  port: 8080

spring:
  application:
    name: nacos
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.1.196:80

重新启动nacos服务:
Spring Cloud Alibaba:搭建Nacos集群_第30张图片
nacos服务成功注册到Nacos集群上。
Spring Cloud Alibaba:搭建Nacos集群_第31张图片
Spring Cloud Alibaba:搭建Nacos集群_第32张图片
Spring Cloud Alibaba:搭建Nacos集群_第33张图片
Spring Cloud Alibaba:搭建Nacos集群_第34张图片
成功使用Nginx代理Nacos集群,这样Nacos集群便可以不暴露在公网下,Nacos集群会更加安全。

如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。

你可能感兴趣的:(Spring,Cloud,Alibaba,后端框架,Nginx,spring,cloud,云原生,cloud,native)