【SpringCloud】Ribbon
Ribbon
负载均衡原理

- order-service 发起 user-service 请求,被ribbon进行拦截;
- ribbon会向注册中心拉取user-service 相对应的服务;
- 注册中心返回user-service服务列表;
- 由ribbon的负载均衡机制去选择一个服务进行访问;默认采用的是轮训的机制。
负载均衡流程

请求示例
配置
@Configuration
public class RestTemplateConfiguration {
/**
* 添加LoadBalanced,使RestTemplate以负载均衡的方式调用服务
* @return
*/
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
接口调用
@RequestMapping("consumer")
@RestController
public class ConsumerController {
/**
* spring提供的一个用于访问rest接口的模板对象
* 提供了多重便捷访问远程HTTP服务的方法,简单的RestFul 服务模板
*/
@Resource
private RestTemplate restTemplate;
/**
* 服务地址
*/
private static final String REST_FIX_URL_PREFIX = "http://XY-PROVIDER";
@GetMapping("/getProvider")
public String getConsumerByIp() {
String res = restTemplate.getForObject(REST_FIX_URL_PREFIX + "/helloProvider", String.class);
return res;
}
}
Debug 效果如下所示
暂时先保留
负载均衡策略
| 内置负载均衡类 | 说明 |
|---|---|
| RoundRobinRule | 简单的轮训服务列表来选择服务器。Ribbon的默认规则 |
| AvailabilityFilteringRule | 对以下两种服务器进行忽略: (1)在默认的情况下:这台服务器如果3次连接失败,这台服务器就会被设置“短路”状态。短路状态将持续30S,如果在此连接失败,短路的持续时间就会几何级增加 (2)并发数较高的服务器。如果一个服务器的并发连接数过高,配置了此规则的而客户端也会将忽略,可以有客户端的ActiveConnectionsLimit属性进行配置 |
| WeightedResponseTimeRule | 为每一个服务器赋予一个权重。服务器响应时间越长,这个服务器的权重就越小。这个规则会随机选择服务器,这个权重值会影响服务器的选择 |
| ZoneAvoidanceRule | 以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架。而在对Zone内的多个服务器进行轮询 |
| BestAvailableRule | 忽略那些短路的服务器,并选择并发数较低的服务器 |
| RandomRule | 随机选择一个可用的服务器 |
| RetryRule | 重试机制的选择逻辑 |
负载均衡策略配置
负载均衡策略配置的方式有两种:
代码方式、配置文件方式
代码方式
配置灵活,修改时需要重新打包发布,针对全局配置。

指定为随机策略
@Bean
public IRule randomRule(){
return new RandomRule();
}
配置文件方式
直观、方便、无需重新打包,但无法做全局配置
# 指定某个服务
xy-provider:
ribbon:
# 指定负载均衡规则
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
饥饿加载
配置方式
ribbon:
eager-load:
# 开启饥饿加载
enabled: true
# 指定饥饿加载的服务器列表名称
clients:
- xy-provider
开启前
第一次访问时耗时会比较长,因为会去注册中心拉取注册列表缓存到本地。
之后的访问耗时都会很短,因为少了一步操作。
浏览器请求耗时

控制台

- 从注册中心拉取所有的实例(服务)
- 然后拉取我们需要的服务,由负载均衡去选择访问节点。
开启后
控制台

开启饥饿加载后,重新启动,我们会发现项目一启动,就去加载服务列表。
浏览器

跟没开启之前,耗时会相差很多。
【SpringCloud】Ribbon的更多相关文章
- 【SpringCloud】Ribbon如何自定义客户端配置和全局配置
起因 事情的起因是这样的,公司内部要实现基于Zuul网关的灰度路由,在上线时进行灰度测试,故需要配置业务微服务向Eureka注册的metadata元数据,和自定义Ribbon的负载规则达到只访问灰度服 ...
- 【springcloud】springcloud Greenwich SR4版本笔记
springcloud Greenwich SR4版本笔记 本文只记录实际版本,配置,pom,代码以及注意事项.别的在其他springcloud 的F版本中已有详述. 示例代码地址:https://g ...
- 【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值
[SpringCloud]Gateway 配置全局过滤器获取请求参数和响应值 实现Ordered接口getOrder()方法,数值越小越靠前执行,记得这一点就OK了. 获取请求参数RequestBod ...
- 【SpringCloud】第二篇: 服务消费者(rest+ribbon)
前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...
- 【SpringCloud】08.客户端负载均衡器:Ribbon
客户端负载均衡器:Ribbon Ribbon实现软负载均衡核心: 服务发现 :依据服务的名字,把该服务下所有的实例都找出来 服务选择规则:依据规则策略,如果从多个实例中,选出有效的服务 服务监听:检测 ...
- 【springcloud】客户端负载均衡(Ribbon)
转自:https://blog.csdn.net/pengjunlee/article/details/86594934 服务器端负载均衡负载均衡是我们处理高并发.缓解网络压力和进行服务器扩容的重要手 ...
- 【SpringCloud】Netflix源码解析之Ribbon:负载均衡策略的定义和实现
Ribbon负载均衡策略定义 IRule其实就只做了一件事情Server choose(Object key),可以看到这个功能是在LB中定义(要求)的,LB把这个功能委托给IRule来实现.不同的I ...
- 【四】Ribbon负载均衡
1.概述1.1.是什么 Spring Cloud Ribbon 是基于Netflix Ribbon实现的一套客户端负载均衡的工具. 简单的说, Ribbon是Netflix发布的开源项目,主要功能是提 ...
- 【SpringCloud】第五篇: 路由网关(zuul)
前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...
- 【SpringCloud】第四篇:断路器(Hystrix)
前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...
随机推荐
- 明修"栈"道——越过Android启动栈陷阱
作者:vivo 互联网大前端团队- Zhao Kaiping 本文从一例业务中遇到的问题出发,以FLAG_ACTIVITY_NEW_TASK这一flag作为切入点,带大家探究Activity启动前的一 ...
- JavaScript 发布-订阅设计模式实现 React EventBus(相当于vue的$Bus)非父子之间通信
提前声明: 我没有对传入的参数进行及时判断而规避错误,仅仅对核心方法进行了实现: 解决了react的非父子间的通信: 参考文档:https://github1s.com/browserify/even ...
- 【译】ConfigureAwait FAQ
.NET 在数年前就在语言和库中添加了 async/await.在那段时间里,它像野火一样蔓延开来,不仅在 .NET 生态系统中,而且在无数其他语言和框架中被复制.在 .NET 中也看到了大量的改进, ...
- prism journal导航按钮的可用性探索记录
prism使用导航功能的时候,跳了几个坑,记录一下. 1.导航记录的产生,是在区域导航过程中产生的. _regionManager.Regions[PrismManager.MainViewRegio ...
- 安卓机上 4G 内存跑 alpaca,欢迎试用轻量级 LLM 模型推理框架 InferLLM
从 LLM 火爆以来,社区已经出现了非常多优秀的模型,当然他们最大的特点就是体积大,最近为了让大模型可以在更低端的设备上运行,社区做了非常多的工作, gptq 实现了将模型进行低比特量化,因此降低了运 ...
- 2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的。返回其长度。
2021-03-30:给定一个整数组成的无序数组arr,值可能正.可能负.可能0.给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的.返回其长度. 福大大 答 ...
- django时区问题的解决
django时区问题的解决 更新时间:2021年05月18日 09:37:58 作者:Silent丿丶黑羽 我们都知道时区,标准时区是UTC时区,django默认使用的就是UTC时区,我 ...
- TypeError: Cannot read property 'upgrade' of undefined
解决方案: 在你的.env.dev配置文件中配置VUE_APP_BASE_API并对target赋值
- KO之间互相调用
需求 假设有两个KO,命名为moduleA.KO,moduleB.KO,现在要实现在moduleB.KO中调用moduleA.KO中的函数. 实现 ModuleA实现 源码: #include < ...
- 2015年蓝桥杯C/C++大学B组省赛真题(星系炸弹)
题目描述: 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之后爆炸. 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在 ...