一、Nacos簡介
Nacos是用於微服務管理的平台,其核心功能是服務注冊與發現、服務配置管理。
- Nacos作為服務注冊發現組件,可以替換Spring Cloud應用中傳統的服務注冊於發現組件,如:Eureka、consul等,支持服務的健康檢查。
- Nacos作為服務配置中心,可以替換Spring Cloud Config。
當然Nacos作為一個微服務管理平台,除了面向spring Cloud,還支持很多其他的微服務基礎設施,如:docker、dubbo、kubernetes等。除了核心的服務注冊與發現和配置管理功能,還提供了各種服務管理的功能特性,如:動態DNS、服務元數據管理等。
二、Nacos單點部署
Nacos支持單點部署的模式,搭建過程非常簡單,實際上nacos的standalone模式沒有所謂的安裝過程,就是下載和啟動。但是這種情況沒有高可用支持,所以只適合測試或學習使用。
首先去nacos的github地址下載release安裝包。當然你也可以自己下載源碼之后進行編譯打包,nacos是使用java開發的,使用maven進行編譯打包。這里我們就不自己打包了,使用release安裝包。下載地址是:https://github.com/alibaba/nacos/releases。在linux系統下可以使用如下的命令下載和解壓縮。
#下載nacos
wget https://github.com/alibaba/nacos/releases/download/1.1.4/nacos-server-1.1.4.tar.gz;
# 解壓nacos
tar -xvf nacos-server-1.1.4.tar.gz
進入到nacos/bin目錄下面,startup命令用於啟動nacos,shutdown命令用於停掉nacos。
- 如果你是linux/unix系統,使用
sh startup.sh -m standalone
腳本啟動方式。 - 如果你是windows系統,雙擊startup.cmd啟動nacos。
nacos的默認服務端口是8848,啟動完成之后通過瀏覽器訪問nacos:http://ip:8848/nacos/
。看到如下界面,需要登陸,默認的用戶名密碼都是nacos,登陸之后看到如下界面:
如果你訪問不到上面的界面,請檢查你部署的主機操作系統的防火牆設置。以下是為CentOS7系統防火牆開放8848端口的命令,其他系統請自行解決。
firewall-cmd --zone=public --add-port=8848/tcp --permanent
firewall-cmd --reload
三、查看主機網卡名稱
使用ip addr
命令查看linux主機的網卡。
- 第一個lo網絡ip是回路ip,127.0.0.1,這個是標配
- 第二個enp0s3網絡設備,ip是10.0.2.15,這個是因為我的服務器網絡使用了雙網卡:橋接+HostOnly模式。正常的服務器是沒有的。
- 第三個enp0s8就是本服務器真正的使用到提供服務的網絡ip,如:192.168.161.4。
- 第四個網絡設備是因為我在這台虛擬機上安裝過docker,所以有一個docker0的網絡設備。
因為較多的網絡設備,導致我在后續安裝過程出現問題。這里先賣個關子。
四、配置nacos集群
我們准備了三台服務器(虛擬機),192.168.161.3、192.168.161.4、192.168.161.5。在三台服務器上分別下載、解壓nacos,並開放8848端口。參考單點standalone部署的模式的操作。然后在conf/cluster.conf中加入三台服務器的ip配置
#ip:port
192.168.161.3:8848
192.168.161.4:8848
192.168.161.5:8848
- 初始化 MySQL 數據庫,sql源文件是在nacos/conf解壓目錄下面的nacos-mysql.sql文件。sql語句源文件。並在nacos/conf/application.properties中增加mysql配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.161.3:3306/testdb?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=test
db.password=
- spring.datasource.platform說明支持數據持久化的數據庫類型,已知目前只支持mysql
- db.num數據庫的數量,我們實驗環境只有一個mysql數據庫,所以是1
- db.url.0表示第一個mysql數據庫的jdbc url連接。如果還有第二個、第三個,請增加db.url.n中的n。
問題: 解決網卡獲取的不是我們希望綁定的網卡的問題:當我們配置完成之后,使用startup.sh命令啟動。發現集群節點列表中並沒有任何記錄。而且后台服務日志報錯,內容如下:
分析: 通過日志我們看到nacos程序自動獲取的是10.0.2.15這個ip,而我們配置的是192.168.161.x的ip。二者不一致,所以報錯。我們看一下獲取主機ip的程序源碼,如下:
private static String getHostAddress() {
String address = System.getProperty("nacos.server.ip");
if (StringUtils.isNotEmpty(address)) {
return address;
} else {
address = "127.0.0.1";
}
...
}
解決方案: 看完源碼之后,ip是通過System.getProperty獲取的,所以我們完全可以通過JVM傳參指定ip。在startup.sh的啟動腳本中增加nacos.server.ip參數。
#=================================================================================
# JVM Configuration
#================================================================================
# 單機模式對應的啟動參數
if [[ "${MODE}" == "standalone" ]]; then
JAVA_OPT="${JAVA_OPT} -Xms512m -Xmx512m -Xmn256m"
JAVA_OPT="${JAVA_OPT} -Dnacos.standalone=true"
else
# 集群模式對應的啟動參數
JAVA_OPT="${JAVA_OPT} -server -Xms2g -Xmx2g -Xmn1g -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=320m"
JAVA_OPT="${JAVA_OPT} -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${BASE_DIR}/logs/java_heapdump.hprof"
JAVA_OPT="${JAVA_OPT} -XX:-UseLargePages"
# 新增以下參數設置本機ip地址
JAVA_OPT="${JAVA_OPT} -Dnacos.server.ip=你的服務器的ip"
fi
當以上工作都完成之后,我們通過瀏覽器分別訪問nacos服務,看到如下界面。集群管理的節點列表里面已經有三各節點,ip分別是192.168.161.3:8848、192.168.161.4:8848、192.168.161.5:8848。
五、nacos集群架構
在完成nacos集群的配置之后,我們可以通過三個入口分別訪問集群內的nacos服務,那下面的問題就是如何將三個入口轉成一個入口。目前許多個人開發者寫的博客或教程中的方法就是在三個nacos服務的前端加一個負載均衡器,如:nginx、haproxy。然后號稱是生產級別的搭建方法,但這種方法是絕對不能用於生產的,因為你的nginx和haproxy是單點,一旦nginx掛了,整個服務就掛了。
nacos官網推薦的方法是使用虛擬ip的方法,如下:
- 最開始虛擬ip192.168.161.6可能與192.168.161.3的主機綁定在一起,通過這兩個ip都可以訪問192.168.161.3主機的nacos服務。
- 一旦192.168.161.3主機宕機或者其他網絡故障,192.168.161.6會自動切換到與192.168.161.4或者192.168.161.5主機綁定在一起。這個過程被叫做虛擬ip的漂移。
這種虛擬ip的方法就是沒有使用到負載均衡,訪問的仍然是某一個節點的nacos服務,只不過形成了主從備份,提供了高可用。那既可以提供高可用,又可以提供負載均衡的辦法可能有的朋友已經想到了,如下圖:
- 在nacos服務的前端加上nginx或者haproxy的負載均衡器
- 然后對負載均衡器使用虛擬ip,通過keepalived實現虛擬ip的漂移
- 用戶訪問負載均衡器實現對nacos服務的訪問,主nginx掛掉,虛擬ip漂移到從nginx負載均衡提供服務
六、nacos集群(虛擬ip漂移)
我們就拿官網中推薦的方法,使用虛擬ip訪問nacos集群的方式做個例子講解一下。為什么不講第三種?一般系統架構水平到了的人聽懂這種方式就知道第三種方式怎么做,水平不到的人聽了第三種仍然還是不懂。
6.1.安裝配置keepalived
在三台服務器上分別安裝keepalived
yum install -y keepalived
在三台服務器上分別修改/etc/keepalived/keepalived.conf
vrrp_instance VI_1 {
state MASTER
interface enp0s8
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.161.6
}
}
- 一台服務器是MASTER,其他的服務器為BACKUP
- interface 配置為我們剛剛查看的網卡的名稱
- virtual_router_id 必須一致,表示這三台服務器搶用一個虛擬ip。
- 修改priority 優先級,三台服務器要不一樣,比如:100、101、102,優先級最高的優先使用虛擬ip。MASTER的優先級一定要高於BACKUP主機
- advert_int 是幾台服務器之間的同步檢查時間,1秒
- authentication 的設置必須一致,這樣這幾台服務器才能通信
- 修改virtual_ipaddress為三台服務器所在網段內未被占用的IP地址,比如:192.168.161.6
6.2.修改防火牆
CentOS7必須開放防火牆配置,否則三台主機無法就虛擬ip的使用優先級通信,將都是MASTER,都配置虛擬ip。
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --protocol vrrp -j ACCEPT;
firewall-cmd --reload;
6.3.啟動keepalived服務
sudo systemctl restart keepalived.service
期待您的關注
- 向您推薦博主的系列文檔:《手摸手教您學習SpringBoot系列-16章97節》
- 本文轉載注明出處(必須帶連接,不能只轉文字):字母哥博客。