天天看點

Spring Cloud Alibaba:搭建Nacos叢集

部落客準備搭建由三個​

​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/      
Spring Cloud Alibaba:搭建Nacos叢集

該配置檔案對應虛拟機的網卡名,如下圖所示:

Spring Cloud Alibaba:搭建Nacos叢集

先在虛拟機中安裝​

​vim​

​,用來編輯這些配置檔案:

yum install -y vim      

修改配置檔案,設定靜态​

​IP​

​位址:

vim ifcfg-enp0s3      
Spring Cloud Alibaba:搭建Nacos叢集
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      
Spring Cloud Alibaba:搭建Nacos叢集

将三台虛拟機都設定靜态​

​IP​

​​位址之後,就可以将​

​VirtualBox​

​​上的虛拟機關閉,再使用無界面啟動方式啟動這些虛拟機,然後使用​

​XShell​

​連接配接即可。

Spring Cloud Alibaba:搭建Nacos叢集

搭建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/​

​路徑下:

Spring Cloud Alibaba:搭建Nacos叢集

如果​

​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      
Spring Cloud Alibaba:搭建Nacos叢集

儲存後再退出:

  • ​​怎麼儲存退出 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​

​下載下傳檔案可能會因為網絡問題導緻失敗)。

Spring Cloud Alibaba:搭建Nacos叢集
Spring Cloud Alibaba:搭建Nacos叢集

​nacos_server.sh​

​​腳本執行完成後,叢集配置檔案​

​cluster.conf​

​會被建立,并且添加指定的叢集配置資訊。

Spring Cloud Alibaba:搭建Nacos叢集

配置檔案​

​application.properties​

​​中的​

​server.port​

​也被設定為指定的端口。

Spring Cloud Alibaba:搭建Nacos叢集

可以檢視​

​Nacos​

​的日志檔案:

vim /usr/local/nacos/logs/start.out      
Spring Cloud Alibaba:搭建Nacos叢集

很明顯​

​Nacos​

​叢集啟動成功了。

Spring Cloud Alibaba:搭建Nacos叢集
Spring Cloud Alibaba:搭建Nacos叢集
Spring Cloud Alibaba:搭建Nacos叢集

此時,如果在某一個​

​Nacos​

​​節點上建立一個配置檔案,其他​

​Nacos​

​節點也會被同步建立該配置檔案。

Spring Cloud Alibaba:搭建Nacos叢集

重新整理,其他​

​Nacos​

​節點也會出現該配置檔案。

Spring Cloud Alibaba:搭建Nacos叢集
Spring Cloud Alibaba:搭建Nacos叢集

當然可以在任一​

​Nacos​

​節點上删除該配置檔案。

Spring Cloud Alibaba:搭建Nacos叢集

重新整理,其他​

​Nacos​

​節點該配置檔案也會被删除。

Spring Cloud Alibaba:搭建Nacos叢集
Spring Cloud Alibaba:搭建Nacos叢集

服務注冊

建立​

​alibaba maven​

​​工程作為父​

​module​

​​,再建立​

​nacos​

​​子​

​module​

​。

Spring Cloud Alibaba:搭建Nacos叢集

​​

​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​

​服務:

Spring Cloud Alibaba:搭建Nacos叢集

​nacos​

​​服務成功注冊在​

​Nacos​

​叢集上。

Spring Cloud Alibaba:搭建Nacos叢集
Spring Cloud Alibaba:搭建Nacos叢集
Spring Cloud Alibaba:搭建Nacos叢集