淺析Alibaba Nacos注冊(cè)中心源碼剖析
Nacos&Ribbon&Feign核心微服務(wù)架構(gòu)圖
架構(gòu)原理
- 微服務(wù)系統(tǒng)在啟動(dòng)時(shí)將自己注冊(cè)到服務(wù)注冊(cè)中心,同時(shí)外發(fā)布 Http 接口供其它系統(tǒng)調(diào)用(一般都是基于Spring MVC)
- 服務(wù)消費(fèi)者基于 Feign 調(diào)用服務(wù)提供者對(duì)外發(fā)布的接口,先對(duì)調(diào)用的本地接口加上注解@FeignClient,F(xiàn)eign會(huì)針對(duì)加了該注解的接口生成動(dòng)態(tài)代理,服務(wù)消費(fèi)者針對(duì) Feign 生成的動(dòng)態(tài)代理去調(diào)用方法時(shí),會(huì)在底層生成Http協(xié)議格式的請(qǐng)求,類似 /stock/deduct?productId=100
- Feign 最終會(huì)調(diào)用Ribbon從本地的Nacos注冊(cè)表的緩存里根據(jù)服務(wù)名取出服務(wù)提供在機(jī)器的列表,然后進(jìn)行負(fù)載均衡并選擇一臺(tái)機(jī)器出來(lái),對(duì)選出來(lái)的機(jī)器IP和端口拼接之前生成的url請(qǐng)求,生成調(diào)用的Http接口地址 http://192.168.0.60:9000/stock/deduct?productId=100,最后基于HTTPClient調(diào)用請(qǐng)求
Nacos架構(gòu)圖
Nacos核心功能點(diǎn)
服務(wù)注冊(cè):Nacos Client會(huì)通過(guò)發(fā)送REST請(qǐng)求的方式向Nacos Server注冊(cè)自己的服務(wù),提供自身的元數(shù)據(jù),比如ip地址、端口等信息。Nacos Server接收到注冊(cè)請(qǐng)求后,就會(huì)把這些元數(shù)據(jù)信息存儲(chǔ)在一個(gè)雙層的內(nèi)存Map中。
服務(wù)心跳:在服務(wù)注冊(cè)后,Nacos Client會(huì)維護(hù)一個(gè)定時(shí)心跳來(lái)持續(xù)通知Nacos Server,說(shuō)明服務(wù)一直處于可用狀態(tài),防止被剔除。默認(rèn)5s發(fā)送一次心跳。
服務(wù)健康檢查:Nacos Server會(huì)開啟一個(gè)定時(shí)任務(wù)用來(lái)檢查注冊(cè)服務(wù)實(shí)例的健康情況,對(duì)于超過(guò)15s沒(méi)有收到客戶端心跳的實(shí)例會(huì)將它的healthy屬性置為false(客戶端服務(wù)發(fā)現(xiàn)時(shí)不會(huì)發(fā)現(xiàn)),如果某個(gè)實(shí)例超過(guò)30秒沒(méi)有收到心跳,直接剔除該實(shí)例(被剔除的實(shí)例如果恢復(fù)發(fā)送心跳則會(huì)重新注冊(cè))
服務(wù)發(fā)現(xiàn):服務(wù)消費(fèi)者(Nacos Client)在調(diào)用服務(wù)提供者的服務(wù)時(shí),會(huì)發(fā)送一個(gè)REST請(qǐng)求給Nacos Server,獲取上面注冊(cè)的服務(wù)清單,并且緩存在Nacos Client本地,同時(shí)會(huì)在Nacos Client本地開啟一個(gè)定時(shí)任務(wù)定時(shí)拉取服務(wù)端最新的注冊(cè)表信息更新到本地緩存
服務(wù)同步:Nacos Server集群之間會(huì)互相同步服務(wù)實(shí)例,用來(lái)保證服務(wù)信息的一致性。
Nacos核心功能源碼架構(gòu)圖
Nacos服務(wù)注冊(cè)表結(jié)構(gòu):Map
<namespace, Map<group::serviceName, Service>>
舉例說(shuō)明:
Nacos服務(wù)端源碼單機(jī)運(yùn)行
# 下載nacos源碼 git clone https://github.com/alibaba/nacos.git
選擇Tag 1.4.1版本
源碼整體結(jié)構(gòu)(注意,nacos源碼導(dǎo)入要求maven 3.2.5以上版本):
1、源碼單機(jī)運(yùn)行:
直接運(yùn)行console模塊里的 com.alibaba.nacos.Nacos.java
# 增加啟動(dòng)vm參數(shù) -Dnacos.standalone=true
2、源碼集群運(yùn)行(啟動(dòng)流程參見(jiàn)視頻):
nacos集群需要配置mysql存儲(chǔ),需要先創(chuàng)建一個(gè)數(shù)據(jù),名字隨便取,然后執(zhí)行 distribution/conf 目錄下的 nacos-mysql.sql 腳本,然后修改 console\src\main\resources 目錄下的 application.properties 文件里的mysql配置,如下所示
### If use MySQL as datasource: spring.datasource.platform=mysql ### Count of DB: db.num=1 ### Connect URL of DB: db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=root
運(yùn)行console模塊里的 com.alibaba.nacos.Nacos.java,需要增加啟動(dòng)vm參數(shù)端口號(hào)和實(shí)例運(yùn)行路徑nacos.home(對(duì)應(yīng)的目錄需要自己提前創(chuàng)建好),每臺(tái)server的nacos.home目錄里需要?jiǎng)?chuàng)建一個(gè)conf文件夾,里面放一個(gè)cluster.conf文件,文件里需要把所有集群機(jī)器ip和端口寫入進(jìn)去,見(jiàn)下圖:
到此這篇關(guān)于淺析Alibaba Nacos注冊(cè)中心源碼剖析的文章就介紹到這了,更多相關(guān)Nacos注冊(cè)中心源碼內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MyBatis不同Mapper文件引用resultMap實(shí)例代碼
這篇文章主要介紹了mybatis 不同Mapper文件引用resultMap的實(shí)例代碼,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2017-07-07使用Spring?Security搭建極簡(jiǎn)的安全網(wǎng)站教程
這篇文章主要為大家介紹了使用Spring?Security搭建極簡(jiǎn)的安全網(wǎng)站教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06Java編程技巧:if-else優(yōu)化實(shí)踐總結(jié)歸納
這篇文章主要介紹了Java中避免過(guò)多if-else的幾種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2021-06-06Mybatis使用useGeneratedKeys獲取自增主鍵
這篇文章主要為大家介紹了Mybatis使用useGeneratedKeys獲取自增主鍵示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01java不用循環(huán)語(yǔ)句打印數(shù)組元素的實(shí)例
下面小編就為大家?guī)?lái)一篇java不用循環(huán)語(yǔ)句打印數(shù)組元素的實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03詳解idea從git上拉取maven項(xiàng)目詳細(xì)步驟
這篇文章主要介紹了詳解idea從git上拉取maven項(xiàng)目詳細(xì)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08JAVA 格式化JSON數(shù)據(jù)并保存到j(luò)son文件中的實(shí)例
這篇文章主要介紹了JAVA 格式化JSON數(shù)據(jù)并保存到j(luò)son文件中的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-10-10IDEA?2022?中的Lombok?使用基礎(chǔ)教程
? Lombok是使用java編寫的一款開源類庫(kù)。其主作用是使用注解來(lái)代替一些具有格式固定,沒(méi)有過(guò)多技術(shù)含量的編碼工作,這篇文章主要介紹了IDEA?2022?中的Lombok?使用基礎(chǔ)教程,需要的朋友可以參考下2022-12-12