本节深入探讨Ribbon的高级特性。
负载均衡规则是Ribbon的核心,下面来看一下Ribbon内置的负载均衡规则。
如需自定义负载均衡规则,只需实现IRule 接口或继承AbstractLoadBalancerRule、PredicateBasedRule即可 ,读者可参考 RandomRule
、 RoundRobinRule
、 ZoneAvoidanceRule
等内置Rule编写自己的负载均衡规则。
Ribbon可实现精确到目标服务的细粒度配置。例如A服务调用服务B,A服务调用C,可以针对B服务一套配置,针对C服务另一套配置。
在Spring Cloud中,Ribbon的默认配置如下(格式是 BeanType
beanName: ClassName
):
IClientConfig
ribbonClientConfig: DefaultClientConfigImpl
IRule
ribbonRule: ZoneAvoidanceRule
IPing
ribbonPing: NoOpPing
ServerList<Server>
ribbonServerList: ConfigurationBasedServerList
ServerListFilter<Server>
ribbonServerListFilter: ZonePreferenceServerListFilter
ILoadBalancer
ribbonLoadBalancer: ZoneAwareLoadBalancer
ServerListUpdater
ribbonServerListUpdater: PollingServerListUpdater
1 创建一个空类,并在其上添加 @Configuration
注解和 @RibbonClient
注解。
/**
* 使用RibbonClient,为特定的目标服务自定义配置。
* 使用@RibbonClient的configuration属性,指定Ribbon的配置类。
* 可参考的示例:
* http://spring.io/guides/gs/client-side-load-balancing/
* @author 周立
*/
@Configuration
@RibbonClient(name = "microservice-provider-user", configuration = RibbonConfiguration.class)
public class TestConfiguration {
}
由代码可知,使用 @RibbonClient
注解的configuration属性,即可自定义指定名称Ribbon客户端的配置。
2 创建Ribbon的配置类。
/**
* 该类为Ribbon的配置类
* 注意:该类不能放在主应用程序上下文@ComponentScan所扫描的包中,否则配置将会被所有Ribbon Client共享。
* @author 周立
*/
@Configuration
public class RibbonConfiguration {
@Bean
public IRule ribbonRule() {
// 负载均衡规则,改为随机
return new RandomRule();
}
}
GitHub:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-config-java
Gitee:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-config-java
<clientName>.ribbon.
如下属性
NFLoadBalancerClassName
: should implement ILoadBalancer
NFLoadBalancerRuleClassName
: should implement IRule
NFLoadBalancerPingClassName
: should implement IPing
NIWSServerListClassName
: should implement ServerList
NIWSServerListFilterClassName
should implement ServerListFilter
user:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
TIPS
属性配置的优先级高于代码配置。
GitHub:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-config-properties
Gitee:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-config-properties
@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class)
public class RibbonClientDefaultConfigurationTestsConfig {
}
@Configuration
class DefaultRibbonConfig {
@Bean
public IRule ribbonRule() {
return new RandomRule();
}
}
和上文细粒度配置类似,只需将目标服务名称前缀去掉即可。
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
默认情况下Ribbon是懒加载的——首次请求Ribbon相关类才会初始化,这会导致首次请求过慢的问题,你可以配置饥饿加载,让Ribbon在应用启动时就初始化。
ribbon:
eager-load:
enabled: true
# 多个用,分隔
clients: microservice-provider-user