负载均衡 LoadBalancer

负载均衡

负载均衡一般分为服务端负载均衡客户端负载均衡

  • 服务端负载均衡:

指在服务器端进行负载均衡的策略。在这种策略下,负载均衡器位于服务器端(如 Nginx),当客户端发起服务调用时,根据服务器的负载情况,将请求分发到不同的服务器上,以实现请求的均衡分配。

负载均衡器可以根据特定的算法(如轮询、权重等)来选择合适的服务器。这种方式可以有效地提高系统的可用性和扩展性,但也会增加服务器端的压力。

  • 客户端负载均衡:

指在客户端进行负载均衡的策略。在这种策略下,负载均衡器位于客户端(如Loadbalancer、Ribbon),每个发起服务调用的客户端都有完整的目标服务地址列表,根据配置的负载均衡策略(如随机选择、加权轮询等),由客户端自己决定向哪台服务器发起调用。

客户端负载均衡可以减轻服务器端的压力,提高系统的性能和吞吐量。然而,客户端负载均衡依赖于客户端的实现,需要对客户端进行相应的配置和管理。

Ribbon

Spring Cloud Ribbon 是 NetFlix 开源的一个基于 HTTP 和 TCP 的客户端负载均衡器。

Ribbon 可以和 Eureka、Consul 等服务发现组件集成,通过向服务注册中心查询可用的服务列表,并通过一定的负载均衡算法(如轮训、随机等)选择目标服务实例。

Ribbon 已经进入维护模式,并且 Ribbon 2 并不与 Ribbon 1 相互兼容;

Ribbon 负载均衡策略有以下七种

  • 轮询(RoundRobinRule)

按照一定的顺序依次调用服务实例。例如有 ServerA、ServerB、ServerC 3个服务,按照 ABC 顺序依次调用服务。(按部就班)

默认超过 10 次获取到的 Server 都不可用,会返回一个空的 Server。

  • 权重(WeightedResponseTimeRule)

根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。(能者多劳)

实现原理:刚开始使用轮询策略则开启一个计时器,每一段时间收集一次所有服务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高的服务被选中的概率也就越大。

  • 随机(RandomRule)

从服务提供者列表随机选择一个服务实例调用。(随性而为)

如果随机到的 Server 为 null 或者不可用的话,会 while 不停的循环选取。

  • 最小连接数(BestAvailableRule)

也称为最小并发数策略,首先遍历服务提供者列表,然后选择连接数最小的一个服务实例 。如果有相同的最小连接数,那么会调用轮询策略进行选取。(让最闲的来)

此策略会过滤掉故障服务,基于过去30分钟的统计结果选取当前并发量最小的服务节点,即最“闲”的节点作为目标地址。

  • 重试(RetryRule)

按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定时间内不断地进行重试来获取服务,如果超过指定时间依然没有获取到服务实例,则返回 null。(卷土重来)

  • 可用性敏感(AvailabilityFilteringRule)

扩展了轮询策略,会先通过默认的轮询选取一个 Server,再去判断该 Server 是否超时可用,当前连接数是否超限,都成功再返回。

  • 区域敏感(ZoneAvoidanceRule)——默认策略

扩展了轮询策略,除了过滤超时和链接数过多的 Server,还会过滤掉不符合要求的 Zone 区域里面的所有节点, 在一个区域/机房内的服务实例中轮询。先过滤再轮询

修改 Ribbon 默认负载均衡策略方法如下:

在 application.yaml 配置文件中加入以下配置:

# 针对的被调用方微服务名称,不加就是全局生效
cloud-provider-8001:ribbon:# 设置为 最小连接数策略NFLoadBalancerRuleClassName: com.netflix.loadbalancer.BestAvailableRule
LoadBalancer

Spring Cloud LoadBalancer 是 Spring Cloud 团队在 Spring Cloud 2020 版本后引入的一个新的负载均衡组件。

LoadBalancer 提供了一个抽象的负载均衡接口,可以与多种负载均衡实现(如 Ribbon、Nacos、Consul等)进行匹配。

LoadBalancer 提供了两种负载均衡策略:

  • 轮询(RoundRobinLoadBalancer)
  • 随机(RandomLoadBalancer)

LoadBalancer 默认策略为轮询。

修改 LoadBalancer 默认负载均衡策略方法如下:

首先创建随机策略的配置类 LoadBalancerConfig,具体如下:

public class LoadBalancerConfig {/*** 将官方提供的 RandomLoadBalancer 注册为 Bean*/@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}

然后使用 @LoadBalancerClient 注解配置对应服务的负载均衡策略,具体如下:

@Configuration
@LoadBalancerClient(value = "cloud-provider-8001", configuration = LoadBalancerConfig.class)
public class BeanConfig {@Bean// 负载均衡@LoadBalancedpublic RestTemplate getRestTemplate() {return new RestTemplate();}
}

@LoadBalancerClient 注解也可以加在启动类上方,name 属性为调用的微服务的名称,configuration 属性为上面我们定义的随机负载均衡策略类。

我们可以通过以下方法进行验证负载均衡策略是否发生了改变,首先新建一个 provider-8002 模块,除了端口号不同之外,其他都一样。然后分别在 provider-8001 和 provider-8002 的控制类中加入如下接口:

@Value("${server.port}")
private String port;@GetMapping("/get/port")
public String getPort() {return port;
}

然后在 openfeign-consumer80 模块中的 IOpenFeignService 接口服务中加入对应接口,调用远端服务。分别启动 provider-8001 和 provider-8002,这时在 Eureka 界面可以看到 cloud-provider-8001 有两个实例。

使用 Postman 调用接口,查看返回的端口号,可以发现,没有加上面配置之前,效果为 8001 和 8002 交替出现,加了之后,则为随机出现,如果觉得效果不太明显,可以多加两个 provider-8003、provider-8004。

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

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

相关文章

旧衣回收小程序搭建:降低企业成本,提高回收效率!

在人们环保意识提升下&#xff0c;旧衣回收行业受到了大众的关注&#xff0c;同时旧衣回收具有门槛低、利润大的优势。在我国&#xff0c;回收行业不仅帮助普通人就业获利&#xff0c;还对环保做出了较大贡献。因此&#xff0c;旧衣回收行业成为了当下的热门商业模式&#xff0…

时尚女童冲锋衣外套

上身时尚又好看的外套 日常穿着或者出行游玩 应对早晚温差&#xff0c;兼具时尚和功能 保暖也可以很轻盈 率性闲适的洒脱范 版型百搭好穿 下摆有橡筋收紧更加保暖了 简直就是一件实用与时尚并存的时尚单品

Swift爬虫程序采集招聘信息代码示例

今天我将用Swift写一个爬虫程序&#xff0c;主要是爬取招聘信息网站得。我们知道Selenops是一个简单的Swift Web爬虫工具&#xff0c;可以用于爬取网页内容。您可以使用Selenops的三种方式之一来进行爬虫操作&#xff1a;Swift游乐场、Swift脚本或马拉松脚本SwiftUI是一种用于构…

linux nginx配置链接访问图片

nginx 安装 sudo apt update sudo apt install nginxnginx 启动命令 sudo systemctl restart nginx # 重启 sudo systemctl start nginx #开启 sudo systemctl stop nginx # 关闭 sudo systemctl status nginx # 状态 sudo systemctl restart nginx.service #重启nginx安装成…

SEM优化三种方式

百度搜索引擎优化的三种方式 大搜&#xff1a;关键词推广&#xff0c;投入产出比更好百益&#xff1a;图片广告&#xff0c;这些图片广告会出现在站长的网站上&#xff0c;比如小说的网站上&#xff0c;用户点击图片了就会从账户里扣钱信息流&#xff1a;转化低&#xff0c;一…

100个实战项目——在树莓派4B+Ubuntu20.04桌面版配置下运行智能小车(一)

主机SSH远程链接从机 查看python版本 python 我的是python3.8 所以我需要安装pip3 sudo apt install python3-pip 接着安装程序需要的引脚库 sudo pip3 install RPi.GPIO 注意必须要有sudo&#xff0c;因为我是远程遥控的树莓派&#xff0c;没有权限运行程序&#xff0…

前端生成CRC16

一、代码 /**CRC16检验 用例&#xff1a;CRC.ToModbusCRC16(FF2233FF)*/ var CRC {}; CRC._auchCRCHi [0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0…

如何进行时间管理 待办事项软件帮你成为时间管理大师

在这个快节奏的现代社会&#xff0c;时间显得格外宝贵。每个人都在与时间赛跑&#xff0c;试图在有限的时间里完成更多的事情。我曾经也深陷于这样的困境&#xff0c;每天都被无数的杂事裹挟着&#xff0c;仿佛永远都抓不住时间的尾巴。 那时&#xff0c;我常常感到焦虑和疲惫…

操作系统详解(5.2)——信号(Signal)的题目进阶

系列文章&#xff1a; 操作系统详解(1)——操作系统的作用 操作系统详解(2)——异常处理(Exception) 操作系统详解(3)——进程、并发和并行 操作系统详解(4)——进程控制(fork, waitpid, sleep, execve) 操作系统详解(5)——信号(Signal) 操作系统详解(5.1)——信号(Signal)的相…

SpringMVC mss整合

建库建表 CREATE TABLE account (id int(11) NOT NULL AUTO_INCREMENT,name varchar(20) DEFAULT NULL,money double DEFAULT NULL,PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETutf8;首先 &#xff1a;先创建一个工程 其次添加配置&#xff1a; pom.xml <?xml vers…

MySQL进阶45讲【1】基础架构:一条SQL查询语句是如何执行的?

1 前言 我们经常说&#xff0c;看一个事儿千万不要直接陷入细节里&#xff0c;应该先鸟瞰其全貌&#xff0c;这样能够帮助你从高维度理解问题。同样&#xff0c;对于MySQL的学习也是这样。平时我们使用数据库&#xff0c;看到的通常都是一个整体。比如&#xff0c;有个最简单的…

JavaScript类型检测【全】

类型检测的方法&#xff1a; typeofinstanceofObject.prototype.toStringconstructor typeof typeof 操作符返回一个字符串&#xff0c;表示未经计算的操作数的类型。 typeof undefined; // "undefined"typeof null; // "object"typeof 100; // "…

幽默爆笑面试法

以下是以一种幽默的方法来面试。 大家好&#xff0c;我是程序员的“面试大师”小G&#xff0c;今天我将揭示程序员必备的面试技巧&#xff0c;不仅让你技能满分&#xff0c;笑料更是足够让面试官笑到合不拢嘴&#xff0c;毕竟幽默感也是程序员的一项利器。 语言基础&#xff1…

15.【TypeScript 教程】类型保护

TypeScript 类型保护 本节介绍的类型保护 TypeScript 类型检查机制的第二个部分&#xff0c;我们可以通过 typeof、instanceof、in 和 字面量类型 将代码分割成范围更小的代码块&#xff0c;在这一小块中&#xff0c;变量的类型是确定的。 1. 解释 类型保护是指缩小类型的范围…

锐意进取,蓬勃发展|爱基百客2023全景图

岁序更迭&#xff0c;2023年已悄然离去。对我们来说&#xff0c;这是充满挑战与机遇的一年。爱基百客作为一家专注于测序服务的公司&#xff0c;我们在这一年里经历了许多挑战&#xff0c;也取得了令人鼓舞的成绩。前面我们盘点了表观产品和单细胞产品&#xff0c;今天再邀您回…

AI工具推荐:开源TTS(文本生成语音)模型集合

XTTS TTS是一个语音生成模型&#xff0c;可以通过一个简短的6秒音频片段将声音克隆到不同的语言。它不需要大量的训练数据&#xff0c;也不需要耗费大量时间。TTS支持17种语言&#xff0c;可以进行声音克隆、情感和风格转移、跨语言声音克隆以及多语言语音生成等功能。XTTS-v2…

徐州数字孪生元宇宙赋能工业智能制造,助力传统制造业数字化转型

徐州数字孪生元宇宙赋能工业智能制造&#xff0c;助力传统制造业数字化转型。在徐州市制造业企业数字化转型的过程中&#xff0c;数字孪生技术的应用已经取得了显著成效。一方面&#xff0c;企业的生产效率得到了显著提高&#xff0c;产品质量也得到了有效保障。另一方面&#…

LLM:Scaling Laws for Neural Language Models (中)

核心结论 1&#xff1a;LLM模型的性能主要与计算量C&#xff0c;模型参数量N和数据大小D三者相关&#xff0c;而与模型的具体结构 (层数/深度/宽度) 基本无关。三者满足: C ≈ 6ND 2. 为了提升模型性能&#xff0c;模型参数量N和数据大小D需要同步放大&#xff0c;但模型和数…

基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二)

购物车相关 1.添加购物车1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计1.1.3 表设计 1.2 代码开发1.2.1 DTO设计1.2.2 Controller层1.2.3 Service层接口1.2.4 Service层实现类1.2.5 Mapper层 2. 查看购物车2.1 需求分析和设计2.1.1 产品原型2.1.2 接口设计 2.2 代码开发2.2.…

K8S----YAML

kubernetes中资源可以使用YAML描述&#xff08;如果您对YAML格式不了解&#xff0c;可以参考YAML语法&#xff09;&#xff0c;也可以使用JSON。其内容可以分为如下四个部分&#xff1a; typeMeta&#xff1a;对象类型的元信息&#xff0c;声明对象使用哪个API版本&#xff0c…