Ribbon客户端负载均衡

简介

Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具。

简单的说,Ribbon是Netflix发布的开源项目,主要功能是提供客户端的软件负载均衡算法和服务调用。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。

Ribbon本地负载均衡客户端VS Nginx服务端负载均衡区别

Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求。即负载均衡是由服务端实现的。
Ribbon本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

集中式LB

即在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5, 也可以是软件,如nginx),由该设施负责把访问请求通过某种策略转发至服务的提供方;

进程内LB

将LB逻辑集成到消费方,消费方从服务注册中心获知有哪些地址可用,然后自己再从这些地址中选择出一个合适的服务器。

Ribbon就属于进程内LB,它只是一个类库,集成于消费方进程,消费方通过它来获取到服务提供方的地址。

总结

ribbon就是@loadbalance注解+ RestTemplate通过http://[服务名]的调用。
ribbon已经集成到Eureka中,无需另外引包。
在这里插入图片描述

Ribbon负载规则及替换

  • RoundRobinRule 轮询
  • RandomRule 随机
  • RetryRule 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重
  • WeightedResponseTimeRule 对RoundRobinRule的扩展,响应速度越快的实例选择权重越大,越容易被选择
  • BestAvailableRule 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的服务
  • AvailabilityFilteringRule 先过滤掉故障实例,再选择并发较小的实例
  • ZoneAvoidanceRule 默认规则,复合判断server所在区域的性能和server的可用性选择服务器

替换

在componentScan可以扫描的区域外(启动类所在的包以及子包)新建一个配置类。
在这里插入图片描述

@Configuration
public class Myrule {@Beanpublic IRule myRule(){return new RandomRule();}
}

最后在主启动类上加入@RibbonClient(name = “CLOUD-PAYMENT-SERVICE”,configuration = Myrule.class)即可。
name为配置的服务名,configuration为配置类。

使用DiscoveryClient实现轮询负载均衡

核心是根据discoveryClient服务发现客户端获取服务提供者的所有实例,能够通过实例获取IP、端口等信息。
List instances = discoveryClient.getInstances(“CLOUD-PAYMENT-SERVICE”);

负载均衡实现类:通过原子int简单轮询取模获得服务提供者IP

public interface LoadBalancer {ServiceInstance instances(List<ServiceInstance>serviceInstances);}@Component
public class MyLB implements LoadBalancer{private AtomicInteger atomicInteger=new AtomicInteger(0);private final int getAndIncrement(){int current,next;do{current= atomicInteger.get();next=current>Integer.MAX_VALUE?0:current+1;}while (!atomicInteger.compareAndSet(current,next));System.out.println("-********访问的次数next*****:"+next);return next;}@Overridepublic ServiceInstance instances(List<ServiceInstance> serviceInstances) {int idx=getAndIncrement()%serviceInstances.size();return serviceInstances.get(idx);}
}

通过discoveryClient收集所有服务提供者的信息,由负载均衡进行轮询选择服务者。

 	@Resourceprivate RestTemplate restTemplate;@Resourceprivate LoadBalancer loadBalancer;@Resourceprivate DiscoveryClient discoveryClient;@GetMapping("/consumer/payment/lb")public String getPaymentLB(){List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");if(instances==null || instances.size()<=0){return null;}//获取本次调用的服务实例ServiceInstance serviceInstance = loadBalancer.instances(instances);URI uri = serviceInstance.getUri();return restTemplate.getForObject(uri+"/payment/lb", String.class);}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【操作系统】输入/输出系统

目录 l/O系统的功能、模型和接口 l/O设备和设备控制器 中断和中断处理程序 设备驱动程序 与设备无关的I/O 用户层的I/O软件 缓冲区管理 磁盘性能概述和磁盘调度 l/O系统的功能、模型和接口 I/O系统管理 1&#xff09;主要对象&#xff1a; I/O设备和对应的设备控制器 …

IP代理测试:关于Ping测试你需要知道的一切干货

您在访问互联网时是否遇到过持续滞后或花费很长时间等待网站加载的情况&#xff1f;为了避免这种情况&#xff0c;您可以测试 ping 以查看连接速度。如果您使用代理&#xff0c;此 ping 测试还会显示代理服务器的响应速度。 ping 测试是一个很有价值的工具&#xff0c;可以帮助…

C++ 释放指针

在C中&#xff0c;释放指针通常使用delete或delete[]操作符&#xff1b; 如果指针指向的是单个对象&#xff0c;可以使用delete操作符进行释放&#xff1b; 在释放完内存后&#xff0c;最好将指针置为nullptr&#xff0c;以避免出现悬空指针&#xff08;dangling pointer&#…

浅谈指数移动平均(ema)

经常在各种代码中看到指数移动平均(比如我专注的网络传输领域)&#xff0c;但却不曾想到它就是诠释世界的方法&#xff0c;我们每个人都在被这种方式 “平均”… 今天说说指数移动平均(或移动指数平均&#xff0c;Exponential Moving Average)。 能查到的资料都侧重于其数学形…

且看迥然不同的 diff

文章目录 且看迥然不同的 diff语法默认比较两个文件并排显示方便比较context模式比较unified模式比较对比时忽略空格更多信息且看迥然不同的 diff Linux diff 命令用于比较文件的差异。 当然还有很多比较文件的专业工具,但是如果在Linux命令行,这个是最原始最初的,也是开机…

【Linux Shell】4. 数组

文章目录 【 1. 数组的定义 】【 2. 读取数组 】【 3. 关联数组 】3.1 关联数组的定义3.2 关联数组元素的调用 【 4. 获取数组中的所有元素 】【 5. 获取数组的长度 】 数组中可以存放多个值。 Bash Shell 只支持一维数组&#xff08;不支持多维数组&#xff09;&#xff0c;初…

算法训练第五十九天|503. 下一个更大元素 II、42. 接雨水

503. 下一个更大元素 II&#xff1a; 题目链接 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之…

AutoCAD 中镜像 操作

在 AutoCAD 中,镜像是一种常用的操作,可以在绘图过程中快速进行镜像对称。以下是 AutoCAD 中进行镜像操作的常用快捷键命令: 1. 镜像命令:MIRROR 或 MI - 输入 MIRROR 或 MI,然后按 Enter 键启动镜像命令。 2. 指定第一点:F 或 F+Enter - 输入 F 或 F+Enter,然后选择…

影响服务器正常使用的有哪些因素

对于网站优化来说&#xff0c;网站服务器的优化绝对是基础。不管是用户还是搜索引擎对于网站的打开速度都是没有太多耐心的&#xff0c; 所以网站优化的就是要保证网站服务器稳定&#xff0c;网站正常且快速的打开 1.用户体验较差 现在越来越强调用户体验&#xff0c;设想一…

imgaug库指南(五):从入门到精通的【图像增强】之旅

引言 在深度学习和计算机视觉的世界里&#xff0c;数据是模型训练的基石&#xff0c;其质量与数量直接影响着模型的性能。然而&#xff0c;获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此&#xff0c;数据增强技术应运而生&#xff0c;成为了解决这一问题的…

游戏化教学在高校平台基础课程中的实践与学习体验提升

在高职计算机学院&#xff0c;无论计算机应用技术、软件技术、大数据应用技术还是人工智能应用等不同专业方向的学生&#xff0c;首先要接触和掌握一系列的基础平台课程。这些课程不仅包括政治、英语、数学等文化基础知识内容&#xff0c;更关键的是涉及网页设计基础、编程基础…

智慧校园全空间三维电子沙盘系统

一、概述 易图讯科技&#xff08;www.3dgis.top&#xff09;采用大数据、云计算、虚拟现实、物联网、AI等先进技术&#xff0c;自主可控高性能WebGIS可视化引擎&#xff0c;支持多用户客户端通过网络请求访问服务器地图和专题数据&#xff0c;提供地理信息数据、专题数据的并发…

MW Open - 高效率的API接口管理工具

本文将会详细介绍 MW Open&#xff0c;一个高效率的 API 接口管理工具&#xff0c;并提供相关代码示例。 一、简介 MW Open 是一款开源的 API 接口管理工具&#xff0c;支持管理 API 接口、测试 API 接口、生成 API 文档等功能。MW Open 拥有简洁明了的接口管理界面&#xff…

对象克隆学习

假如说你想复制一个简单变量。很简单&#xff1a; int apples 5; int pears apples; 不仅仅是int类型&#xff0c;其它七种原始数据类型(boolean,char,byte,short,float,double.long)同样适用于该类情况。 但是如果你复制的是一个对象&#xff0c;情况就有些复杂了。 …

vue插件--xterm封装

安装 npm install xterm xterm-addon-fit -D两种模式 log:日志输出shell:终端命令 <template><div :id"id" class"xterm"></div> </template> <script> import { defineComponent, onMounted, onBeforeUnmount, watch, n…

Centos7.9和Debian12部署Minio详细流程

一、安装minio Centos wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio-20230227181045.0.0.x86_64.rpm -O minio.rpm sudo dnf install minio.rpmDebian wget https://dl.min.io/server/minio/release/linux-amd64/archive/minio_20230227181045.0…

axios的七大特性

1、在浏览器中发送 XMLHttpRequests 请求&#xff1b; 2、在 node.js 中发送 http请求&#xff1b; 3、基于 promise 的 HTTP 库&#xff0c;支持promise所有的API 4、拦截请求和响应&#xff1b;&#xff08;修改请求数据&#xff0c;只能用在PUT,POST和PATCH这几个请求方法&…

代理(Proxy)模式

代理&#xff08;Proxy&#xff09;模式介绍 作用&#xff1a;通过代理可以控制访问某个对象的方法&#xff0c;在调用这个方法前做前置处理&#xff0c;调用这个方法后做后置处理。&#xff08;即&#xff1a; AOP的微观实现&#xff01;&#xff09; 核心角色 抽象角色(接口…

C++初级(三)

我们这里还是在C基础上进行对C基础语法的补充学习&#xff01; 一.C数组 C数组大体和C相同&#xff0c;但是C数组还是有一定的区别的。 我们先看看C和C数组共同的易错点知识&#xff1a; 1.数组只能一次初始化。 2.如果对数组只进行一部分初始化&#xff0c;那么其他未初始…

PHP写一个函数能够遍历一个文件夹下的所有文件和子文件夹

社区版本可以用 function myscandir($dir) { $files array(); if ( $handle opendir($dir) ) { while ( ($file readdir($handle)) ! false ) { if ( $file ! ".." && $file ! "." ) { if ( isdir($dir . "/" . $file) ) { $…