文档章节

[Spring Cloud] 4.5 Client Side Load Balancer: Ribbon

秋雨霏霏
 秋雨霏霏
发布于 2016/12/08 20:42
字数 1274
阅读 449
收藏 3

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
    }
}

© 著作权归作者所有

共有 人打赏支持
秋雨霏霏
粉丝 150
博文 94
码字总数 168411
作品 0
杭州
CTO(技术副总裁)
私信 提问
聊聊spring cloud的LoadBalancerAutoConfiguration

序 本文主要研究一下spring cloud的LoadBalancerAutoConfiguration RibbonAutoConfiguration spring-cloud-netflix-ribbon-2.0.0.RC2-sources.jar!/org/springframework/cloud/netflix/ribb......

go4it
07/16
0
0
聊聊RibbonLoadBalancerClient的choose方法

序 本文主要研究一下RibbonLoadBalancerClient的choose方法 RibbonLoadBalancerClient.choose spring-cloud-netflix-ribbon-2.0.0.RC1-sources.jar!/org/springframework/cloud/netflix/rib......

go4it
05/28
0
0
Spring Cloud 1.0.0 正式发布

Spring Cloud 1.0.0.RELEASE 现已提供在 Maven Central (和 repo.spring.io),相比 RC3 版本并没有太大改进,修复了一些 bug。 Spring Cloud 为开发者提供了在分布式系统(如配置管理、服务发...

oschina
2015/03/05
2.9K
3
SpringCloud之服务提供与调用(Ribbon,Feign)

本系列介绍的配置均基于 Spring Boot 2.0.1.RELEASE 版本和 Spring Cloud Finchley.SR1 eureka注册续约流程 启动注册中心 服务提供者生产服务并注册到服务中心中 消费者从服务中心中获取服务...

熊小飞呀
08/28
0
0
聊聊spring cloud的AbstractLoadBalancingClient

序 本文主要研究一下spring cloud的AbstractLoadBalancingClient AbstractLoadBalancingClient spring-cloud-netflix-ribbon-2.0.0.RELEASE-sources.jar!/org/springframework/cloud/netfli......

go4it
07/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Java 源代码和 C 源代码的运行区别

与其他程序的执行方式和编译方式不同。 Java 源代码需要进行编译成字节码后在 Java 虚拟机上运行,这样 Java 程序能够保持独立性和跨平台功特性。 请参考下图。 https://www.cwiki.us/pages...

honeymose
今天
3
0
Apache限定目录解析PHP,限制user_agent,PHP相关的配置

Apache限定目录解析PHP 配置前访问upload/index.php [root@test-a ~]# curl -x192.168.77.139:80 'www.test.com/upload/index.php'This is upload diretory 配置,/usr/local/apache2.4/......

野雪球
今天
5
0
java.util.Concurrent.Exchanger源码

类图 源码: package java.util.concurrent;import java.util.concurrent.atomic.AtomicInteger;import java.util.concurrent.atomic.AtomicReference;import java.util.concurrent......

狼王黄师傅
今天
6
0
Kubernetes里的secret最基本的用法

Secret解决了密码、token、密钥等敏感数据的配置问题,使用Secret可以避免把这些敏感数据以明文的形式暴露到镜像或者Pod Spec中。 Secret可以以Volume或者环境变量的方式使用。 使用如下命令...

JerryWang_SAP
昨天
5
0
2018-11-20学习笔记

1. python数据类型: 给变量赋值什么样的值,变量就是什么样的类型 给变量赋值整数,变量就是整数类型 给变量赋值字符串,变量就是字符串类型 123 和“123”一样吗? 在python中 单引号 与双...

laoba
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部