Spring-Cloud之Ribbon原理剖析
我们知道Ribbon主要的工作就是进行负载均衡,帮助我们无需再关注微服务中集群的地址信息,因此在源码剖析中我们就主要关注这部分的内容。
内置的负载均衡规则
RoundRobinRule:直接轮询的方案;即每次从server list中依次选择。AvailabilityfileringRule:根据服务器可用性来决定;比如某个服务器的并发请求过高,那么此时ribbon就会绕过不再访问;同时如果3次连接失败就会等待30秒后再次访问;如果不断失败,那么等待时间会不断变长,如果某个服务器的并发请求太高了,那么会绕过去,不再访问。WeightedResponseTimeRule:根据权重来分配;每个服务器都可以有权重,权重高就优先访问,如果某个服务器响应时间比较长,那么权重就会降低,减少访问。ZoneAvoidanceRule:根据区域和服务器来进行负载均衡,也就是根据机房来分配,里面再使用轮询的方式。默认的就是这个BestAvailableRule:忽略连接失败的服务器,同时尽量找并发比较低的服务器来请求。RandomRule:随机选择一个。RetryRule:在轮询的方案上增加重试机制;即通过轮询的方式选择一个服务器请求,在失败的时候会重新再找一个重试。
可以通过ribbon.NFLoadBalancerRuleClassName: top.vchar.MyRule 来切换规则
RestTemplate 加上 @LoadBalanced
当我们在 RestTemplate 上添加 @LoadBalanced 注解后,在写接口地址的时候可以直接使用服务名代替真实的地址;在执行请求的过程中Ribbon会自动的将其替换为真实的地址。 加上 @LoadBalanced 注解就可以让 RestTemplate的请求交ribbon的原理如下:
- 在ribbon的整合中有个LoadBalancerAutoConfiguration的配置,它里面会注入所有带@LoadBalanced 注解的 RestTemplate的bean;然后会给这些RestTemplate添加上一个LoadBalancerInterceptor的拦截器;
- 在 RestTemplate 执行请求的时候,这个拦截器会拦截请求,将其转给LoadBalancerClient(实际是RibbonLoadBalancerClient来实现的)来做接下来的全部操作。
- 在RibbonLoadBalancerClient中会根据服务名从注册表获取该服务对应的服务信息集合,然后根据设置的负载均衡规则选择一个服务信息;
- 之后将将请求地址中的服务名称称替换为真实的地址,然后发起请求。

IPing机制
Ribbon中IPing机制其实就是定时的去检查拿到的注册表中的服务是否可用,如果不可用将会移除它。默认使用NIWSDiscoveryPing类实现IPing;它就是启动了一个定时任务,默认每隔30s执行一次,通过检查服务的状态是否是UP状态来判断该服务是否存活。
public boolean isAlive(Server server) {
boolean isAlive = true;
if (server != null && server instanceof DiscoveryEnabledServer) {
DiscoveryEnabledServer dServer = (DiscoveryEnabledServer)server;
InstanceInfo instanceInfo = dServer.getInstanceInfo();
if (instanceInfo != null) {
InstanceStatus status = instanceInfo.getStatus();
if (status != null) {
isAlive = status.equals(InstanceStatus.UP);
}
}
}
return isAlive;
}
关于Ribbon获取服务注册表
Ribbon并没有直接使用eureka client的注册表信息,而是拷贝了一份注册表信息重新封装了一下。 它在初始化的时候会通过PollingServerListUpdater来启动一个定时任务,默认每隔30s到eureka client的注册表中拷贝一次然后刷新它自己的。这个时间可以通过配置 ribbon.ServerListRefreshInterval 来修改定时任务的执行间隔时间。
那么如果某台机器故障宕机,ribbon需要多久才能感知到呢?下面我们来分析下:首先eureka server的服务故障感知最坏的情况下是需要180s,同时只读缓存默认30s才会自动更新,eureka client默认30s才会去拉取一次注册信息,加上ribbon自己的刷新时间30s,那么整个过程需要的时间就是180s+30s+30s+30s=270s,也就是大约要4分钟半左右。
关于Ribbon的配置
Ribbon配置支持的key在ribbon-core中的CommonClientConfigKey类中,我们可以根据需要到里面去查阅;配置方式分为全局和局部。
- 全部配置直接以ribbon开头,比如:ribbon.ServerListRefreshInterval:20 修改ribbon刷新注册表的时间
- 局部配置就是针对某个服务的配置,格式为:
<clientName>.<nameSpace>.<propertyName>=<value>;示例
# 配置memberServer的服务调用失败的时候重试一次
memberServer.ribbon.MaxAutoRetries=1

Spring-Cloud之Ribbon原理剖析的更多相关文章
- spring cloud 使用ribbon简单处理客户端负载均衡
假如我们的multiple服务的访问量剧增,用一个服务已经无法承载, 我们可以把Hello World服务做成一个集群. 很简单,我们只需要复制Hello world服务,同时将原来的端口8762修改 ...
- spring cloud: 关闭ribbon负载均衡
spring cloud: 关闭ribbon负载均衡 1.eureka服务 2.2个user服务:7900/7901 3,movie服务 movie服务去请求 user的用户信息,而此时只想请求790 ...
- 0000 - Spring 中常用注解原理剖析
1.概述 Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用 <bean/> 标签来 ...
- Spring 中常用注解原理剖析
前言 Spring 框架核心组件之一是 IOC,IOC 则管理 Bean 的创建和 Bean 之间的依赖注入,对于 Bean 的创建可以通过在 XML 里面使用 <bean/> 标签来配置 ...
- Eureka 系列(03)Spring Cloud 自动装配原理
Eureka 系列(03)Spring Cloud 自动装配原理 [TOC] 0. Spring Cloud 系列目录 - Eureka 篇 本文主要是分析 Spring Cloud 是如何整合 Eu ...
- Spring Cloud OkHttp设计原理
Spring Cloud 框架最底层核心的组件就是服务调用方式,一般Spring Cloud框架采用的是HTTP的调用框架,本文将在 Spring Cloud应用场景下,介绍组件OkHttp3的设计原 ...
- Spring Cloud 之 Ribbon
新建Spring Boot工程,命名为ribbon 1.pom.xml添加依赖 <?xml version="1.0" encoding="UTF-8"? ...
- 笔记:Spring Cloud Feign Ribbon 配置
由于 Spring Cloud Feign 的客户端负载均衡是通过 Spring Cloud Ribbon 实现的,所以我们可以直接通过配置 Ribbon 的客户端的方式来自定义各个服务客户端调用的参 ...
- Spring cloud 之Ribbon(一)基本使用
简介 Spring cloud Ribbon是一个基于HTTP和TCP的客户端负载均衡工具,它是基于Netflix的Riboon实现的.Ribbon是客户端负载均衡器,这有别语例如Nginx服务端负载 ...
- Spring Cloud Gateway Ribbon 自定义负载均衡
在微服务开发中,使用Spring Cloud Gateway做为服务的网关,网关后面启动N个业务服务.但是有这样一个需求,同一个用户的操作,有时候需要保证顺序性,如果使用默认负载均衡策略,同一个用户的 ...
随机推荐
- PTE 准备之 Repeat sentence
Repeat sentence After listening to a sentence ,repeat the sentence 3-9 seconds 15 seconds Strategies ...
- html Ajax连接.NET Ashx
Html代码: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <m ...
- 翻译:《实用的Python编程》06_02_Customizing_iteration
目录 | 上一节 (6.1 迭代协议) | 下一节 (6.3 生产者/消费者) 6.2 自定义迭代 本节探究如何使用生成器函数自定义迭代. 问题 假设你想要自定义迭代模式. 例如:倒数: >&g ...
- 攻防世界 reverse debug
debug XCTF 3rd-GCTF-2017 .net程序,这里我用的dnspy,当然.net Reflector也很好用. 查看程序,发现是明文比较,下断,debug,完成. flag{967 ...
- 简易计算器实现:while循环+switch语句
个人练习: 写一个计算器,要求实现加减乘除功能,并且能循环接收新的数据,通过用户交互实现(即Scanner对象) 用到了 while循环 switch语句,实现了数据的循环输入并计算!!!!妙啊!!! ...
- PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642
PAT (Advanced Level) Practice 1042 Shuffling Machine (20 分) 凌宸1642 题目描述: Shuffling is a procedure us ...
- 微信小程序授权登录以及用户信息相关接口调整导致授权框不弹出
前言:4月8号升级了小程序业务后提交了版本并上线.突然一个同事说体验版的点击"登录"按钮无效.当时觉得应该不会呀,这几天一直用手机调试,每天也在不停的登录授权,弹框一直有的呀.然后 ...
- [Fundamental of Power Electronics]-PART I-3.稳态等效电路建模,损耗和效率-3.5/3.6 示例:Boost变换器中包含的半导体传导损耗/要点小结
3.5 示例:Boost变换器中包含的半导体传导损耗 作为最后一个示例,让我们考虑对图3.22所示的Boost变换器中的半导体传导损耗进行建模.功率损耗的另一个主要来源是半导体器件的正向电压降引起的传 ...
- [Fundamental of Power Electronics]-PART I-4.开关实现-0 序
4 开关实现 在前面的章节中我们已经看到,可以使用晶体管,二极管来作为Buck,Boost和其他一些DC-DC变换器的开关元件.也许有人会想为什么会这样,以及通常如何实现半导体的开关.这些都是值得被提 ...
- [面试仓库]CSS面试题汇总-定位篇
一,relative.absolute 的区别 我们还是来说常见的地方.首先就是relative,absolute的区别: relative是依据自身来定位的 absolute则是依据离其最近一层 ...