Ribbon自定义负载均衡算法

Ribbon是什么?

Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法,将Netflix的中间层服务连接在一起。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,就是在配置文件中列出Load Balancer(简称LB)后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器。我们也很容易使用Ribbon实现自定义的负载均衡算法。

负载均衡

负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。

在这里插入图片描述

集中式LB和进程内LB

而负载均衡又分为两类,集中式负载均衡和进程内负载均衡,什么是集中式负载均衡和进程内负载均衡?

集中式负载均衡
在服务的消费方和提供方之间使用独立的负载均衡设施(可以是硬件,如F5,也可以是软件,如nginx),由该设施负责吧访问请求通过某中策略转发至服务的提供方

进程内负载均衡
将负载均衡逻辑集成到消费方,消费方从服务注册中心获知那些地址可用,然后自己再从这些地址中选择一个合适的服务器,例如ribbon,ribbon只是一个类库,集成在消费方进程,消费方通过它来获取到服务提供方的地址

Riboon怎么做到负载均衡的?

先看看Ribbon的原理图
从下面的原理图可以看到服务提供者去注册服务到注册中心Eureka去,而服务消费者通过Ribbon去服务注册中心获取查询这些可以的服务列表,然后根据要调用的那个服务进行负载均衡请求
在这里插入图片描述

Ribbon自带的负载均衡算法

在这里插入图片描述
Ribbon自带了7中负载均衡算法

1、RoundRobinRule
默认的,轮询规则,也是很多高级规则中退避的一种策略

2、 AvailabilityFilteringRule
会过滤掉打开熔断的服务或者是高并发连接数量的服务

3、 WeightedResponseTimeRule
通过服务的平均响应时间,给每一个服务一个权重,响应时间越长,权重越小,开始统计信息不足,应用轮询策略

4、 RetryRule
先按照轮询策略,如果请求服务失败,会在指定时间内进行重试

5、 BestAvailableRule
先过滤掉断路器的服务,然后选择一个并发量最小的

6、 RandomRule
随机获取一个服务

7、ZoneAvoidanceRule
根据性能和可用性来选择。

Ribbon默认是使用轮询的算法,怎么修改?

第一步
添加自定义类,但是要注意存放的位置这个自定义的类不能放在@ComponentScan所扫描的当前包以及子包下,否则我们自定义的这个配置类就会被所有的Ribbon客户端所共享,也就是我们达不到特殊化指定的目的了,也就是说不能放在与主启动类同包及子包下
在这里插入图片描述
第二步
在客户端添加一个controller,去调用服务

@GetMapping("/consumer/payment/get/{id}")public CommonResult<Payment> getPayment(@PathVariable("id")Long id){return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);}

第三步
将三个服务添加注册到服务中心
在这里插入图片描述
调用消费者模块的/consumer/payment/get/{id},成功出现随机的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

如果我们想用自己写的负载均衡算法怎么办?

先看看ribbon的负载均衡算法是什么结构?怎么写的?

先看看这个接口,这个接口是Ribbon中自己的负载均衡算法所实现的
在这里插入图片描述
看一下他的实现类,这个抽象类实现了IRule,抽象类实现接口是为了让子类更容易的去实现这个接口,这个抽象类只对IRule接口中的setLoadBalancer和getLoadBalancer进行了实现,把获取到的值进行赋值保存,方便的子类的使用,这两个方法可以看作是获取服务中心的服务信息
在这里插入图片描述
再来看看Ribbon的自己的负载均衡算法是怎么实现的?他实现了上面说的那个抽象类
在这里插入图片描述
首先会先调用这个choose,这个choose调用了父类AbstractLoadBalancerRule的getLoadBalancer,上面说过这个可以看作是获取服务中心的服务信息,然后调用了choose的重载方法
在这里插入图片描述
使用lb去获取存活(活跃)的服务和获取所有服务
在这里插入图片描述
获取服务数量的长度,然后调用chooseRandomInt(),去获取一个服务数量内的随机的下标,然后调用存放存活的服务的list通过下标去获取一个存活的服务
在这里插入图片描述
然后对获取的这个服务判断是否是存活状态,如果是存活状态就返回这个服务给调用者调用,如果不是存活的话 就就执行Thread.yield()线程让步,然后等再次循环拿下一个服务
在这里插入图片描述

Thread.yield( )解释

Java线程中的Thread.yield( )方法,译为线程让步。顾名思义,就是说当一个线程使用了这个方法之后,它就会把自己CPU执行的时间让掉,
让自己或者其它的线程运行,注意是让自己或者其他线程运行,并不是单纯的让给其他线程。
​ yield()的作用是让步。它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执行权;但是,并不能保
证在当前线程调用yield()之后,其它具有相同优先级的线程就一定能获得执行权;也有可能是当前线程又进入到“运行状态”继续运行!

开始自定义负载均衡

从上面的源码分析可以看到我们要自定义负载均衡算法需要继承IRule的抽象实现类AbstractLoadBalancerRule,所以我们也可以写一个类去实现他,然后在 Server choose(ILoadBalancer lb, Object key) 里面设置规则

我们就先自定义一个轮询的,不使用ribbon自带的

编写一个类继承AbstractLoadBalancerRule,然后模仿ribbon自带的,创建一个choose的重载方法,注意:记得加上**@Component**注解,否则SpringBoot不会扫描到

@Component
public class MyRoundRobinRule extends AbstractLoadBalancerRule {//定义一个原子类,以保证原子性private AtomicInteger atomicInteger =new AtomicInteger(0);@Overridepublic void initWithNiwsConfig(IClientConfig iClientConfig) {}public Server choose(ILoadBalancer lb, Object key) {if (lb == null){return null;}//用于统计获取次数,当达到一定数量就不再去尝试int count = 0;Server server = null;//当服务还没获取到,并且尝试没有超过8次while (server == null && count++ < 8){//获取服务List<Server> allServers = lb.getAllServers();List<Server> reachableServers = lb.getReachableServers();int allServersSize = allServers.size();int reachableServersSize = reachableServers.size();//如果获取的服务list都为0就返回nullif(allServersSize == 0 || reachableServersSize == 0){return  null;}//获取服务下标int next = getServerIndex(allServersSize);//获取服务server = reachableServers.get(next);//如果服务为空直接跳过下面的if (server == null){continue;}//如果获取到的这个服务是活着的就返回if (server.isAlive()){return server;}//如果获取到的服务不是空,但是不是存活状态,需要重新获取server=null;}//最后这里可能会返回nullreturn  server;}//获取服务下标,为了保证原子性,使用了CASpublic int getServerIndex(int allServersSize){//自旋锁for (;;) {//获取当前值int current = this.atomicInteger.get();//设置期望值int next = (current + 1) % allServersSize;//调用Native方法compareAndSet,执行CAS操作if (this.atomicInteger.compareAndSet(current, next))//成功后才会返回期望值,否则无线循环return next;}}@Overridepublic Server choose(Object key) {return choose(getLoadBalancer(),key);}
}

在主启动类上添加
@RibbonClient(name = “CLOUD-PAYMENT-SERVICE” ,configuration = MyRoundRobinRule.class)
configuration 指定自己的负载均衡策略

在RestTemplate加@LoadBalanced
在这里插入图片描述

启动测试,成功出现轮询!

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/140589.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【c语言】贪吃蛇

当我们不想学习新知识的时候&#xff0c;并且特别无聊&#xff0c;就会突然先看看别人怎么写游戏的&#xff0c;今天给大家分享的是贪吃蛇&#xff0c;所需要的知识有结构体&#xff0c;枚举&#xff0c;以及easy-x图形库的一些基本函数就完全够用了&#xff0c;本来我想插入游…

数据结构--希尔排序

目录 希尔排序的定义 给一个序列进行希尔排序 希尔排序的算法实现 算法性能分析 1.时间复杂度 2.稳定性 3.适用性 知识点回顾 希尔排序的定义 给一个序列进行希尔排序 第一趟d可以是元素个数/2 相距为4的子表 对子表进行直接插入排序&#xff08;由小到大&#xf…

PostgreSQL 查询某个属性相同内容出现的次数

查询某个数据库表属性 name 相同内容出现出现的次数&#xff0c;并按次数从大到小排序 SELECT name, COUNT(*) AS count FROM your_table GROUP BY name ORDER BY count DESC;示例 select project_id, COUNT(*) AS count from app_ads_positions group by project_id order b…

Mojo:新AI语言中的7个惊人的Python升级

一、说明 AI发展是日新月异的&#xff0c;对于新模型的产生&#xff0c;我们不能不给以关注。Mojo就是一种新发布的编程语言&#xff0c;专为AI开发人员制作&#xff0c;由Modular制作&#xff0c;Modular是一家由Swift的原始创建者Chris Lattner创立的公司。 二、关于MOJO的概…

山石网科国产化入侵防御系统,打造全生命周期的安全防护

随着互联网的普及和网络安全的威胁日益增加&#xff0c;botnet感染成为了企业面临的重要问题之一。botnet是一种由分散的客户端&#xff08;或肉鸡&#xff09;组成的网络&#xff0c;这些客户端被植入了bot程序&#xff0c;受控于攻击者。攻击者通过这些客户端的bot程序&#…

华为云云耀云服务器L实例评测|Docker版的Minio安装 Springboot项目中的使用 结合vue进行图片的存取

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到过MySQL数据库被攻击的情况&#xff0c;Redis被攻击的情况&#xff0c;教训是密码不能太简单。在使用服务器时&#xff0c;学习到很多运维相关的知识。 本篇博客介绍如何在Linux中安装mi…

vue element 搜索框根据后台的接口实现模糊查询 + 分页特殊处理+重置表格

模糊查询效果图 1.配置接口 search: "/api/goods/search", //搜索接口/goods/search 2.get接口 search(params) { return axios.get(base.search, { params });//后台传参 再写这个params }, 3.异步请求接口 // 搜索接口async search(search){let res await this…

大模型的最大bug,回答正确率几乎为零,GPT到Llama无一幸免

目录 前言 1.名字和描述颠倒一下&#xff0c;大模型就糊涂了 2.实验及结果 3.未来展望 前言 大模型的逻辑&#xff1f;不存在的。 我让 GPT-3 和 Llama 学会一个简单的知识&#xff1a;A 就是 B&#xff0c;然后反过来问 B 是什么&#xff0c;结果发现 AI 回答的正确率竟然是…

**20.迭代器模式(Iterator)

意图&#xff1a;提供一种方法顺序访问一个聚合对象中的各个元素&#xff0c;而又不需要暴露该对象的内部表示。 上下文&#xff1a;集合对象内部结构常常变化各异。对于这些集合对象&#xff0c;能否在不暴露其内部结构的同时&#xff0c;让外部Client透明地访问其中包含的元素…

github 网页显示不全?

问题 解决 1、检查网页&#xff0c;打开 network&#xff0c;重新刷新 github 网页 2、查看无法加载的资源&#xff08;如 css 文件&#xff09; 3、查看域名地址 https://tool.chinaz.com/dns/&#xff0c;github.githubassets.com&#xff08;检查网页元素&#xff0c;点击无…

文件系统详解

目录 文件系统&#xff08;1&#xff09; 第一节文件系统的基本概念 一、文件系统的任务 二、文件的存储介质及存储方式 三、文件的分类 第二节 文件的逻辑结构和物理结构 一、文件的逻辑结构 二、文件的物理结构 文件系统&#xff08;2&#xff09; 第三节 文件目…

uniapp webview实现双向通信

需求&#xff1a;uniapp webview嵌套一个h5 实现双向通信 uniapp 代码 <template><view><web-view src"http://192.168.3.150:9003/" message"onMessage"></web-view></view> </template><script>export defau…

前端uniapp如何转base64使用uniapp插件市场

插件市场 网址 使用 可以下载&#xff0c;也可以引用&#xff0c;我是下载下来的引用 代码 正常使用 pathToBase64(img).then(path > {img pathresolve(path)}).catch(error > {console.error(error)reject(error)})使用出现[object Promise]错误 解决方法 let img …

程序运行时增加语音提示

目录 前言 一、认识SAPI 二、使用方法 三、测试效果​编辑 总结 前言 在测试过程中为了更高效的提示操作者&#xff0c;在程序执行时增加语音提醒会方便很多&#xff0c;利用微软的SAPI可以很方便的在程序有问题时提示操作者。 一、认识SAPI SpVoice类是支持语音合成(TTS)的核…

WebGL 计算平行光、环境光下的漫反射光颜色

目录 光照原理 光源类型 平行光 点光源 环境光 反射类型 漫反射 漫反射光颜色 计算公式 环境反射 环境反射光颜色 表面的反射光颜色&#xff08;漫反射和环境反射同时存在时&#xff09;计算公式 平行光下的漫反射 根据光线和法线方向计算入射角θ&#xff08;以便…

基于springboot+vue的入校申报审批系统

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

MySQL数据库的索引和事务

目录 一、索引 1.1Mysql索引 1.2索引的作用 1.3 创建索引的依据 1.4 普通索引 修改表方式创建索引 删除索引 1.5 唯一索引 修改表方式创建 删除索引 1.6 主键索引 修改表方式创建 1.7 组合索引 1.8 全文索引 1.9查看索引 二、事务 2.1事务概念 2.2事务的ACID特…

C语言每日一题(10):无人生还

文章主题&#xff1a;无人生还&#x1f525;所属专栏&#xff1a;C语言每日一题&#x1f4d7;作者简介&#xff1a;每天不定时更新C语言的小白一枚&#xff0c;记录分享自己每天的所思所想&#x1f604;&#x1f3b6;个人主页&#xff1a;[₽]的个人主页&#x1f3c4;&#x1f…

全套配置细节:缺省路由实验配置

1、实验目的 掌握默认路由的适用场合和配置方法 2、实验拓扑 默认路由的配置 3、实验步骤 &#xff08;1&#xff09;配置网络连通性如下。 1&#xff09;R1 的配置如下 &#xff1a; <Huawei>system-view Enter system view, return user view with CtrlZ. [Huaw…

网络安全——(黑客)自学

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01;&#xff01;&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队…