1、簡介
java
不少場景下,可能根據須要自定義的Ribbon的配置,例如修改Ribbon的負載均衡規則等。Spring cloud Camden容許使用Java代碼或屬性自定義Ribbon的配置。web
2、使用Java代碼自定義Ribbon配置spring
2.一、說明負載均衡
在Spring cloud中,Ribbon的默認配置以下,格式是:BeanType beanName:ClassNamedom
一、IClientConfig ribbonClientConfig:DefaultClientConfigImplide
二、IRule ribbonPing:ZoneAvoidanceRule微服務
三、IPing ribbonPing:NoOpPing性能
四、ServerList ribbonServerList:ConfigurationBasedServerList測試
五、ServerListFilter ribbonServerListFilter:ZonePreferenceServerListFilterspa
六、ILoadBalancer ribbonLoadBalancer:ZoneAwareLoadBalancer
分析一下以下代碼:(org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration)
@Bean @ConditionalOnMissingBean public IRule ribbonRule(IClientConfig config) { ZoneAvoidanceRule rule = new ZoneAvoidanceRule(); rule.initWithNiwsConfig(config); return rule; }
BeanType是IRule,beanName是ribbonRule,ClassName是ZoneAvoidanceRule,這是一種根據服務提供者所在Zone的性能以及服務提供者可用性綜合計算,選擇提供者節點的負載均衡規則。
在Spring Cloud中,Ribbon默認的配置類是RibbonClientConfiguration。也可以使用一個POJO自定義Ribbon的配置(自定義配置會覆蓋默認配置)。這種配置是細粒度的,不一樣的Ribbon客戶端能夠使用不一樣的配置。
2.二、代碼實現
第1步、建立Ribbon的配置類
package com.example.demo.config; import com.example.demo.ExcludeFromComponentScan; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.RandomRule; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * Ribbon配置類 * * @Author: 我愛大金子 * @Description: Ribbon配置類 * @Date: Create in 15:36 2017/7/13 */ @Configuration @ExcludeFromComponentScan public class RibbonConfiguration { @Bean public IRule ribbonRule() { // 負載均衡規則,改成隨機 return new RandomRule(); } }
注意:
一、Ribbon配置類不能包含在主應用程序上下文的@ComponentScan中,不然該類中的配置信息就被全部的@RibbonClient共享。
二、若是隻想自定義某一個Ribbon客戶端的配置,必須防止@Configuration註解的類所在的包與@ComponentScan掃描的包重疊,或應顯示指定@ComponentScan不掃描@Configuration類所在的包。
第2步、修改啓動類
package com.example.demo; import com.example.demo.config.RibbonConfiguration; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.ribbon.RibbonClient; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.FilterType; import org.springframework.web.client.RestTemplate; /** * 使用@RibbonClient,爲特定name的Ribbon Client自定義配置 * 使用@RibbonClient的configuration屬性,指定Ribbon的配置類 */ @EnableEurekaClient @SpringBootApplication @RibbonClient(name = "spring-ribbon-eureka-client2", configuration = RibbonConfiguration.class) @ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class) }) public class SpringRibbonEurekaCustomizingApplication { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(SpringRibbonEurekaCustomizingApplication.class, args); } }
說明:使用@RibbonClient註解的configuration屬性能夠自定義指定名稱Ribbon客戶端的配置。
第3步、自定義註解
package com.example.demo; public @interface ExcludeFromComponentScan { }
2.三、測試
啓動spring-ribbon-eureka-server、啓動兩個spring-ribbon-eureka-client二、啓動咱們如今編寫的
訪問:
java實現的自定義Ribbon配置 http://localhost:8084/user/1
3、使用屬性文件自定義Ribbon配置
3.一、說明
從Spirng Cloud Netflix1.2.0開始(Spring Cloud Camden SR4使用的版本是1.2.4),Ribbon支持使用屬性自定義Ribbon客戶端。
支持的屬性以下,配置的前綴規則是:<clientName>.ribbon。
1_NFLoadBalancerClassName:配置ILoadBalancer的實現類
2_NFLoadBalancerRuleClassName:配置IRule的實現類
3_NFLoadBalancerPingClassName:配置IPing的實現類
4_NIWSServerListClassName:配置ServerList的實現類
5_NIWSServerListFilterClassName:配置ServerListFilter的實現類
3.二、配置實現
##################################使用配置文件自定義ribbon配置開始################################## #負載均衡規則改成隨機 spring-ribbon-eureka-client2.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule ##################################使用配置文件自定義ribbon配置結束##################################
3.三、測試
啓動spring-ribbon-eureka-server、啓動兩個spring-ribbon-eureka-client二、啓動咱們如今編寫的
訪問:
配置文件實現的自定義Ribbon配置
4、脫離Eureka使用Ribbon
在某些狀況下,可能會有一些遺留的微服務,它們可能並無註冊到Eureka Server上,甚至根本不是使用Spring Cloud開發的,此時想要使用Ribbon實現負載均衡,進是如今所說的脫離Eureka使用ribbon。
注意:此處代碼是基於上面代碼完成的。
一、去掉eureka依賴,加上ribbon依賴
二、去掉啓動類的上@EnableEurekaClient註解
三、修改配置
##################################ribbon配置開始################################## spring-ribbon-eureka-client2: ribbon: listOfServers: localhost:8083,localhost:8080 NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #負載均衡規則改成隨機 ##################################ribbon配置結束##################################
四、效果