博主准备搭建由三个Nacos
节点组成的集群,先需要创建三台虚拟机(VirtualBox
可以复制虚拟机),系统为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/
该配置文件对应虚拟机的网卡名,如下图所示:
先在虚拟机中安装vim
,用来编辑这些配置文件:
yum install -y vim
修改配置文件,设置静态IP
地址:
vim ifcfg-enp0s3
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
,和本地电脑是一样的),为了简单,将GATEWAY
和DNS
设置成本地电脑(Windows10
)的网关即可:
ipconfig
将三台虚拟机都设置静态IP
地址之后,就可以将VirtualBox
上的虚拟机关闭,再使用无界面启动方式启动这些虚拟机,然后使用XShell
连接即可。
搭建Nacos集群
博主将用shell
脚本来实现Nacos
集群的搭建(博主就是想偷懒,脚本的流程使用echo
命令进行了说明,稍微修改也可用于创建单机Nacos
服务):
#!/bin/bash
# author: itkaven
# input: nacos_version ip1 ip2 ip3 port
# 工具包存放路径
path="/usr/local"
# JDK解压后的目录名、压缩包名
jdk_work="jdk1.8.0_202"
jdk_file="jdk-8u202-linux-x64.tar.gz"
# nacos版本号、解压后的目录名、压缩包名
nacos_version="$1"
nacos_work="nacos"
nacos_file="nacos-server-$nacos_version.tar.gz"
# nacos集群的ip地址、运行端口
ip1="$2"
ip2="$3"
ip3="$4"
port="$5"
cluster=("$ip1:$port" "$ip2:$port" "$ip3:$port")
install_jdk() {
if [ ! -e "$path/$jdk_work" ]; then
echo "没有安装JDK,准备安装JDK($jdk_work)!"
if [ ! -e "$path/$jdk_file" ]; then
echo "请上传JDK压缩包($jdk_file)!"
else
echo "JDK压缩包($jdk_file)已经上传!"
echo "开始解压!"
tar -zxvf "$path/$jdk_file" -C "$path"
echo "删除压缩包!"
rm -f "$path/$jdk_file"
echo "配置JDK环境变量!"
echo "export JAVA_HOME=$path/$jdk_work" >> /etc/profile
source /etc/profile
echo "export CLASSPATH=.:$JAVA_HOME/lib/" >> /etc/profile
echo "export PATH=$JAVA_HOME/bin:$PATH" >> /etc/profile
source /etc/profile
fi
else
echo "已经安装JDK($jdk_work)!"
fi
}
download_nacos() {
if [ -e "$path/$nacos_work" ]; then
echo "nacos文件已经存在!"
else
echo "nacos文件不存在,等待下载!"
yum install -y wget
echo "准备从Github下载nacos压缩包(可能因为网络原因导致下载失败,再重新执行脚本即可)!"
wget -P "$path" --no-check-certificate "https://github.com/alibaba/nacos/releases/download/$nacos_version/$nacos_file"
echo "nacos压缩包下载完成!"
echo "开始解压nacos压缩包!"
tar -zxvf "$path/$nacos_file" -C "$path"
echo "删除nacos压缩包!"
rm -f "$path/$nacos_file"
fi
}
config_and_run_nacos() {
# shellcheck disable=SC2164
cd "$path/$nacos_work/conf"
echo "修改nacos的application.properties(根据用户输入的端口,配置nacos在指定端口上运行)!"
sed -i "s#server.port=.*#server.port=$port#g" ./application.properties
echo "添加nacos的集群配置(根据用户输入的三台虚拟机的IP地址和运行端口)!"
echo "" > ./cluster.conf
# shellcheck disable=SC2068
for config in ${cluster[@]} ; do
echo "$config" >> ./cluster.conf
done
echo "为了方便,关闭防火墙,让nacos集群可以通信,nacos通信会使用多个端口!"
systemctl stop firewalld
echo "以集群方式启动nacos(使用内置数据源)!"
# shellcheck disable=SC2164
cd "$path/$nacos_work/bin"
./startup.sh -p embedded
}
if [ $# -ne "5" ]; then
echo "请依次输入nacos的版本号、三台虚拟机的IP地址以及启动端口(指定一个即可)!"
else
install_jdk
download_nacos
config_and_run_nacos
fi
脚本的意图:
- 安装
JDK
,需要提前将JDK
压缩包放到虚拟机的/usr/local/
路径下,博主不喜欢使用yum
安装JDK
,但使用wget
命令下载JDK
压缩包得到的是缺损包,因为Oracle
官方有验证;所以博主采取了折中的方式,手动上传JDK
压缩包,文件解压和配置环境变量就通过脚本完成。 - 下载
Nacos
(从Github
),再进行解压。 - 配置与运行
Nacos
,修改默认配置文件application.properties
中的server.port
为指定的端口,并且将集群配置写入配置文件cluster.conf
中(根据指定的三台虚拟机IP
地址和启动端口)。关闭防火墙(方便Nacos
集群相互通信),以集群方式启动Nacos
,并且使用内置数据源,其实是博主懒,不想搭Mysql
集群了,之后再补上。
将下载好的JDK
压缩包放到每台虚拟机的/usr/local/
路径下:
如果JDK
版本和博主不相同,需要修改脚本的这两个变量:
# JDK解压后的目录名、压缩包名
jdk_work="jdk1.8.0_202"
jdk_file="jdk-8u202-linux-x64.tar.gz"
Nacos
的单机使用可以参考这篇博客:
- Spring Cloud Alibaba:Nacos服务注册与发现
其实集群和单机的搭建方式是类似的,只不过搭建Nacos
集群需要修改集群的配置文件(cluster.conf
),以及需要使用集群方式运行Nacos
(默认方式就是集群运行,单机运行还需要加-m standalone
参数)。因此集群和单机搭建方式的不同之处就在于下面这个函数的相关部分:
config_and_run_nacos() {
# shellcheck disable=SC2164
cd "$path/$nacos_work/conf"
echo "修改nacos的application.properties(根据用户输入的端口,配置nacos在指定端口上运行)!"
sed -i "s#server.port=.*#server.port=$port#g" ./application.properties
echo "添加nacos的集群配置(根据用户输入的三台虚拟机的IP地址和运行端口)!"
echo "" > ./cluster.conf
# shellcheck disable=SC2068
for config in ${cluster[@]} ; do
echo "$config" >> ./cluster.conf
done
echo "为了方便,关闭防火墙,让nacos集群可以通信,nacos通信会使用多个端口!"
systemctl stop firewalld
echo "以集群方式启动nacos(使用内置数据源)!"
# shellcheck disable=SC2164
cd "$path/$nacos_work/bin"
./startup.sh -p embedded
}
先将该shell
脚本复制到三台虚拟机上。
vim nacos_server.sh
保存后再退出:
- 怎么保存退出 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.2
是Nacos
的版本号,三个IP
地址就是三台虚拟机的IP
地址,并且将Nacos
运行在虚拟机的9000
端口上(参数顺序固定)。
192.168.1.195
192.168.1.196
192.168.1.197
等待nacos_server.sh
脚本执行完成(失败请重新运行脚本,从Github
下载文件可能会因为网络问题导致失败)。
nacos_server.sh
脚本执行完成后,集群配置文件cluster.conf
会被创建,并且添加指定的集群配置信息。
配置文件application.properties
中的server.port
也被设置为指定的端口。
可以查看Nacos
的日志文件:
vim /usr/local/nacos/logs/start.out
很明显Nacos
集群启动成功了。
此时,如果在某一个Nacos
节点上创建一个配置文件,其他Nacos
节点也会被同步创建该配置文件。
刷新,其他Nacos
节点也会出现该配置文件。
当然可以在任一Nacos
节点上删除该配置文件。
刷新,其他Nacos
节点该配置文件也会被删除。
服务注册
创建alibaba maven
工程作为父module
,再创建nacos
子module
。
alibaba module
pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>
<groupId>com.kaven</groupId>
<artifactId>alibaba</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<description>Spring Cloud Alibaba</description>
<modules>
<module>nacos</module>
</modules>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<spring-cloud-version>Hoxton.SR9</spring-cloud-version>
<spring-cloud-alibaba-version>2.2.6.RELEASE</spring-cloud-alibaba-version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
nacos module
pom.xml
:
<?xml version="1.0" encoding="UTF-8"?>
<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>alibaba</artifactId>
<groupId>com.kaven</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</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
服务:
nacos
服务成功注册在Nacos
集群上。
到这里就结束了,如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。