SpringCloudRibbon之配置详解




写在前面

该文参考来自 程序猿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");

如果你觉得我的文章对你有所帮助,欢迎关注我的公众号。赞!我与风来
认认真真学习,做思想的产出者,而不是文字的搬运工。错误之处,还望指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值