Nacos實現原理(一) 註冊原理

2021-10-24 07:32:53 字數 2655 閱讀 5778

服務(service)是 nacos 世界的一等公民。nacos 支援幾乎所有主流型別的「服務」的發現、配置和管理,nacos關鍵的特性包括服務發現和服務家門康監測、動態配置服務、動態dns服務、服務及其元資料管理。

本文主要介紹nacos的某些原理,希望通過架構一步一步逐層分析,來了解其原理。需要在閱讀本文之前對nacos有一定的認識。

本文主要通過nacos的架構以及實現註冊中心的原理來進一步進行了解。

[外鏈轉存失敗,源站可能有防盜煉機制,建議將儲存下來直接上傳(img-l1yiz4ho-1599182142543)(./images/1599101606799.png)]

nacos server: nacos服務提供者,裡面包含的open api是功能訪問入口,config service、name service是nacos提供的配置服務、名字服務模組。consistency protocol是一致性協議,用來實現nacos集群節點的資料同步,這裡使用的是raft演算法(使用類似演算法的還有etcd、redis哨兵選舉)。

nacos console:nacos控制台

原始碼部分,從三部分看:

有乙個類叫做org.springframework.cloud.client.serviceregistry.serviceregistry,原始碼如下:

package org.springframework.cloud.client.serviceregistry;

/** * contract to register and deregister instances with a service registry.

* * @param registration meta data

* @author spencer gibb

* @since 1.2.0

*/public

inte***ce

serviceregistry

registration

>

如果工程中引入了nacos,應該能找到nacos實現com.alibaba.cloud.nacos.registry.nacosserviceregistry

spring cloud通過

spring-cloud-commons\meta-inf\spring.factories檔案中配置的org.springframework.cloud.client.serviceregistry.autoserviceregistrationautoconfiguration類來自動化服務註冊。

同樣是通過spring-cloud-alibaba-dubbo下的meta-inf\spring.factories檔案中自動裝配了和服務註冊相關的配置類dubboloadblanceresttemplateautoconfiguration.

register()中,呼叫了nacos client sdk中的this.namingservice.registerinstance()完成服務的註冊。

registerinstance()實現的主要邏輯是:

先重點來看看心跳邏輯,原始碼如下:

public

void

addbeatinfo

(string servicename, beatinfo beatinfo)

to beat map."

, beatinfo)

; string key =

this

.buildkey

(servicename, beatinfo.

getip()

, beatinfo.

getport()

);beatinfo existbeat = null;if(

(existbeat =

(beatinfo)

this

.dom2beat.

remove

(key)

)!= null)

this

.dom2beat.

put(key, beatinfo)

;//利用定時排程傳送心跳包

this

.executorservice.

schedule

(new

beatreactor.beattask

(beatinfo)

, beatinfo.

getperiod()

, timeunit.milliseconds)

; metricsmonitor.

getdom2beatsizemonitor()

.set((

double

)this

.dom2beat.

size()

);}

從原始碼看,所謂的心跳機制就是客戶端通過定製任務向服務端傳送乙個資料報,然後啟動乙個執行緒不斷地檢測服務端的回應,如果在設定時間內沒有收到服務端的回應,則認為伺服器出現了故障。nacos服務端會根據客戶端的心跳包不斷更新服務的資訊。

nacos提供了多種api

Nacos實現服務註冊與發現

服務註冊即服務例項將自身服務資訊註冊到註冊中心包括服務所在的ip和port,服務版本以及訪問協議等。dns就是乙個經典的服務註冊。服務發現即服務例項通過註冊中心,獲取到註冊到其中的服務例項的資訊,通過這些資訊去請求他們提供的服務。由於自動擴縮,故障與公升級,整組服務例項會動態變更的問題的存在所以我們...

Nacos的Raft演算法原理分析

什麼是raft演算法?raft是一種共識演算法,旨在替代paxos。它通過邏輯分離比paxos更容易理解,但它也被正式證明是安全的,並提供了一些額外的功能。1 raft提供了一種在計算系統集群中分布狀態機的通用方法,確保集群中的每個節點都同意一系列相同的狀態轉換。raft演算法解決了什麼問題?單節點...

Mybatis 實現原理 一

1.引入demo mybatis config檔案內容 select from city where id 入口 public class client 分析 1.載入mybatis config檔案並獲取乙個sqlsessionfactory,類圖如下 跟進 new sqlsessionfacto...