Nacos

Nacos可以分為服務(wù)發(fā)現(xiàn)(Naming)和配置管理(Config)兩塊,而從使用上來說,又可分為Nacos服務(wù)端和客戶端,第一篇先來聊下服務(wù)發(fā)現(xiàn)(Naming)的客戶端。

Example

我們從官方示例入手。

Properties properties = new Properties();properties.setProperty("serverAddr", System.getProperty("serverAddr"));properties.setProperty("namespace", System.getProperty("namespace"));

NamingService naming = NamingFactory.createNamingService(properties);

naming.registerInstance("nacos.test.3", "11.11.11.11", 8888, "TEST1");

naming.registerInstance("nacos.test.3", "2.2.2.2", 9999, "DEFAULT");

System.out.println(naming.getAllInstances("nacos.test.3"));

naming.deregisterInstance("nacos.test.3", "2.2.2.2", 9999, "DEFAULT");

System.out.println(naming.getAllInstances("nacos.test.3"));

naming.subscribe("nacos.test.3", new EventListener() {

@Override

public void onEvent(Event event) {

System.out.println(((NamingEvent)event).getServiceName());

System.out.println(((NamingEvent)event).getInstances());

}

});

NamingService

從官方示例可以了解到,對(duì)于我們使用者來說,NamingService是Nacos對(duì)外提供給使用者的接口,其實(shí)現(xiàn)類為com.alibaba.nacos.client.naming.NacosNamingService,歸納起來,NamingService提供了以下方法:

registerInstance:注冊(cè)實(shí)例。

deregisterInstance:注銷實(shí)例。

getAllInstances:獲取某一服務(wù)的所有實(shí)例。

selectInstances:獲取某一服務(wù)健康或不健康的實(shí)例。

selectOneHealthyInstance:根據(jù)權(quán)重選擇一個(gè)健康的實(shí)例。

getServerStatus:檢測(cè)服務(wù)端健康狀態(tài)。

subscribe:注冊(cè)對(duì)某個(gè)服務(wù)的監(jiān)聽。

unsubscribe:注銷對(duì)某個(gè)服務(wù)的監(jiān)聽。

getSubscribeServices:獲取被監(jiān)聽的服務(wù)。

getServicesOfServer:獲取命名空間(namespace)下的所有服務(wù)名?!咀ⅲ捍朔椒ㄓ袀€(gè)小坑,參數(shù)pageNo要從1開始】

核心類

Naming Client的幾個(gè)核心類及其關(guān)系如下圖。我們分別來看一下這幾個(gè)類。


core-class

NacosNamingService

NacosNamingService是NamingService接口的實(shí)現(xiàn)類。實(shí)現(xiàn)了上面提到的那些方法。

此外,NacosNamingService還起到了初始化其他核心類的作用,因?yàn)閷?duì)外提供的方法都是委托給其他核心類處理的。按順序?qū)⒁来纬跏蓟疎ventDispatcher、NamingProxy、BeatReactor、HostReactor。

從NacosNamingService的構(gòu)造函數(shù)我們也可以了解到,可以進(jìn)行一些參數(shù)的自定義,總結(jié)如下(部分概念的含義可參考官方文檔):

EventDispatcher

EventDispatcher與其他事件分發(fā)的組件沒什么不同,用于處理subscribe、unsubscribe等等與服務(wù)監(jiān)聽相關(guān)的方法,并分發(fā)NamingEvent到各Listener。

成員變量ConcurrentMap> observerMap保存了注冊(cè)的Listener,key為{服務(wù)名}@@{集群名},value為各個(gè)EventListener的列表。

EventDispatcher會(huì)啟動(dòng)1個(gè)名為com.alibaba.nacos.naming.client.listener的線程用于處理事件的分發(fā)。

注意點(diǎn):

分發(fā)NamingEvent時(shí),按照subscribe(…)方法的調(diào)用順序串行依次調(diào)用EventListener的onEvent(…)方法。

調(diào)用subscribe(…)方法會(huì)引起對(duì)應(yīng)Service的事件分發(fā)。

NamingProxy

NamingProxy用于與Nacos服務(wù)端通信,注冊(cè)服務(wù)、注銷服務(wù)、發(fā)送心跳等都經(jīng)由NamingProxy來請(qǐng)求服務(wù)端。

NamingProxy會(huì)啟動(dòng)1個(gè)名為com.alibaba.nacos.client.naming.serverlist.updater的線程,用于定期調(diào)用refreshSrvIfNeed()方法更新Nacos服務(wù)端地址,默認(rèn)間隔為30秒,

對(duì)服務(wù)端API的調(diào)用將在后文總結(jié)。

注意點(diǎn):refreshSrvIfNeed()方法對(duì)Nacos服務(wù)端地址的更新僅在使用endpoint的時(shí)候才會(huì)進(jìn)行實(shí)際更新,如果是通過serverAddr配置的Nacos服務(wù)端地址,refreshSrvIfNeed()方法將不會(huì)進(jìn)行任何操作。

BeatReactor

BeatReactor用于向Nacos服務(wù)端發(fā)送已注冊(cè)服務(wù)的心跳。

成員變量Map dom2Beat中保存了需要發(fā)送的BeatInfo,key為{serviceName}#{ip}#{port},value為對(duì)應(yīng)的BeatInfo。

BeatReactor會(huì)啟動(dòng)名為com.alibaba.nacos.naming.beat.sender的線程來發(fā)送心跳,默認(rèn)線程數(shù)為1~CPU核心數(shù)的一半,可由namingClientBeatThreadCount參數(shù)指定。

默認(rèn)情況下每5秒發(fā)送一次心跳,可根據(jù)Nacos服務(wù)端返回的clientBeatInterval的值調(diào)整心跳間隔。

注意點(diǎn):0.8版本有一個(gè)小bug,客戶端心跳間隔并不受服務(wù)端返回值的控制。我已提交PR,預(yù)計(jì)將在0.9版本修復(fù)。

HostReactor

HostReactor用于獲取、保存、更新各Service實(shí)例信息。

成員變量Map serviceInfoMap中保存了已獲取到的服務(wù)的信息,key為{服務(wù)名}@@{集群名}。

HostReactor會(huì)啟動(dòng)名為com.alibaba.nacos.client.naming.updater的線程來更新服務(wù)信息,默認(rèn)線程數(shù)為1~CPU核心數(shù)的一半,可由namingPollingThreadCount參數(shù)指定。定時(shí)任務(wù)UpdateTask會(huì)根據(jù)服務(wù)的cacheMillis值定時(shí)更新服務(wù)信息,默認(rèn)值為10秒。該定時(shí)任務(wù)會(huì)在獲取某一服務(wù)信息時(shí)創(chuàng)建,保存在成員變量Map> futureMap中。

其他

PushReceiver

PushReceiver用于接收Nacos服務(wù)端的推送,初始化時(shí)會(huì)創(chuàng)建DatagramSocket使用UDP的方式接收推送。會(huì)啟動(dòng)1個(gè)名為com.alibaba.nacos.naming.push.receiver的線程。

FailoverReactor

用于故障轉(zhuǎn)移,會(huì)啟動(dòng)1個(gè)名為com.alibaba.nacos.naming.failover的線程并定時(shí)讀取名為00-00—000-VIPSRV_FAILOVER_SWITCH-000—00-00的文件,內(nèi)容為1時(shí)表示開啟,此時(shí)獲取服務(wù)信息時(shí)會(huì)返回FailoverReactor緩存的服務(wù)信息。

Balancer

根據(jù)服務(wù)實(shí)例的權(quán)重挑選一個(gè)實(shí)例,實(shí)現(xiàn)簡(jiǎn)單的負(fù)載均衡。

DiskCache

用于服務(wù)信息的持久化。

Naming API

API匯總?cè)缦拢?/p>

MethodURI含義

POST/nacos/v1/ns/instance注冊(cè)實(shí)例

DELETE/nacos/v1/ns/instance注銷實(shí)例

GET/nacos/v1/ns/instance/list獲取實(shí)例列表

PUT/nacos/v1/ns/instance/beat發(fā)送心跳

GET/nacos/v1/ns/api/helloNacos服務(wù)端狀態(tài)

GET/nacos/v1/ns/service/list獲取所有服務(wù)名

參數(shù)列表及示例

注冊(cè)實(shí)例

key含義備注

namespaceId命名空間默認(rèn)為public

ip實(shí)例IP地址?

port實(shí)例端口?

weight權(quán)重默認(rèn)為1.0

enable是否開啟默認(rèn)為true

healthy健康狀態(tài)默認(rèn)為true

metadata其他信息?

serviceName服務(wù)名?

clusterName集群名默認(rèn)為DEFAULT

請(qǐng)求示例:http://localhost:8848/nacos/v1/ns/instance?metadata=%7B%7D&namespaceId=public&port=8888&enable=true&healthy=true&ip=11.11.11.11&clusterName=TEST1&weight=1.0&serviceName=nacos.test.3&encoding=UTF-8&

返回示例:ok

注銷實(shí)例

key含義備注

namespaceId命名空間默認(rèn)為public

ip實(shí)例IP地址?

port實(shí)例端口?

serviceName服務(wù)名?

clusterName集群名默認(rèn)為DEFAULT

請(qǐng)求示例:http://localhost:8848/nacos/v1/ns/instance?cluster=DEFAULT&serviceName=nacos.test.3&encoding=UTF-8&namespaceId=public&port=9999&ip=2.2.2.2&

返回示例:ok

獲取實(shí)例列表

key含義備注

namespaceId命名空間默認(rèn)為public

serviceName服務(wù)名?

clusters集群名默認(rèn)為DEFAULT

udpPort監(jiān)聽的UPD端口號(hào)由PushReceiver創(chuàng)建

clientIP客戶端IP?

healthyOnly是否只返回健康的實(shí)例

請(qǐng)求示例:http://localhost:8848/nacos/v1/ns/instance/list?healthyOnly=false&namespaceId=public&clientIP=172.16.20.114&serviceName=nacos.test.3&udpPort=53957&encoding=UTF-8&

返回示例:{“metadata”:{},”dom”:”nacos.test.3”,”cacheMillis”:10000,”useSpecifiedURL”:false,”hosts”:[{“valid”:true,”marked”:false,”metadata”:{},”instanceId”:”2.2.2.2#9999#DEFAULT#nacos.test.3”,”port”:9999,”ip”:”2.2.2.2”,”clusterName”:”DEFAULT”,”weight”:1.0,”serviceName”:”nacos.test.3”,”enabled”:true},{“valid”:true,”marked”:false,”metadata”:{},”instanceId”:”11.11.11.11#8888#TEST1#nacos.test.3”,”port”:8888,”ip”:”11.11.11.11”,”clusterName”:”TEST1”,”weight”:1.0,”serviceName”:”nacos.test.3”,”enabled”:true}],”checksum”:”bd1054e6afb8d10730d945d74c4ce4421550584589236”,”lastRefTime”:1550584589236,”env”:””,”clusters”:””}

發(fā)送心跳

key含義備注

namespaceId命名空間默認(rèn)為public

serviceName服務(wù)名?

beatBeatInfo的JSON字符串

BeatInfo對(duì)象結(jié)構(gòu)如下,與Instance對(duì)象類似:

field含義備注

port端口?

ipIP地址?

weight權(quán)重?

metadata其他信息?

serviceName服務(wù)名?

clusterName集群名?

scheduled是否心跳中這個(gè)是BeatReactor用來標(biāo)識(shí)狀態(tài)的

請(qǐng)求示例:http://localhost:8848/nacos/v1/ns/instance/beat?beat=%7B%22cluster%22%3A%22DEFAULT%22%2C%22ip%22%3A%222.2.2.2%22%2C%22metadata%22%3A%7B%7D%2C%22port%22%3A9999%2C%22scheduled%22%3Atrue%2C%22serviceName%22%3A%22nacos.test.3%22%2C%22weight%22%3A1.0%7D&serviceName=nacos.test.3&encoding=UTF-8&namespaceId=public&

返回示例:{“clientBeatInterval”:5000}

Nacos服務(wù)端狀態(tài)

key含義備注

namespaceId命名空間默認(rèn)為public

請(qǐng)求示例:http://localhost:8848/nacos/v1/ns/api/hello?encoding=UTF-8&namespaceId=public&

返回示例:{“msg”:”Hello! I am Nacos-Naming and healthy! total services: raft 2, local port:8848”}

獲取所有服務(wù)名

key含義備注

namespaceId命名空間默認(rèn)為public

pageNo頁碼注意從1開始

pageSize返回?cái)?shù)量?

selector過濾器

請(qǐng)求示例:http://localhost:8848/nacos/v1/ns/service/list?pageSize=100&encoding=UTF-8&namespaceId=public&pageNo=0&

返回示例:{“count”:1,”doms”:[“nacos.test.3”]}

結(jié)語

Nacos服務(wù)發(fā)現(xiàn)的客戶端較為簡(jiǎn)單,其他語言也可以參照其API來實(shí)現(xiàn)客戶端。如果對(duì)源碼實(shí)現(xiàn)感興趣,可以自己看下代碼。

原文地址:https://www.cnblogs.com/lykbk/p/werwerwer35434343434343.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容