上一节讲了Ribbon的入门姿势,本节深入探讨Ribbon的高级特性。

内置负载均衡规则

负载均衡规则是Ribbon的核心,下面来看一下Ribbon内置的负载均衡规则。

  • AvailabilityFilteringRule:过滤掉一直连接失败的被标记为circuit tripped的后端Server,并过滤掉那些高并发的后端Server或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个Server的运行状态;
  • BestAvailableRule:选择一个最小的并发请求的Server,逐个考察Server,如果Server被tripped了,则跳过。
  • RandomRule:随机选择一个Server;
  • ResponseTimeWeightedRule:作用同WeightedResponseTimeRule,二者作用一样;
  • RetryRule:对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server;
  • RoundRobinRule:轮询选择, 轮询index,选择index对应位置的Server;
  • WeightedResponseTimeRule:根据响应时间加权,响应时间越长,权重越小,被选中的可能性越低;
  • ZoneAvoidanceRule:复合判断Server所在区域的性能和Server的可用性选择Server;

如需自定义负载均衡规则,只需实现IRule 接口或继承AbstractLoadBalancerRule、PredicateBasedRule即可 ,读者可参考RandomRuleRoundRobinRuleZoneAvoidanceRule 等内置Rule编写自己的负载均衡规则。

Ribbon配置自定义【细粒度配置】

Ribbon可实现精确到目标服务的细粒度配置。例如A服务调用服务B,A服务调用C,可以针对B服务一套配置,针对C服务另一套配置。

方式1、代码配置方式

在Spring Cloud中,Ribbon的默认配置如下(格式是BeanType beanName: ClassName):

  • IClientConfig ribbonClientConfig: DefaultClientConfigImpl
  • IRule ribbonRule: ZoneAvoidanceRule
  • IPing ribbonPing: NoOpPing
  • ServerList<Server> ribbonServerList: ConfigurationBasedServerList
  • ServerListFilter<Server> ribbonServerListFilter: ZonePreferenceServerListFilter
  • ILoadBalancer ribbonLoadBalancer: ZoneAwareLoadBalancer
  • ServerListUpdater ribbonServerListUpdater: PollingServerListUpdater

代码示例

  • 创建一个空类,并在其上添加@Configuration 注解和@RibbonClient 注解。

    /**
    * 使用RibbonClient,为特定的目标服务自定义配置。
    * 使用@RibbonClient的configuration属性,指定Ribbon的配置类。
    * 可参考的示例:
    * http://spring.io/guides/gs/client-side-load-balancing/
    * @author 周立
    */
    @Configuration
    @RibbonClient(name = "microservice-provider-user", configuration = RibbonConfiguration.class)
    public class TestConfiguration {
    }

    由代码可知,使用@RibbonClient 注解的configuration属性,即可自定义指定名称Ribbon客户端的配置。

  • 创建Ribbon的配置类。

    /**
    * 该类为Ribbon的配置类
    * 注意:该类不能放在主应用程序上下文@ComponentScan所扫描的包中,否则配置将会被所有Ribbon Client共享。
    * @author 周立
    */
    @Configuration
    public class RibbonConfiguration {
    @Bean
    public IRule ribbonRule() {// 负载均衡规则,改为随机return new RandomRule();
    }
    }

配套代码

GitHub:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-config-java

Gitee:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-config-java

方式2、属性配置方式【推荐】

<clientName>.ribbon. 如下属性

代码示例

user:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

TIPS

属性配置的优先级高于代码配置。

配套代码

GitHub:https://github.com/eacdy/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-config-properties

Gitee:https://gitee.com/itmuch/spring-cloud-study/tree/master/2018-Finchley/microservice-consumer-movie-ribbon-config-properties

Ribbon配置自定义【全局配置】

方式1、代码配置方式

@RibbonClients(defaultConfiguration = DefaultRibbonConfig.class)
public class RibbonClientDefaultConfigurationTestsConfig {
}
@Configuration
class DefaultRibbonConfig {@Beanpublic IRule ribbonRule() {return new RandomRule();}
}

方法2、属性配置方式【推荐】

和上文细粒度配置类似,只需将目标服务名称前缀去掉即可。

ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

Ribbon Eager加载

默认情况下Ribbon是懒加载的——首次请求Ribbon相关类才会初始化,这会导致首次请求过慢的问题,你可以配置饥饿加载,让Ribbon在应用启动时就初始化。

ribbon:eager-load:enabled: true# 多个用,分隔clients: microservice-provider-user

本文首发

http://www.itmuch.com/spring-cloud/finchley-8/

干货分享

转载于:https://blog.51cto.com/10180481/2340434

跟我学Spring Cloud(Finchley版)-08-Ribbon深入相关推荐

  1. Spring Cloud Finchley版中Consul多实例注册的问题处理

    由于Spring Cloud对Etcd的支持一直没能从孵化器中出来,所以目前来说大多用户还在使用Eureka和Consul,之前又因为Eureka 2.0不在开源的消息,外加一些博眼球的标题党媒体使得 ...

  2. hystrix 全局熔断_跟我学Spring Cloud(Finchley版)14Feign使用Hystrix

    Feign默认已经整合了Hystrix,本节详细探讨Feign使用Hystrix的具体细节. 服务降级 1 加配置,默认Feign是不启用Hystrix的,需要添加如下配置启用Hystrix,这样所有 ...

  3. 跟我学Spring Cloud(Finchley版)-10-Feign深入

    上一节( 跟我学Spring Cloud(Finchley版)-09-Feign )讲了Feign的入门姿势并深入对比了RestTemplate,本节来深入探讨Feign的高级特性.总的来说,Feig ...

  4. 跟我学Spring Cloud(Finchley版)-07-Ribbon入门

    经过前文讲述,我们已经实现了服务发现.本节来解决 跟我学Spring Cloud(Finchley版)-02-构建分布式应用 提到的如下问题: 负载均衡如何考虑?难道得在电影微服务和用户微服务之间加个 ...

  5. 跟我学Spring Cloud(Finchley版)-04-服务注册与服务发现-原理剖析

    为什么80%的码农都做不了架构师?>>>    第2节( 跟我学Spring Cloud(Finchley版)-02-构建分布式应用 )说过: 地址硬编码问题--电影微服务中将用户微 ...

  6. 告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目(实际项目开发的浓缩精华版)

    告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目 一.前言 二.如何选择版本 2.1 SpringCloud 和 Spring Boot 版本选型 2.1. ...

  7. 一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)

    在微服务项目中,一个系统可以分割成很多个不同的服务模块,不同模块之间我们通常需要进行相互调用.springcloud中可以使用RestTemplate+Ribbon和Feign来调用(工作中基本都是使 ...

  8. Spring Cloud Finchley OpenFeign的重试配置相关的坑

    如题,本文基于Spring Cloud Finchley.SR2 OpenFeign的重试 OpenFeign配置重试后,逻辑分析 对比Daltson和Finchley的基本组件,发现Ribbon还有 ...

  9. Spring Cloud 系列之 Netflix Ribbon 负载均衡

    什么是 Ribbon Ribbon 是一个基于 HTTP 和 TCP 的 客服端负载均衡工具,它是基于 Netflix Ribbon 实现的. 它不像 Spring Cloud 服务注册中心.配置中心 ...

  10. Spring Cloud中Hystrix、Ribbon及Feign的熔断关系是什么?

    导读 今天和大家聊一聊在Spring Cloud微服务框架实践中,比较核心但是又很容易把人搞得稀里糊涂的一个问题,那就是在Spring Cloud中Hystrix.Ribbon以及Feign它们三者之 ...

最新文章

  1. TOF摄像机可以替代Flash激光雷达吗?
  2. 非常实用的 Python 技巧
  3. 点分治 + 树状数组 ---- E. Close Vertices(点分治 + 二维数点)
  4. Python实现tab文件操作
  5. 【 FPGA 】FIR滤波器的采样速率与系统时钟速率不同时的资源消耗分析
  6. C++实现遍历链表一次求出中间的节点
  7. Vmware 安装CentOS7时连不上网问题的解决
  8. MySql技巧个人笔记
  9. J.U.C系列(三)Semaphore的使用
  10. css如何调整红心样式_css3实现的红心跳动效果
  11. 看了这几幅图,感觉自己物理白学了!
  12. web开发快餐式入门指南 0. 写在前面
  13. 一天一个Java基础——序列化
  14. extjs 不显示 但是不报错
  15. Spark createDirectStream 维护 Kafka offset(Scala)
  16. 微信小程序教程笔记4
  17. 电脑桌面录屏软件大全,给大家推荐一波优秀的屏幕录像工具!
  18. c盘java文件误删_C盘的文件被误删如何恢复
  19. 寻找可接入正版音乐曲库的音乐API?来了解HIFIVE音乐开放平台!
  20. win10家庭版不能保存关闭密码保护共享

热门文章

  1. Java中的访问控制权限
  2. File.documentsDirectory抛出异常Error #2014问题解决方案
  3. Windows Server 2008 定义用户桌面图标
  4. Silverlight实用窍门系列:40.Silverlight中捕捉视频,截图保存到本地
  5. NAC网络访问控制,你需要知道的!
  6. 打印服务不能启动 print spooler服务停止
  7. nexus搭建maven私服
  8. express web的一款mvc框架
  9. vmware workstation无法打开内核设备问题处理办法
  10. 使用PHP自带zlib函数 几行代码实现PHP文件打包下载zip