微服務(wù)管理平臺nacos虛擬ip負載均衡集群模式搭建
一尿扯、Nacos簡介
Nacos是用于微服務(wù)管理的平臺坚弱,其核心功能是服務(wù)注冊與發(fā)現(xiàn)稍味、服務(wù)配置管理隧熙。
Nacos作為服務(wù)注冊發(fā)現(xiàn)組件,可以替換Spring Cloud應(yīng)用中傳統(tǒng)的服務(wù)注冊于發(fā)現(xiàn)組件睬魂,如:Eureka终吼、consul等,支持服務(wù)的健康檢查氯哮。
Nacos作為服務(wù)配置中心际跪,可以替換Spring Cloud Config。
當然Nacos作為一個微服務(wù)管理平臺喉钢,除了面向spring Cloud,還支持很多其他的微服務(wù)基礎(chǔ)設(shè)施姆打,如:docker、dubbo肠虽、kubernetes等穴肘。除了核心的服務(wù)注冊與發(fā)現(xiàn)和配置管理功能,還提供了各種服務(wù)管理的功能特性舔痕,如:動態(tài)DNS、服務(wù)元數(shù)據(jù)管理等豹缀。
二伯复、Nacos單點部署
Nacos支持單點部署的模式,搭建過程非常簡單邢笙,實際上nacos的standalone模式?jīng)]有所謂的安裝過程啸如,就是下載和啟動。但是這種情況沒有高可用支持氮惯,所以只適合測試或?qū)W習(xí)使用叮雳。
首先去nacos的github地址下載release安裝包。當然你也可以自己下載源碼之后進行編譯打包妇汗,nacos是使用java開發(fā)的帘不,使用maven進行編譯打包。這里我們就不自己打包了杨箭,使用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
進入到nacos/bin目錄下面辽狈,startup命令用于啟動nacos,shutdown命令用于停掉nacos呛牲。
圖片:nacos啟動命令
如果你是linux/unix系統(tǒng)刮萌,使用sh startup.sh -m standalone腳本啟動方式。
如果你是windows系統(tǒng)娘扩,雙擊startup.cmd啟動nacos着茸。
nacos的默認服務(wù)端口是8848,啟動完成之后通過瀏覽器訪問nacos:http://ip:8848/nacos/畜侦≡樱看到如下界面旋膳,需要登陸,默認的用戶名密碼都是nacos擅羞,登陸之后看到如下界面:
圖片:瀏覽器訪問nacos
如果你訪問不到上面的界面,請檢查你部署的主機操作系統(tǒng)的防火墻設(shè)置义图。以下是為CentOS7系統(tǒng)防火墻開放8848端口的命令,其他系統(tǒng)請自行解決碱工。
firewall-cmd?--zone=public?--add-port=8848/tcp?--permanent? firewall-cmd?--reload
三、查看主機網(wǎng)卡設(shè)備
使用ip addr命令查看linux主機的網(wǎng)絡(luò)設(shè)備
圖片:主機網(wǎng)絡(luò)設(shè)備
第一個lo網(wǎng)絡(luò)ip是回路ip怕篷,127.0.0.1,這個是標配
第二個enp0s3網(wǎng)絡(luò)設(shè)備历筝,ip是10.0.2.15,這個是因為我的服務(wù)器網(wǎng)絡(luò)使用了雙網(wǎng)卡:橋接+HostOnly模式。正常的服務(wù)器是沒有的梳猪。
第三個enp0s8就是本服務(wù)器真正的使用到提供服務(wù)的網(wǎng)絡(luò)ip蒸痹,如:192.168.161.4。
第四個網(wǎng)絡(luò)設(shè)備是因為我在這臺虛擬機上安裝過docker匿沛,所以有一個docker0的網(wǎng)絡(luò)設(shè)備榛鼎。
因為較多的網(wǎng)絡(luò)設(shè)備公给,導(dǎo)致我在后續(xù)安裝過程出現(xiàn)問題蜘渣。這里先賣個關(guān)子。
四腿准、配置nacos集群
我們準備了三臺服務(wù)器(虛擬機)拾碌,192.168.161.3、192.168.161.4弟跑、192.168.161.5防症。在三臺服務(wù)器上分別下載蔫敲、解壓nacos,并開放8848端口奈嘿。參考單點standalone部署的模式的操作裙犹。然后在conf/cluster.conf中加入三臺服務(wù)器的ip配置
#ip:port 192.168.161.3:8848 192.168.161.4:8848 192.168.161.5:8848
初始化 MySQL 數(shù)據(jù)庫,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說明支持數(shù)據(jù)持久化的數(shù)據(jù)庫類型平项,已知目前只支持mysql
db.num數(shù)據(jù)庫的數(shù)量闽瓢,我們實驗環(huán)境只有一個mysql數(shù)據(jù)庫,所以是1
db.url.0表示第一個mysql數(shù)據(jù)庫的jdbc url連接缺猛。如果還有第二個、第三個荔燎,請增加db.url.n中的n有咨。
問題: 解決網(wǎng)卡獲取的不是我們希望綁定的網(wǎng)卡的問題:當我們配置完成之后,使用startup.sh命令啟動婉商。發(fā)現(xiàn)集群節(jié)點列表中并沒有任何記錄渣叛。而且后臺服務(wù)日志報錯,內(nèi)容如下:
圖片:網(wǎng)卡獲取的不是我們希望綁定的網(wǎng)卡
分析: 通過日志我們看到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參數(shù)墓赴。
#================================================================================= #?JVM?Configuration #================================================================================ #?單機模式對應(yīng)的啟動參數(shù) if?[[?"${MODE}"?==?"standalone"?]];?then ?JAVA_OPT="${JAVA_OPT}?-Xms512m?-Xmx512m?-Xmn256m" ?JAVA_OPT="${JAVA_OPT}?-Dnacos.standalone=true" else #?集群模式對應(yī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è)置本機ip地址 ?JAVA_OPT="${JAVA_OPT}?-Dnacos.server.ip=你的服務(wù)器的ip" fi
當以上工作都完成之后诫硕,我們通過瀏覽器分別訪問nacos服務(wù)章办,看到如下界面滨彻。集群管理的節(jié)點列表里面已經(jīng)有三各節(jié)點挪蹭,ip分別是192.168.161.3:8848、192.168.161.4:8848冬骚、192.168.161.5:8848懂算。
圖片:nacos集群
五计技、nacos集群架構(gòu)
在完成nacos集群的配置之后,我們可以通過三個入口分別訪問集群內(nèi)的nacos服務(wù)舍悯,那下面的問題就是如何將三個入口轉(zhuǎn)成一個入口睡雇。目前許多個人開發(fā)者寫的博客或教程中的方法就是在三個nacos服務(wù)的前端加一個負載均衡器,如:nginx秕豫、haproxy观蓄。然后號稱是生產(chǎn)級別的搭建方法侮穿,但這種方法是絕對不能用于生產(chǎn)的,因為你的nginx和haproxy是單點回铛,一旦nginx掛了克锣,整個服務(wù)就掛了。
圖片:nacos集群+負載均衡
nacos官網(wǎng)推薦的方法是使用虛擬ip的方法免姿,如下:
圖片:nacos集群+虛擬ip
最開始虛擬ip192.168.161.6可能與192.168.161.3的主機綁定在一起胚膊,通過這兩個ip都可以訪問192.168.161.3主機的nacos服務(wù)想鹰。
一旦192.168.161.3主機宕機或者其他網(wǎng)絡(luò)故障辑舷,192.168.161.6會自動切換到與192.168.161.4或者192.168.161.5主機綁定在一起。這個過程被叫做虛擬ip的漂移肢础。
這種虛擬ip的方法就是沒有使用到負載均衡碌廓,訪問的仍然是某一個節(jié)點的nacos服務(wù),只不過形成了主從備份慨蛙,提供了高可用纪挎。那既可以提供高可用,又可以提供負載均衡的辦法可能有的朋友已經(jīng)想到了通砍,如下圖:
圖片:nacos集群+負載均衡+虛擬ip
在nacos服務(wù)的前端加上nginx或者haproxy的負載均衡器
然后對負載均衡器使用虛擬ip埠帕,通過keepalived實現(xiàn)虛擬ip的漂移
用戶訪問負載均衡器實現(xiàn)對nacos服務(wù)的訪問玖绿,主nginx掛掉,虛擬ip漂移到從nginx負載均衡提供服務(wù)
六呐籽、nacos集群(虛擬ip漂移)
我們就拿官網(wǎng)中推薦的方法蚀瘸,使用虛擬ip訪問nacos集群的方式做個例子講解一下贮勃。為什么不講第三種?一般系統(tǒng)架構(gòu)水平到了的人聽懂這種方式就知道第三種方式怎么做奏瞬,水平不到的人聽了第三種仍然還是不懂。
6.1.安裝配置keepalived
在三臺服務(wù)器上分別安裝keepalived
yum?install?-y?keepalived
在三臺服務(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 ?} }
一臺服務(wù)器是MASTER,其他的服務(wù)器為BACKUP
interface 配置為我們剛剛查看的網(wǎng)卡的名稱
virtual_router_id 必須一致并淋,表示這三臺服務(wù)器搶用一個虛擬ip珍昨。
修改priority 優(yōu)先級镣典,三臺服務(wù)器要不一樣,比如:100兄春、101神郊、102,優(yōu)先級最高的優(yōu)先使用虛擬ip蜻懦。MASTER的優(yōu)先級一定要高于BACKUP主機
advert_int 是幾臺服務(wù)器之間的同步檢查時間夕晓,1秒
authentication 的設(shè)置必須一致,這樣這幾臺服務(wù)器才能通信
修改virtual_ipaddress為三臺服務(wù)器所在網(wǎng)段內(nèi)未被占用的IP地址征炼,比如:192.168.161.6
6.2.修改防火墻
CentOS7必須開放防火墻配置躬贡,否則三臺主機無法就虛擬ip的使用優(yōu)先級通信拂玻,將都是MASTER,都配置虛擬ip魄懂。
firewall-cmd?--direct?--permanent?--add-rule?ipv4?filter?INPUT?0?--protocol?vrrp?-j?ACCEPT; firewall-cmd?--reload;
6.3.啟動keepalived服務(wù)
sudo?systemctl?restart?keepalived.service
推薦:SpringBoot系列精品文章(16章97節(jié)),?http://springboot.zimug.com?
本號只做持續(xù)的知識輸出闯第,希望您能關(guān)注、評論填帽、轉(zhuǎn)發(fā)盲赊!您的支持是我不竭的創(chuàng)作動力敷扫!讓知識產(chǎn)生價值、讓程序員改變世界绘迁!