天天看點

Spring-cloud Eureka注冊中心實作(源碼流程)

自動配置相關配置類

InstanceRegistryProperties

EurekaServerConfigBean 服務端配置資訊

EurekaClientConfigBean 用戶端配置資訊

EurekaInstanceConfigBean 執行個體資訊

EurekaDashboardProperties

用戶端注冊實作:

(1) EurekaClientConfiguration#eurekaApplicationInfo 初始化目前執行個體資訊ManagerInstanceInfoFactory#create

(2) EurekaClientConfiguration#eurekaClient 執行個體化 DiscoveryClient的一個子類

(3) DiscoveryClient#register#renew 過程中,如果傳回404狀态碼,則進行注冊

(4) AbstractJerseyEurekaHttpClient#register rest http請求

用戶端下架:

(1) EurekaDiscoveryClientConfiguration#onApplicationEvent spring上下文關閉時下架eureka服務

(2) DiscoveryClient#shutdown 改成DOWN

(3) DiscoveryClient#unregister 調用cancel接口

用戶端擷取服務資訊

(1) DiscoveryClient#refreshRegistry()

(2) EurekaHttpClient#getApplications()

用戶端心跳檢查機制

(1) HeartbeatThread

(2) DiscoveryClient#renew

服務端高可用實作

p2p機制

(1) EurekaServerAutoConfiguration#eurekaServerContext 上下文初始化

(2) PeerEurekaNodes#start 重新整理peer叢集清單并啟動更新任務,配置中擷取 (eureka還提供dns發現機制,不推薦使用)

(3) PeerEurekaNodes.updatePeerEurekaNodes 維護peer清單

資訊同步

(1) PeerAwareInstanceRegistryImpl 用來同步renew/register/cancel..

(2) isReplication 表示這個請求是否來自其他peer,防止循環傳播

服務端擷取請求注冊

(1) EurekaServerAutoConfiguration#jerseyApplication

內建eureka原生包中的Jersey RESTful接口 #jerseyFilterRegistration filter形式

(2) ApplicationResource#addInstance() 受理請求

(3) InstanceRegistry#register() 釋出EurekaInstanceRegisteredEvent事件

(4) PeerAwareInstanceRegistryImpl#register() 叢集同步replicateToPeers

(5) AbstractInstanceRegistry#regiter() 存在ConcurrentHashMap

服務端存儲服務資訊

(1) AbstractInstanceRegistry.registry() 記憶體中存儲ConcurrentHashMap

服務剔除

(1) EurekaServerInitializerConfiguration#start(), EurekaServerBootstrap#contextInitialized(), EurekaServerBootstrap#initEurekaServerContext() 初始化 上下文

(2) InstanceRegistry#openForTraffic()

(3) AbstractInstanceRegistry#postInit() 執行EvictionTask

(4) 自我保護狀态下不剔除

自我保護

(1) PeerAwareInstanceRegistryImpl#isLeaseExpirationEnabled()

(2) numberOfRenewsPerMinThreshold 正常态下,一分鐘會收到多少用戶端的renewx = size * renewalPercentThreshold

新服務注冊時會重新計算這個值

Spring-cloud Eureka注冊中心實作(源碼流程)

繼續閱讀