Spring Cloud Ribbon是一個基於HTTP和TCP的客戶端負載均衡工具,它基於Netflix Ribbon實現,能夠將面向服務的REST模板請求自動轉換爲客戶端負載均衡的服務調用。java
負載均衡在系統架構中是一個很是重要且不得不去實施的內容。負載均衡是對系統的高可用,網絡壓力的緩解和處理能力的擴容的重要手段之一。一般所說的負載均衡是指服務端負載均衡,而客戶端負載均衡和服務端負載均衡最大的不一樣點在於服務清單所存儲的位置。在客戶端負載均衡中,全部的客戶端節點都維護着本身要訪問的服務端清單,也須要心跳去維護服務端清單的健康性,只是須要與註冊中心配合完成。spring
- 服務提供者啓動多個服務實例並註冊到一個或多個相關聯的服務註冊中心
@Bean @LoadBelanced RestTemplate restTemplate() { return new RestTemplate(); }
- 服務消費者經過調用被
@LoadBalanced
註解修飾的RestTemplate來實現面向服務的接口調用
@Autowired private RestTemplate restTemplate; @RequestMapping(value = "/ribbon-consumer", method = RequestMethod.GET) public String helloConsumer() { return restTemplate.getForEntity("http://HELLO-SERVICE/hello", String.class).getBody(); }
RestTemplate對象會使用Ribbon的自動化配置,同時經過配置@LoadBalanced
開啓客戶端的負載均衡。網絡
RestTemplate針對不一樣請求類型和參數類型的服務調用實現請參見JDK文檔。架構
在Ribbon中實現了很是多的選擇策略(IRule接口的各個實現)併發
AtomicInteger nextServerCyclicCounter
對象實現,每次進行實例選擇時調用incrementAndGetModulo
函數實現遞增。 在引入Spring Cloud Ribbon依賴後,構建如下接口的實現app
interface | description | default |
---|---|---|
IClientConfig | Ribbon客戶端配置 | com.netflix.client.config.DefaultClientConfigImpl |
IRule | Ribbon負載均衡策略 | com.netflix.loadbalancer.ZoneAvoidanceRule |
IPing | Ribbon實例檢查策略 | com.netflix.loadbalancer.NoOpPing |
ServerList
|
服務實例清單維護機制 | com.netflixloadbalancer.ConfigurationBasedServerList |
ServerListFilter
|
服務實例清單過濾機制 | org.springframework.cloud.netflix.ribbon.ZonePreferenceServerListFilter |
ILoadBalancer | 負載均衡器 | com.netflix.loadbalancer.ZoneAwareLoadBalancer |
修改Ribbon實例檢查策略示例負載均衡
@Configuration public class MyRibbonConfiguration { @Bean public IPing ribbonPing(IClientConfig config) { return new PingUrl(); } }
在Camden版本中,Spring Cloud Ribbon對RibbonClient定義個性化配置的方法作了進一步優化。能夠直接經過<clientName>.ribbon.<key>=<value>的形式進行配置(<clientName>.可省略表示全局配置)。配置名配置的對應接口dom
key | description |
---|---|
NFLoadBalancerPingClassName | 配置IPing接口的實現 |
NFLoadBalancerClassName | 配置ILoadBalancer接口的實現 |
NFLoadBalancerRuleClassName | 配置IRule接口的實現 |
NIWSServerListClassName | 配置ServerList接口的實現 |
NIWSServerListFilterClassName | 配置ServerListFilter接口的實現 |
修改Ribbon實例檢查策略示例
服務名.ribbon.NFLoadBalancerPingClassName=com.netflix.loadbalancer.PingUrl函數
當在Spring Cloud的應用中同時引入Spring Cloud Ribbon和Spring Cloud Eureka依賴時,會觸發Eureka中實現的對Ribbon的自動化配置。在與Spring Cloud Eureka結合使用時,配置將更加簡單,不在須要須要經過相似<clientName>.ribbon.<key>=<value>的參數指定具體的服務實例清單。而對於Ribbon的參數配置,依然可以使用2.2.2中的兩種配置方式,對於客戶端的配置方式可直接使用Eureka中的服務名做爲<client>完成針對某個微服務的個性配置。微服務
Spring Cloud Ribbon默認實現了區域親和策略,能夠經過Eureka實例的元數據配置來實現區域化的實例配置方案。
如:eureka.instance.metadataMap.zone=shanghai
在Spring Cloud Ribbon和Spring Cloud Eureka結合的工程中,能夠經過參數配置的方式禁用Eureka對Ribbon服務實例的維護實現。 如:ribbon.eureka.enabled=false