Ribbon

负载均衡原理

  1. order-service 发起 user-service 请求,被ribbon进行拦截;
  2. ribbon会向注册中心拉取user-service 相对应的服务;
  3. 注册中心返回user-service服务列表;
  4. 由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

开启前

第一次访问时耗时会比较长,因为会去注册中心拉取注册列表缓存到本地。

之后的访问耗时都会很短,因为少了一步操作。

浏览器请求耗时

控制台

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

开启后

控制台

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

浏览器

跟没开启之前,耗时会相差很多。

【SpringCloud】Ribbon的更多相关文章

  1. 【SpringCloud】Ribbon如何自定义客户端配置和全局配置

    起因 事情的起因是这样的,公司内部要实现基于Zuul网关的灰度路由,在上线时进行灰度测试,故需要配置业务微服务向Eureka注册的metadata元数据,和自定义Ribbon的负载规则达到只访问灰度服 ...

  2. 【springcloud】springcloud Greenwich SR4版本笔记

    springcloud Greenwich SR4版本笔记 本文只记录实际版本,配置,pom,代码以及注意事项.别的在其他springcloud 的F版本中已有详述. 示例代码地址:https://g ...

  3. 【SpringCloud】Gateway 配置全局过滤器获取请求参数和响应值

    [SpringCloud]Gateway 配置全局过滤器获取请求参数和响应值 实现Ordered接口getOrder()方法,数值越小越靠前执行,记得这一点就OK了. 获取请求参数RequestBod ...

  4. 【SpringCloud】第二篇: 服务消费者(rest+ribbon)

    前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...

  5. 【SpringCloud】08.客户端负载均衡器:Ribbon

    客户端负载均衡器:Ribbon Ribbon实现软负载均衡核心: 服务发现 :依据服务的名字,把该服务下所有的实例都找出来 服务选择规则:依据规则策略,如果从多个实例中,选出有效的服务 服务监听:检测 ...

  6. 【springcloud】客户端负载均衡(Ribbon)

    转自:https://blog.csdn.net/pengjunlee/article/details/86594934 服务器端负载均衡负载均衡是我们处理高并发.缓解网络压力和进行服务器扩容的重要手 ...

  7. 【SpringCloud】Netflix源码解析之Ribbon:负载均衡策略的定义和实现

    Ribbon负载均衡策略定义 IRule其实就只做了一件事情Server choose(Object key),可以看到这个功能是在LB中定义(要求)的,LB把这个功能委托给IRule来实现.不同的I ...

  8. 【四】Ribbon负载均衡

    1.概述1.1.是什么 Spring Cloud Ribbon 是基于Netflix Ribbon实现的一套客户端负载均衡的工具. 简单的说, Ribbon是Netflix发布的开源项目,主要功能是提 ...

  9. 【SpringCloud】第五篇: 路由网关(zuul)

    前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...

  10. 【SpringCloud】第四篇:断路器(Hystrix)

    前言: 必需学会SpringBoot基础知识 简介: spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理.服务发现.断路器.路由.微代理.事件总线.全局锁.决策竞选. ...

随机推荐

  1. 明修"栈"道——越过Android启动栈陷阱

    作者:vivo 互联网大前端团队- Zhao Kaiping 本文从一例业务中遇到的问题出发,以FLAG_ACTIVITY_NEW_TASK这一flag作为切入点,带大家探究Activity启动前的一 ...

  2. JavaScript 发布-订阅设计模式实现 React EventBus(相当于vue的$Bus)非父子之间通信

    提前声明: 我没有对传入的参数进行及时判断而规避错误,仅仅对核心方法进行了实现: 解决了react的非父子间的通信: 参考文档:https://github1s.com/browserify/even ...

  3. 【译】ConfigureAwait FAQ

    .NET 在数年前就在语言和库中添加了 async/await.在那段时间里,它像野火一样蔓延开来,不仅在 .NET 生态系统中,而且在无数其他语言和框架中被复制.在 .NET 中也看到了大量的改进, ...

  4. prism journal导航按钮的可用性探索记录

    prism使用导航功能的时候,跳了几个坑,记录一下. 1.导航记录的产生,是在区域导航过程中产生的. _regionManager.Regions[PrismManager.MainViewRegio ...

  5. 安卓机上 4G 内存跑 alpaca,欢迎试用轻量级 LLM 模型推理框架 InferLLM

    从 LLM 火爆以来,社区已经出现了非常多优秀的模型,当然他们最大的特点就是体积大,最近为了让大模型可以在更低端的设备上运行,社区做了非常多的工作, gptq 实现了将模型进行低比特量化,因此降低了运 ...

  6. 2021-03-30:给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的。返回其长度。

    2021-03-30:给定一个整数组成的无序数组arr,值可能正.可能负.可能0.给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的.返回其长度. 福大大 答 ...

  7. django时区问题的解决

    django时区问题的解决  更新时间:2021年05月18日 09:37:58   作者:Silent丿丶黑羽     我们都知道时区,标准时区是UTC时区,django默认使用的就是UTC时区,我 ...

  8. TypeError: Cannot read property 'upgrade' of undefined

    解决方案: 在你的.env.dev配置文件中配置VUE_APP_BASE_API并对target赋值

  9. KO之间互相调用

    需求 假设有两个KO,命名为moduleA.KO,moduleB.KO,现在要实现在moduleB.KO中调用moduleA.KO中的函数. 实现 ModuleA实现 源码: #include < ...

  10. 2015年蓝桥杯C/C++大学B组省赛真题(星系炸弹)

    题目描述: 在X星系的广袤空间中漂浮着许多X星人造"炸弹",用来作为宇宙中的路标. 每个炸弹都可以设定多少天之后爆炸. 比如:阿尔法炸弹2015年1月1日放置,定时为15天,则它在 ...