文章目录
写在前面
该文参考来自 程序猿DD 的Spring Cloud 微服务实战一书,该文是作为阅读了 spring cloud ribbon一章的读书笔记。书中版本比较老,我选择了最新稳定版的 spring cloud Greenwich.SR2 版本,该版本较书中版本有些变动。非常感谢作者提供了这么好的学习思路,谢谢!文章也参考了 Spring-cloud-netflix 的官方文档。
1. 自定义 Ribbon Client
我们可以使用 <client>.ribbon.* 的形式来指定客户端配置。但仍然可以选择使用 Spring Boot 配置文件;可用的原生配置可以通过 CommonClientConfigKey
的静态字段检测,该类是 ribbon-core
的一部分。
通过在配置类顶部使用 @RibbonClient
注解来声明额外的配置,可以达到完全控制客户端。
@Configuration
@RibbonClient(name = "custom", configuration = CustomConfiguration.class)
public class TestConfiguration {
}
在这种情况下,客户端所暴露的组件是由 RibbonClientConfiguration
以及 CustomConfiguration
中的任何组件组成,后者会覆盖前者。所以,我们想实现自己的配置,只需要查看 RibbonClientConfiguration
中配置的 Bean ,在 CustomConfiguration 中采用另一种实现类,覆盖该 Bean 即可。
这里需要注意的是 ,
CustomConfiguration
不应被包括在@ComponentScan
的扫描路径中,否则它将被所有的 @RibbonClients 共享。
2. 为所有的 Ribbon Client 定制默认设置
通过使用 @RibbonClients
注解,可以为所有 Ribbon clients 提供默认配置:
@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class)
public class RibbonClientDefaultConfigurationTestsConfig {
public static class BazServiceList extends ConfigurationBasedServerList {
public BazServiceList(IClientConfig config) {
super.initWithNiwsConfig(config);
}
}
}
@Configuration
class DefaultRibbonConfig {
@Bean
public IRule ribbonRule() {
return new BestAvailableRule();
}
@Bean
public IPing ribbonPing() {
return new PingUrl();
}
@Bean
public ServerList<Server> ribbonServerList(IClientConfig config) {
return new RibbonClientDefaultConfigurationTestsConfig.BazServiceList(config);
}
@Bean
public ServerListSubsetFilter serverListFilter() {
ServerListSubsetFilter filter = new ServerListSubsetFilter();
return filter;
}
}
3. 通过设置属性自定义 Ribbon Client
从 1.2.0 版本开始,Spring cloud Netflix 支持设置属性的方式来自定义 Ribbon clients ,这种方式与 Ribbon 文件兼容。
受支持的属性:
<clientName>.ribbon.NFLoadBalancerClassName
: 应该实现ILoadBalancer
接口的类<clientName>.ribbon.NFLoadBalancerRuleClassName
: 应该实现IRule
接口的类<clientName>.ribbon.NFLoadBalancerPingClassName
: 应该实现IPing
接口的类<clientName>.ribbon.NIWSServerListClassName
: 应该实现ServerList
接口的类<clientName>.ribbon.NIWSServerListFilterClassName
: 应该实现ServerListFilter
接口的类
Spring Cloud Ribbon 是通过 PropertiesFactory
类来动态地为 RibbonClient
创建这些接口实现的。
4. 结合 Eureka 使用时
当Eureka与Ribbon一起使用时(也就是说,两者都在类路径上),ribbonServerList
将被DiscoveryEnabledNIWSServerList
的扩展覆盖,后者将填充来自Eureka的服务器列表。它还用NIWSDiscoveryPing
代替IPing
接口,NIWSDiscoveryPing
委托给Eureka来确定服务器是否启动。
但我们仍然可以通过 ribbon.eureka.enable = false
来禁用 Ribbon 使用 Eureka。
5. Ribbon 配置的缓存问题
每个名为client的Ribbon都有Spring Cloud维护的相应的子应用程序上下文。此应用程序上下文在对命名客户机的第一个请求时被延迟加载。通过指定Ribbon客户端的名称,可以将这种延迟加载行为改为在启动时急切地加载这些子应用程序上下文,如下例所示:
ribbon:
eager-load:
enabled: true
clients: client1, client2, client3
6. 如何提供 key 给 Ribbon 的 IRule
查看 IRule 接口:
public Server choose(Object key);
public void setLoadBalancer(ILoadBalancer lb);
public ILoadBalancer getLoadBalancer();
如果,我们需要自己实现 IRule 时,那么如何提供 Key 值呢?这种情况的应用场景可以对应于我们需要根据 key 指定访问的server ,我们可以在请求时,通过如下方法指定:
RequestContext.getCurrentContext()
.set(FilterConstants.LOAD_BALANCER_KEY, "canary-test");
如果你觉得我的文章对你有所帮助,欢迎关注我的公众号。赞!
认认真真学习,做思想的产出者,而不是文字的搬运工。错误之处,还望指出!