文档章节

[Spring Cloud] 4.5 Client Side Load Balancer: Ribbon

秋雨霏霏
 秋雨霏霏
发布于 2016/12/08 20:42
字数 1274
阅读 478
收藏 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
    }
}

© 著作权归作者所有

共有 人打赏支持
秋雨霏霏
粉丝 149
博文 94
码字总数 168411
作品 0
杭州
CTO(技术副总裁)
私信 提问
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
聊聊RibbonLoadBalancerClient的choose方法

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

go4it
2018/05/28
0
0
聊聊spring cloud的LoadBalancerAutoConfiguration

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

go4it
2018/07/16
0
0
SpringCloud之服务提供与调用(Ribbon,Feign)

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

熊小飞呀
2018/08/28
0
0
Spring Cloud学习:02服务消费者(Ribbon&Feign)

在微服务架构中,业务会拆分成一个独立的服务,服务与服务之间基于http restful进行通信。Spring Cloud有两种服务调用方式,一种是Ribbon+restTemplate,另一种是Feign。 1 Ribbon+restTempl...

寒武没有纪
2017/10/21
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周一乱弹 —— 白掌柜说了卖货不卖身

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @爱漫爱 :这是一场修行分享羽肿的单曲《Moony》 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :开不开心? 开心呀, 我又不爱睡懒觉…...

小小编辑
今天
8
0
大数据教程(11.7)hadoop2.9.1平台上仓库工具hive1.2.2搭建

上一篇文章介绍了hive2.3.4的搭建,然而这个版本已经不能稳定的支持mapreduce程序。本篇博主将分享hive1.2.2工具搭建全过程。先说明:本节就直接在上一节的hadoop环境中搭建了! 一、下载apa...

em_aaron
今天
3
0
开始看《JSP&Servlet学习笔记》

1:WEB应用简介。其中1.2.1对Web容器的工作流程写得不错 2:编写Servlet。搞清楚了Java的Web目录结构,以及Web.xml的一些配置作用。特别是讲了@WebServlet标签 3:请求与响应。更细致的讲了从...

max佩恩
今天
4
0
mysql分区功能详细介绍,以及实例

一,什么是数据库分区 前段时间写过一篇关于mysql分表的的文章,下面来说一下什么是数据库分区,以mysql为例。mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可...

吴伟祥
今天
3
0
SQL语句查询

1.1 排序 通过order by语句,可以将查询出的结果进行排序。放置在select语句的最后。 格式: SELECT * FROM 表名 ORDER BY 排序字段ASC|DESC; ASC 升序 (默认) DESC 降序 1.查询所有商品信息,...

stars永恒
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部