源碼倉庫:github-CNXMBuyu-springclouddemo
Eureka
用法看源碼
服務註冊中心的一些基本操作如下圖:
- EurekaClient:包含服務提供者和服務調用者
- EurekaServer:Eureka服務器
register - 服務註冊
EurekaClient向EurekaServer提供自身的元數據。
renew - 服務續約
EurekaClient在默認情況下,每隔30秒會發送一次心跳來進行服務續約。通過服務續約來告知服務器,該EurekaClient是可用的。
正常情況下,如果EurekaServer在90秒內沒有收到EurekaClient的心跳,則會將EurekaClient實例從註冊列表中移除。
fetchRegistry - 獲取服務註冊列表信息
EurekaClient從EurekaServer獲取服務註冊表信息,並將其緩存在本地。EurekaClient會使用服務註冊列表信息查找其他服務的信息,從而進行遠程調用。
默認30秒更新一次
cancel - 服務下線
EurekaClient在程序關閉時可以向EurekaServer發送下線請求。
DiscoveryManager.getInstance().shutdownComponent();
構建EurekaServer集羣
Ribbon
用法看源碼
在測試負載均衡時,需要把配置eureka.instance.preferIpAddress=true加上,不然會調用超時(或者配置hosts文件也可以)。
簡介
將負載均衡邏輯以代碼的形式封裝到服務消費者的客戶端上,服務消費者客戶端維護了一份服務提供者的信息列表,有了信息列表,通過負載均衡策略將請求分攤給多個服務提供者,從而達到負載均衡的目的。
Ribbon作爲服務消費者的負載均衡器,有兩種使用方式。一種是和RestTemplate相結合,另一種是和Feign相結合。
LoadBalancerClient介紹
負載均衡器LoadBalancerClient是從EurekaClient獲取服務註冊列表信息的,並將服務註冊列表信息緩存一份。根據負載均衡策略選擇一個服務實例的信息,從而進行負載均衡。
可以通過配置ribbon.eureka.enable=false,來禁止調用EurekaClient獲取註冊列表,通過配置stores.ribbon.listOfServers=a.com,b.com
IRule
- BestAvailableRule:選擇最小請求數
- ClientConfigEnabledRoundRobinRule:輪詢
- RandomRule:隨機選擇一個server
- RoundRobinRule:輪詢選擇server
- RetryRule:根據輪詢的方式重試
- WeightedResponseTimeRule:根據響應時間分配一個weight,weight越低,被選擇的可能性就越低
- ZoneAvoidanceRule:根據server的zone區域和可用性來輪詢選擇
// 改變負載均衡的策略
@Bean
public IRule rule(){
return new RandomRule();
}
IPing
- PingUrl:真實地去ping某個url,判斷其是否可用
- PingConstant:固定返回某個服務是否可用,默認返回true,即可用
- NoOpPing:不去ping,直接返回true,即可用
- DummyPing:直接返回true,並實現了initWithNiwsConfig方法
- NIWSDisconveryPing:根據DiscoveryEnabledServer的InstanceInfo的InstancesStatus去判斷,如果爲InstanceStatus.UP,則可用,否則不可用。
負載均衡原理
- 通過EurekaClient獲取服務註冊列表
- 通過IPing,默認每10秒發送一次ping,來更新服務的註冊列表信息
- 根據負載均衡策略來實現負載均衡
Feign
用法看源碼
Hystrix
工作機制
- 當某個API服務在一定時間內失敗的次數大於設定的閾值,則打開熔斷器;打開熔斷器的服務會執行快速失敗的邏輯(即fallback指定的方法)
- 處於打開的熔斷器,過一段時間會處於半打開模式狀態。(一部分執行正常邏輯,一部分執行失敗邏輯)
- 自我修復能力。當執行正常邏輯的請求都成功了,則關閉熔斷器,否則繼續打開熔斷器。