深入Nacos服務注冊中心的內核原理
Nacos client
nacos本身的話,其實是完全可以脫離spring cloud自己獨立運作的,但是他目前是集成到spring cloud alibaba里去的,【spring cloud alibaba】也就是在spring cloud的標准之下實現了一些東西,spring cloud自己是有一個接口,叫做ServiceRegistry,也就是服務注冊中心的概念
他是一個接口,nacos是實現了一個實現類的,也就是NacosServiceRegistry,實現了register、deregister、close、setStatus、getStatus之類的方法
自動裝配是一個spring boot的一個概念,如果大家不理解的話,可以自行搜索一些資料去查閱,用最最簡單的話來說,自動裝配的意思,其實就是說系統啟動的時候,自動裝配機制會運行,實現一些系統的初始化、自動做一些事兒
比如說spring cloud alibaba,假設用dubbo開發服務,本質上是有一個自動裝配類的,這個自動裝配類會監聽spring的ApplicationStartedEvent這個事件,其實簡單理解就是服務啟動的時候通過spring的一些動作,監聽到某個事件就自動運行了
自動運行,就是去調用NacosServiceRegistry的register方法去進行服務注冊
而且除了注冊之外,還會通過schedule線程池去提交一個定時調度任務,源碼如下:
this.exeutorService.schedule(new BeatReactor.BeatTask(beatInfo), beatInfo.getPeriod(), TimeUnit.MILLISECONDS),這就是一個心跳機制,定時發送心跳給nacos server
接着會進行注冊,注冊的話是訪問nacos server的open api,其實就是http接口,他有一個接口:http://31.208.59.24:8848/nacos/v1/ns/instance?serviceName=xx&ip=xx&port=xx,這么一個東西,也沒什么特別的,這里就是訪問注冊接口罷了
Nacos server
nacos server那里是基於一個ConcurrentHashMap作為注冊表來放服務信息的,直接會構造一個Service放到map里,然后對Service去add Instance,添加一個實例,【里面包含了ip和端口等】本質里面就是在維護信息,同時還會建立定時檢查實例心跳的機制
最后還會基於一致性協議,比如說raft協議,去把注冊同步給其他節點
【raft和ZAB協議類似,也有Leader和Follower】
服務發現的本質其實也是一個http接口【調用open api的接口】,就是:http://31.208.59.24:8848/nacos/v1/ns/instance/list?serviceName=xx
就這么一個接口,其實也沒特別的東西,然后就會啟動定時任務,每隔10s拉取一次最新的實例列表,然后服務端還會監聽他監聽服務的狀態,有異常就會基於UDP協議反向通知客戶端這次服務異常變動