[Spring Cloud] 4.5 Client Side Load Balancer: Ribbon
[Spring Cloud] 4.5 Client Side Load Balancer: Ribbon
秋雨霏霏 发表于1年前
[Spring Cloud] 4.5 Client Side Load Balancer: Ribbon
  • 发表于 1年前
  • 阅读 293
  • 收藏 2
  • 点赞 0
  • 评论 0

标题:腾讯云 新注册用户域名抢购1元起>>>   

摘要: 客户端负载均衡:Ribbon

4.5 Client Side Load Balancer: Ribbon

客户端负载均衡:Ribbon

Ribbon是一个HTTP/TCP客户端的负载均衡实现。Feign已经集成了Ribbon,因此,如果你已经使用@FeignClient那么,你可以直接使用Ribbon。

Ribbon中有个核心概念:客户端命名。每一个负载均衡器都是指集群中处理某个请求的一组组件,开发者需要给每一个这样的小组进行命名。(比如使用@FeignClient注解) Spring Cloud使用了一种新的方式来分组,在业务处理端在ApplicationContext中注册一个RibbonClientConfiguration,通过这个RibbonClientConfiguration来进行分组配置。这其中就会包含一个ILoadBalancer,一个RestClient,以及一个ServerListFilter

4.5.1 How to Include Ribbon 如何引入Ribbon

引入Ribbon,需要在工程中增加如下依赖:group:org.springframework.cloud artifact id:spring-cloud-starter-ribbon。如何构建Spring Cloud 工程,参见Spring Cloud文档

4.5.2 Customizing the Ribbon Client :Ribbon客户端配置

可以通过扩展配置属性:<client>.ribbon.*,来配置Ribbon客户端相关属性,这和直接使用Netflix API没什么区别。除此之外,还可以通过Spring Boot配置文件来配置Ribbon。 配置属性可以参见CommonClientConfigKey(在ribbon-core中)。

Spring Cloud也允许通过@RibbonClient对Ribbon进行完全的控制(基于RibbonClientConfiguration)。 例如:

@Configuration
@RibbonClient(name = "foo", configuration = FooConfiguration.class)
public class TestConfiguration {
}

在这个例子中,会使用一个自定义的FooConfiguration整合到RibbonClientConfiguration配置过程。

警告:

需要确保FooConfiguration不会被@Configuration或者@ComponentScan扫描到,否则,就会被所有@RibbonClients共享了(自动注入)。如果使用@ComponentScan或者@SpringBootApplication时,也需要避免FooConfiguration被自动扫描。

Spring Cloud Netfix 默认情况下为Ribbo自动生成了下列Bean:

Bean类型 | Bean名称 | 类名 | 备注 ---|----|---|- IClientConfig | ribbonClientConfig | DefaultClientConfigImpl | IRule | ribbonRule | ZoneAvoidanceRule | IPing | ribbonPing | NoOpPing | ServerList<Server> | ribbonServerList | ConfigurationBasedServerList | ServerListFilter<Server> | ribbonServerListFilter | ZonePreferenceServerListFilter | ILoadBalancer | ribbonLoadBalancer | ZoneAwareLoadBalancer |

@RibbonClient配置的配置类(如上例中的 FooConfiguration),允许对上面表格中的Bean进行自定义。例如:

@Configuration
public class FooConfiguration {
    @Bean
    public IPing ribbonPing(IClientConfig config) {
        return new PingUrl();
    }
}

这个例子中使用了PingUrl来替换默认的NoOpPing

4.5.3 Customizing the Ribbon Client using properties 使用配置属性定制化Ribbon客户端

从1.2.0版本开始,Spring Cloud Netflix支持使用属性对于Ribbon客户端进行配置。属性名同Ribbon文档中一样。

这样应用启动时可以在不同的环境中使用不同的Ribbon配置信息。

配置项只需要在下列配置前加上<clientName>.ribbon.前缀就行:

  • NFLoadBalancerClassName:指定一个ILoadBalancer实现类 — NFLoadBalancerRuleClassName: 指定一个IRule实现类
  • NFLoadBalancerPingClassName:指定一个IPing实现类
  • NIWSServerListClassName:指定一个ServerList实现类
  • NIWSServerListFilterClassName:指定一个ServerListFilter实现类

注意: 这些属性指定的类,会覆盖使用@RibbonClient(configuration=MyRibbonConfig.class)注解中的定义,同时也会覆盖Spring Cloud Netflix的默认策略。

如果需要在users服务中指定一个IRule,可以这样做:

application.yml

users:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.WeightedResponseTimeRule

4.5.4 Using Ribbon with Eureka 在Eureka中使用Ribbon

当需要在Eureka中整合Ribbon,可以在Eureka中配置DiscoveryEnabledNIWSServerList来覆盖Ribbon的服务列表。也可以配置NIWSDiscoveryPing来替代Ribbon的IPing。 默认情况下Ribbon的服务列表会被替换成DomainExtractingServerList,这样就可以达到负载均衡使用配置的元数据而不是去使用AWS AMI元数据。

默认情况下,在实例的元数据中,服务列表会被封装成一个"区域"信息。(因此,在远程客户端中可以设置eureka.instance.metadataMap.zone) 当发生错误时,可以从服务端获取一个域名作为代理区域(需要打开approximateZoneFromHostname配置项)。

一旦在ServerListFilter区域信息可用,那默认的ZonePreferenceServerListFilter,就会在区域中的定位一个服务为客户端提供服务。

默认的,区域中的客户端也会以同样的方式来作为远程实例。如:eureka.instance.metadataMap.zone

注意: 按"archaius"规范,使用一个"@zone"来设置客户端区域,Spring Cloud将会优先使用这个策略(需要在YAML中配置)

注意: 如果不指定区域,那就会按照客户端配置信息中去推测。通过eureka.client.availabilityZones对区域名进行映射,使用第一个列表中的第一个作为区域信息。(例如:eureka.client.region默认就是"us-east-1")

4.5.5 Example: How to Use Ribbon Without Eureka 例子:如何不使用Eureka,直接使用Ribbon

如果不想在客户端手动指定服务端,Eureka是一个很方便的服务发现方案。但是如果你就是不想用它,Ribbon和Feign也是可以使用的。

假设,你已经为"stores"服务定义好一个@RibbonClient(不使用Eureka),在Ribbon客户端可以额外的配置一个服务列表,如下:

application.yml

stores:
  ribbon:
    listOfServers: example.com,google.com

4.5.6 Example: Disable Eureka use in Ribbon 例子:在Eureka中关闭Ribbon

可以配置ribbon.eureka.enabled = false可以在Eureka中关闭Ribbon。例如:

application.yml

ribbon:
  eureka:
   enabled: false

4.5.7 Using the Ribbon API Directly 直接操作Ribbon API

可以直接使用LoadBalancerClient。例如:

public class MyClass {
    @Autowired
    private LoadBalancerClient loadBalancer;

    public void doStuff() {
        ServiceInstance instance = loadBalancer.choose("stores");
        URI storesUri = URI.create(String.format("http://%s:%s", instance.getHost(), instance.getPort()));
        // ... do something with the URI
    }
}
标签: Spring Cloud Ribbon
共有 人打赏支持
粉丝 115
博文 75
码字总数 138343
×
秋雨霏霏
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: