
微服務(wù)管理平臺(tái)nacos虛擬ip負(fù)載均衡集群模式搭建
一、Nacos簡(jiǎn)介
Nacos是用于微服務(wù)管理的平臺(tái),其核心功能是服務(wù)注冊(cè)與發(fā)現(xiàn)、服務(wù)配置管理。
Nacos作為服務(wù)注冊(cè)發(fā)現(xiàn)組件,可以替換Spring Cloud應(yīng)用中傳統(tǒng)的服務(wù)注冊(cè)于發(fā)現(xiàn)組件,如:Eureka、consul等,支持服務(wù)的健康檢查。
Nacos作為服務(wù)配置中心,可以替換Spring Cloud Config。
當(dāng)然Nacos作為一個(gè)微服務(wù)管理平臺(tái),除了面向spring Cloud,還支持很多其他的微服務(wù)基礎(chǔ)設(shè)施,如:docker、dubbo、kubernetes等。除了核心的服務(wù)注冊(cè)與發(fā)現(xiàn)和配置管理功能,還提供了各種服務(wù)管理的功能特性,如:動(dòng)態(tài)DNS、服務(wù)元數(shù)據(jù)管理等。
二、Nacos單點(diǎn)部署
Nacos支持單點(diǎn)部署的模式,搭建過(guò)程非常簡(jiǎn)單,實(shí)際上nacos的standalone模式?jīng)]有所謂的安裝過(guò)程,就是下載和啟動(dòng)。但是這種情況沒(méi)有高可用支持,所以只適合測(cè)試或?qū)W習(xí)使用。
首先去nacos的github地址下載release安裝包。當(dāng)然你也可以自己下載源碼之后進(jìn)行編譯打包,nacos是使用java開(kāi)發(fā)的,使用maven進(jìn)行編譯打包。這里我們就不自己打包了,使用release安裝包。下載地址是:https://github.com/alibaba/nacos/releases。在linux系統(tǒng)下可以使用如下的命令下載和解壓縮。
#下載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
進(jìn)入到nacos/bin目錄下面,startup命令用于啟動(dòng)nacos,shutdown命令用于停掉nacos。

圖片:nacos啟動(dòng)命令
如果你是linux/unix系統(tǒng),使用sh startup.sh -m standalone腳本啟動(dòng)方式。
如果你是windows系統(tǒng),雙擊startup.cmd啟動(dòng)nacos。
nacos的默認(rèn)服務(wù)端口是8848,啟動(dòng)完成之后通過(guò)瀏覽器訪問(wèn)nacos:http://ip:8848/nacos/。看到如下界面,需要登陸,默認(rèn)的用戶名密碼都是nacos,登陸之后看到如下界面:

圖片:瀏覽器訪問(wèn)nacos
如果你訪問(wèn)不到上面的界面,請(qǐng)檢查你部署的主機(jī)操作系統(tǒng)的防火墻設(shè)置。以下是為CentOS7系統(tǒng)防火墻開(kāi)放8848端口的命令,其他系統(tǒng)請(qǐng)自行解決。
firewall-cmd?--zone=public?--add-port=8848/tcp?--permanent? firewall-cmd?--reload
三、查看主機(jī)網(wǎng)卡設(shè)備
使用ip addr命令查看linux主機(jī)的網(wǎng)絡(luò)設(shè)備

圖片:主機(jī)網(wǎng)絡(luò)設(shè)備
第一個(gè)lo網(wǎng)絡(luò)ip是回路ip,127.0.0.1,這個(gè)是標(biāo)配
第二個(gè)enp0s3網(wǎng)絡(luò)設(shè)備,ip是10.0.2.15,這個(gè)是因?yàn)槲业姆?wù)器網(wǎng)絡(luò)使用了雙網(wǎng)卡:橋接+HostOnly模式。正常的服務(wù)器是沒(méi)有的。
第三個(gè)enp0s8就是本服務(wù)器真正的使用到提供服務(wù)的網(wǎng)絡(luò)ip,如:192.168.161.4。
第四個(gè)網(wǎng)絡(luò)設(shè)備是因?yàn)槲以谶@臺(tái)虛擬機(jī)上安裝過(guò)docker,所以有一個(gè)docker0的網(wǎng)絡(luò)設(shè)備。
因?yàn)檩^多的網(wǎng)絡(luò)設(shè)備,導(dǎo)致我在后續(xù)安裝過(guò)程出現(xiàn)問(wèn)題。這里先賣個(gè)關(guān)子。
四、配置nacos集群
我們準(zhǔn)備了三臺(tái)服務(wù)器(虛擬機(jī)),192.168.161.3、192.168.161.4、192.168.161.5。在三臺(tái)服務(wù)器上分別下載、解壓nacos,并開(kāi)放8848端口。參考單點(diǎn)standalone部署的模式的操作。然后在conf/cluster.conf中加入三臺(tái)服務(wù)器的ip配置
#ip:port 192.168.161.3:8848 192.168.161.4:8848 192.168.161.5:8848
初始化 MySQL 數(shù)據(jù)庫(kù),sql源文件是在nacos/conf解壓目錄下面的nacos-mysql.sql文件。sql語(yǔ)句源文件。并在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說(shuō)明支持?jǐn)?shù)據(jù)持久化的數(shù)據(jù)庫(kù)類型,已知目前只支持mysql
db.num數(shù)據(jù)庫(kù)的數(shù)量,我們實(shí)驗(yàn)環(huán)境只有一個(gè)mysql數(shù)據(jù)庫(kù),所以是1
db.url.0表示第一個(gè)mysql數(shù)據(jù)庫(kù)的jdbc url連接。如果還有第二個(gè)、第三個(gè),請(qǐng)?jiān)黾觗b.url.n中的n。
問(wèn)題: 解決網(wǎng)卡獲取的不是我們希望綁定的網(wǎng)卡的問(wèn)題:當(dāng)我們配置完成之后,使用startup.sh命令啟動(dòng)。發(fā)現(xiàn)集群節(jié)點(diǎn)列表中并沒(méi)有任何記錄。而且后臺(tái)服務(wù)日志報(bào)錯(cuò),內(nèi)容如下:

圖片:網(wǎng)卡獲取的不是我們希望綁定的網(wǎng)卡
分析: 通過(guò)日志我們看到nacos程序自動(dòng)獲取的是10.0.2.15這個(gè)ip,而我們配置的是192.168.161.x的ip。二者不一致,所以報(bào)錯(cuò)。我們看一下獲取主機(jī)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是通過(guò)System.getProperty獲取的,所以我們完全可以通過(guò)JVM傳參指定ip。在startup.sh的啟動(dòng)腳本中增加nacos.server.ip參數(shù)。
#=================================================================================
#?JVM?Configuration
#================================================================================
#?單機(jī)模式對(duì)應(yīng)的啟動(dòng)參數(shù)
if?[[?"${MODE}"?==?"standalone"?]];?then
?JAVA_OPT="${JAVA_OPT}?-Xms512m?-Xmx512m?-Xmn256m"
?JAVA_OPT="${JAVA_OPT}?-Dnacos.standalone=true"
else
#?集群模式對(duì)應(yīng)的啟動(dòng)參數(shù)
?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"
#?新增以下參數(shù)設(shè)置本機(jī)ip地址
?JAVA_OPT="${JAVA_OPT}?-Dnacos.server.ip=你的服務(wù)器的ip"
fi當(dāng)以上工作都完成之后,我們通過(guò)瀏覽器分別訪問(wèn)nacos服務(wù),看到如下界面。集群管理的節(jié)點(diǎn)列表里面已經(jīng)有三各節(jié)點(diǎn),ip分別是192.168.161.3:8848、192.168.161.4:8848、192.168.161.5:8848。

圖片:nacos集群
五、nacos集群架構(gòu)
在完成nacos集群的配置之后,我們可以通過(guò)三個(gè)入口分別訪問(wèn)集群內(nèi)的nacos服務(wù),那下面的問(wèn)題就是如何將三個(gè)入口轉(zhuǎn)成一個(gè)入口。目前許多個(gè)人開(kāi)發(fā)者寫(xiě)的博客或教程中的方法就是在三個(gè)nacos服務(wù)的前端加一個(gè)負(fù)載均衡器,如:nginx、haproxy。然后號(hào)稱是生產(chǎn)級(jí)別的搭建方法,但這種方法是絕對(duì)不能用于生產(chǎn)的,因?yàn)槟愕膎ginx和haproxy是單點(diǎn),一旦nginx掛了,整個(gè)服務(wù)就掛了。

圖片:nacos集群+負(fù)載均衡
nacos官網(wǎng)推薦的方法是使用虛擬ip的方法,如下:

圖片:nacos集群+虛擬ip
最開(kāi)始虛擬ip192.168.161.6可能與192.168.161.3的主機(jī)綁定在一起,通過(guò)這兩個(gè)ip都可以訪問(wèn)192.168.161.3主機(jī)的nacos服務(wù)。
一旦192.168.161.3主機(jī)宕機(jī)或者其他網(wǎng)絡(luò)故障,192.168.161.6會(huì)自動(dòng)切換到與192.168.161.4或者192.168.161.5主機(jī)綁定在一起。這個(gè)過(guò)程被叫做虛擬ip的漂移。
這種虛擬ip的方法就是沒(méi)有使用到負(fù)載均衡,訪問(wèn)的仍然是某一個(gè)節(jié)點(diǎn)的nacos服務(wù),只不過(guò)形成了主從備份,提供了高可用。那既可以提供高可用,又可以提供負(fù)載均衡的辦法可能有的朋友已經(jīng)想到了,如下圖:

圖片:nacos集群+負(fù)載均衡+虛擬ip
在nacos服務(wù)的前端加上nginx或者h(yuǎn)aproxy的負(fù)載均衡器
然后對(duì)負(fù)載均衡器使用虛擬ip,通過(guò)keepalived實(shí)現(xiàn)虛擬ip的漂移
用戶訪問(wèn)負(fù)載均衡器實(shí)現(xiàn)對(duì)nacos服務(wù)的訪問(wèn),主nginx掛掉,虛擬ip漂移到從nginx負(fù)載均衡提供服務(wù)
六、nacos集群(虛擬ip漂移)
我們就拿官網(wǎng)中推薦的方法,使用虛擬ip訪問(wèn)nacos集群的方式做個(gè)例子講解一下。為什么不講第三種?一般系統(tǒng)架構(gòu)水平到了的人聽(tīng)懂這種方式就知道第三種方式怎么做,水平不到的人聽(tīng)了第三種仍然還是不懂。
6.1.安裝配置keepalived
在三臺(tái)服務(wù)器上分別安裝keepalived
yum?install?-y?keepalived
在三臺(tái)服務(wù)器上分別修改/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
?}
}一臺(tái)服務(wù)器是MASTER,其他的服務(wù)器為BACKUP
interface 配置為我們剛剛查看的網(wǎng)卡的名稱
virtual_router_id 必須一致,表示這三臺(tái)服務(wù)器搶用一個(gè)虛擬ip。
修改priority 優(yōu)先級(jí),三臺(tái)服務(wù)器要不一樣,比如:100、101、102,優(yōu)先級(jí)最高的優(yōu)先使用虛擬ip。MASTER的優(yōu)先級(jí)一定要高于BACKUP主機(jī)
advert_int 是幾臺(tái)服務(wù)器之間的同步檢查時(shí)間,1秒
authentication 的設(shè)置必須一致,這樣這幾臺(tái)服務(wù)器才能通信
修改virtual_ipaddress為三臺(tái)服務(wù)器所在網(wǎng)段內(nèi)未被占用的IP地址,比如:192.168.161.6
6.2.修改防火墻
CentOS7必須開(kāi)放防火墻配置,否則三臺(tái)主機(jī)無(wú)法就虛擬ip的使用優(yōu)先級(jí)通信,將都是MASTER,都配置虛擬ip。
firewall-cmd?--direct?--permanent?--add-rule?ipv4?filter?INPUT?0?--protocol?vrrp?-j?ACCEPT; firewall-cmd?--reload;
6.3.啟動(dòng)keepalived服務(wù)
sudo?systemctl?restart?keepalived.service
推薦:SpringBoot系列精品文章(16章97節(jié)),?http://springboot.zimug.com?
本號(hào)只做持續(xù)的知識(shí)輸出,希望您能關(guān)注、評(píng)論、轉(zhuǎn)發(fā)!您的支持是我不竭的創(chuàng)作動(dòng)力!讓知識(shí)產(chǎn)生價(jià)值、讓程序員改變世界!