1. 程式人生 > >SpringCloud實戰微服務之——Ribbon詳解

SpringCloud實戰微服務之——Ribbon詳解

自定義RibbonClient

如何為服務消費者自定義Ribbon Client?① 程式碼自定義RibbonClient所謂的自定義Ribbon Client的主要作用就是使用自定義配置替代Ribbon預設的負載均衡策略,注意:自定義的Ribbon Client是有針對性的,一般一個自定義的Ribbon Client是對一個服務提供者(包括服務名相同的一系列副本)而言的。自定義了一個Ribbon Client 它所設定的負載均衡策略只對某一特定服務名的服務提供者有效,但不能影響服務消費者與別的服務提供者通訊所使用的策略。根據官方文件的意思,推薦在 springboot主程式掃描的包範圍之外進行自定義配置類。其實純程式碼自定義RibbonClient的話有兩種方式:方式一:在springboot主程式掃描的包外定義配置類,然後為springboot主程式新增@RibbonClient註解引入配置類 
@Configuration
public class TestConfiguration {
    @Autowired
    private IClientConfig config;
    @Bean
    public IRule ribbonRule(IClientConfig config) { // 自定義為隨機規則
        return new RandomRule();
    }
}
注意:@RibbonClient註解中的name屬性是指服務提供者的服務名(即當前消費者使用自定義配置與其通訊的服務提供者的spring.application.name的屬性)
@RibbonClient(name = "microservice-provider-user",configuration = TestConfiguration.class)
方式二:在與springboot主程式的同一級目錄新建RibbonClient的配置類,但是必須在springboot掃描的包範圍內排除掉,方法是自定義註解標識配置類,然後在springboot的新增@ComponentScan根據自定義註解型別過濾掉配置類自定義註解 
public @interface ExcludeFromComponentScan {
}
自定義配置類
@Configuration
@ExcludeFromComponentScan
public class TestConfiguration1 {
    @Autowired
    private IClientConfig config;
    @Bean
    public IRule ribbonRule(IClientConfig config) { // 自定義為隨機規則
        return new RandomRule();
    }
}
在springboot主程式上添加註解
@RibbonClient(name = "microservice-provider-user",configuration = TestConfiguration1.class)
@ComponentScan(excludeFilters = {@ComponentScan.Filter(type = FilterType.ANNOTATION,value = ExcludeFromComponentScan.class)})
執行測試:


②  通過配置檔案自定義RibbonClient
官方文件地址:http://cloud.spring.io/spring-cloud-static/Camden.SR7/#_customizing_the_ribbon_client_using_properties
意思就是:配置RibbonClient規則是 <服務名>.ribbon.<型別>=與型別對應的類名(也可以自定義) 型別可以為一下幾個: NFLoadBalancerClassName: 應該實現 ILoadBalancer介面NFLoadBalancerRuleClassName: 應該實現 IRule介面NFLoadBalancerPingClassName: 應該實現 IPing介面NIWSServerListClassName: 應該實現ServerList介面NIWSServerListFilterClassName: 應該實現ServerListFilter介面詳解:獨立使用Spring Cloud Ribbon,在沒有引入Spring Cloud Eureka服務治理框架時, 預設介面實現類:1.IClientConfig:Ribbon的客戶端配置,預設採用com.netflix.cilent.config.DefaultClientConfigImpl實現。2.IRule:Ribbon的負載均衡策略,預設採用com.netflix.loadbalancer.ZoneAvoidanceRule實現,該策略能夠在多區 域環境下選擇出最佳區域的例項訪問。3.IPing:Ribbon的例項檢查策略,預設採用com.netflix.loadbalancer.NoOpPing實現,該檢查策略是一種特殊實現方式,實際上它並不會檢查例項是否可用,而是始終返回True,預設認為所有例項都可用。4.ServerList<Server>:服務例項清單的維護機制,預設採用com.netflix.loadbalancer.ConfigurationBasedServerList實現。5.ServerListFilter<Server>:服務例項清單過濾機制,預設採用org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter實現,該策略能夠優先過濾出與請求呼叫方處於同區域的服務例項。6.ILoadBalancer:負載均衡器,預設採用com.netflix.loadbalancer.ZoneAwareLoadBalancer實現,它具備區域感知能力Spring Cloud Eureka和Spring Cloud Ribbon結合使用,Ribbon預設介面實現類:1.IPing:Ribbon的例項檢查策略,預設採用com.netflix.niws.loadbalancer.NIWSDiscoveryPing實現,該檢查策略是一種特殊實現方式,實際上它並不會檢查例項是否可用,而是始終返回True,預設認為所有例項都可用2.ServerList<Server>:服務例項清單的維護機制,預設採用com.netflix.niws.loadbalancer.DiscoveryEnabledNIWSServerList實現,將所有服務清單交給Eureka的服務治理機制進行維護其中最常用的是配置RibbonClient的負載均衡規則,如下所示:application.yml中新增users:  ribbon:自帶的IRule實現類有以下幾個:BestAvailableRule 選擇最小請求數ClientConfigEnabledRoundRobinRule 輪詢RandomRule 隨機選擇一個serverRoundRobinRule 輪詢選擇serverRetryRule 根據輪詢的方式重試WeightedResponseTimeRule 根據響應時間去分配一個weight ,weight越低,被選擇的可能性就越低(響應時間加權)ZoneAvoidanceRule 根據server的zone區域和可用性來輪詢選擇注意:如果多種整合方式都存在的話是存在優先順序的,即 檔案配置優先順序 > 程式碼配置優先順序 > 預設配置優先順序使用示例如下:在application.yml中新增如下配置即可為請求microservice-provider-user的服務提供者時設定隨機策略。
microservice-provider-user:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
經過測試是完全可行的。

Ribbon脫離Eureka使用

官方描述地址:http://cloud.spring.io/spring-cloud-static/Camden.SR7/#spring-cloud-ribbon-without-eureka
Eureka是用於服務發現和服務註冊、以及使用服務名來解決服務消費者和服務提供者通訊時地址的硬編碼問題的。如果Ribbon脫離了Eureka,那麼在服務消費者端就無法根據服務名通過心跳機制從EurekaServer端獲取對應服務提供者的IP以及埠號。這時就需要在服務消費者端配置對應服務提供者的地址列表,然後Ribbon才能通過配置檔案或者自定義的RibbonClient或者預設的配置獲取負載均衡的輪詢策略進行請求分發。配置方式:第一步:檢查是否引入了Eureka。如果服務在依賴中添加了spring-cloud-starter-eureka,這種情況下如果想使Ribbon脫離Eureka使用的話就需要將Eureka禁用掉。僅僅需要新增以下配置,如果沒有引入Eureka就不需要禁用。 
ribbon:
  eureka:
   enabled: false
第二步:配置某服務提供者的地址列表以及均衡策略(預設是輪詢)
<服務提供者名稱>:
  ribbon:
    listOfServers: localhost:7901,localhost:7902
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
因為我的Demo中引入了Eureka,所以我的配置如下所示:
ribbon:
  eureka:
   enabled: false

microservice-provider-user:
  ribbon:
    listOfServers: localhost:7901,localhost:7902
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
具體程式碼已上傳GitHub,地址:https://github.com/liuxun1993728/ribbonDemo