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&#…

【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;这个数字之…

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

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

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

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

对象克隆学习

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

代理(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;那么其他未初始…

【React系列】Hook(一)基本使用

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. 认识hook 1.1. 为什么需要hook Hook 是 React 16.8 的新增特性&#xff0c;它可以让我们在不编写class的情况下…

群晖Docker部署HomeAssistant容器结合内网穿透远程控制家中智能设备

目录 一、下载HomeAssistant镜像 二、内网穿透HomeAssistant&#xff0c;实现异地控制智能家居 三、使用固定域名访问HomeAssistant 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。 点击跳转到网站 Ho…

Guava Cache 异步刷新技巧,你值得拥有!

以下文章来源于勇哥Java实战 &#xff0c;作者勇哥 Guava Cache是一款非常优秀的本地缓存框架。 这篇文章&#xff0c;我们聊聊如何使用 Guava Cache 异步刷新技巧带飞系统性能 。 1 经典配置 Guava Cache 的数据结构跟 JDK1.7 的 ConcurrentHashMap 类似&#xff0c;提供了基…

citeSpace保姆级安装使用教程

citeSpace保姆级安装使用教程 文章目录 citeSpace保姆级安装使用教程CiteSpace功能与参数区安装使用知网数据导出citespace数据导入结果 设置操作隐藏节点 CiteSpace功能与参数区 安装 citeSpace安装教程 citespace下载 网址&#xff1a;https://citespace.podia.com/ 安装之…

STM32使用中断方式进行USART数据收发以及printf函数的重写

时间记录&#xff1a;2024/1/5 一、USART/UART介绍 协议介绍 &#xff08;1&#xff09;起始位&#xff0c;一位逻辑电平0表示 &#xff08;2&#xff09;数据位&#xff0c;8-9位&#xff0c;逻辑高低电平&#xff0c;一般使用8位 &#xff08;3&#xff09;校验位&#xff…

2-sql注入之sqli-labs靶场搭建

文章目录 SQL注入之sqli-labs靶场搭建1、Sqli-labs环境安装需要安装以下环境工具下载链接&#xff1a; 2、phpstudy连接mysql总是启动了又停止第一种情况可能是端口占用问题第二种情况就是曾经在电脑上安装过mysql SQL注入之sqli-labs靶场搭建 Sqli-labs是一个印度程序员写的&…

vmware中ubuntu虚拟机不能够用共享文件夹

有时候发现装好虚拟机后&#xff0c;然后 虚拟机-设置-选项-共享文件夹 然后使用快捷键ctrlaltt 打开命令行&#xff0c;cd /mnt下没有看到hgfs文件夹 解决办法是安装vmware tools工具 此时想通过点击 虚拟机-安装vmwaretools工具 按钮 居然发现该按钮是灰色的&#xff0…

CMake入门教程【核心篇】动态库(dll, so)

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 CMake入门教程【核心篇】动态库(dll, so)1.简介2.动态库的优势3.动态库的劣势4.创建动态库5.完整代码示例6.实战使用技巧与注意事项

实现文件拖拽上传的功能

1 先来看一下效果 2 我们来看一下代码执行的结果&#xff1a; 我们创建目标的容器盒子 和可以展示数据的ul 监听进入目前盒子的事件 3 文件进入目标容器中解析文件

Python中 的函数介绍

函数 在Python中,函数是用来执行某种功能的 函数定义 def function_name(参数列表):代码块[return val]比如 #---------------定义------------- def add_3(num):newnum num3return newnumnum 3 print(add_3(num))函数调用 def add_3(num):newnum num3return newnumnum …