部落客準備搭建由三個
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
叢集上。