通過對Eureka的認識,及Eureka集羣的搭建,已經基本能夠入門Eureka的使用。以前對於服務調用者咱們是直接獲取註冊列表後經過 get(0) 的方式來獲取第一個註冊信息。而當咱們服務提供者也搭建了集羣以後。這種方式是不可取的。那麼如何選擇一個合適的提供者來提供服務呢?java
首先排除咱們本身經過硬編碼的方式選。算法
以前接觸過Zookeeper的朋友應該對負載均衡這個詞不陌生,而Ribbon是另外的一種負載均衡程序,和Eureka同爲NetFlix公司開發,且在Eureka客戶端中集成了Ribbon。通常搭配使用。spring
基礎Ribbon實現的服務調用,是經過拉取到全部的服務列表組成(服務名+請求路徑)映射關係,藉助RestTemplate實現調用。api
在使用 Ribbon 進行服務調用的時候,應用的名稱只能使用 - 中劃線鏈接,不能使用下劃線。不然服務將沒法識別。app
@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
@GetMapping("teacher/users") public List getAllUser(){ return restTemplate.getForObject("http://SERVICE-PROVIDER/api/v1/users", List.class); }
根據其內置的負載均衡算法,在有多個服務提供方時,選擇合適的一個。Ribbon提供的負載均衡算法有:負載均衡
可經過配置直接修改:編碼
# 能夠經過 服務名:ribbon:NFLoadBalancerRuleClassName: 對應的策略全類名 SERVICE-PROVIDER: ribbon: NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule
除了服務調用和負載均衡,Ribbon家族還提供了容許接口調用時重試。使用方法以下:url
<dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> </dependency>
spring: cloud: loadbalancer: retry: enabled: true # 重試功能的開關 默認 true SERVICE-PROVIDER: ribbon: ConnectTimeout: 250 # 與服務提供方創建Http鏈接的超時時間 ReadTimeout: 1000 # 接收返回數據的超時時間 OkToRetryOnAllOperations: true # 是否對全部操做都進行重試 MaxAutoRetriesNextServer: 1 # 切換實例的重試次數 MaxAutoRetries: 1 # 對當前實例的重試次數(包含第一次請求,即配置1至關於請求超時就切換)
若是按照上面的配置,當消費方向提供方嘗試創建鏈接後250ms未能成功,就會直接切換至下一個服務方嘗試鏈接(autoRetries = MaxAutoRetries = 1)。此時若是還失敗(autoRetriesNextServer = MaxAutoRetriesNextServer = 1),則請求失敗。能夠根據業務需求進行實際的配置.net