负载均衡 LoadBalancer

news/2024/7/27 9:05:58/文章来源:https://blog.csdn.net/m0_53067943/article/details/135609373

负载均衡

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

  • 服务端负载均衡:

指在服务器端进行负载均衡的策略。在这种策略下,负载均衡器位于服务器端(如 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.luyixian.cn/news_show_926248.aspx

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

相关文章

STM32之OLED显示

一、模块介绍 1、常见的显示设备 LED、数码管、点阵、LCD屏(1602/12864)、OLED屏(消费电子) 2、OLED屏的概述 OLED&#xff0c;即有机发光二极管&#xff08;Organic Light-Emitting Diode&#xff09;&#xff0c;又称为有机电激光显示&#xff08;Organic Electroluminesenc…

css宽度适应内容

废话不多说,看如下demo,我需要将下面这个盒子的宽度变成内容自适应 方法有很多,如下 父元素设置display:flex 实现子元素宽度适应内容 如下给父元素设置flex能实现宽度自适应内容 <!DOCTYPE html><html lang"en"><head><meta charset"U…

C++每日一练(15):简单幂计算

题目描述 输入两个数a和b&#xff0c;求a的b次方。 输入 输入两个整数a&#xff0c;b&#xff08;1<a<10&#xff0c;1<b<15&#xff09;。 输出 输出一个正整数&#xff0c;该值<1000000000000。 输入样例 3 3 输出样例 27 参考答案 #include<bits/stdc.h&…

C++常用类

1、QString 字符串类 QString 是Qt的字符串类&#xff0c;与C的std::string相比&#xff0c;不再使用ASCII编码。QString使用的Unicode编码。 QString 完全支持中文&#xff0c; 但是由于不同的技术可能会采用不同的编码。有时候也会遇到中文编码的一致性问题。 如果后续的学习…

无人机测绘助力实现高效、安全的城市规划

随着城市化进程的不断加快&#xff0c;城市规划显得尤为重要。而无人机测绘技术作为一种创新的工具&#xff0c;为城市规划提供了更加高效、安全的解决方案。它通过快速、精确的数据采集和分析&#xff0c;为行业提供有力的决策支持&#xff0c;助力城市规划的现代化和可持续发…

LeetCode刷题---基本计算器

解题思路&#xff1a; 根据题意&#xff0c;字符串中包含的运算符只有和- 使用辅助栈的方法来解决该问题 定义结果集res和符号位sign(用于判断对下一数的加减操作),接着对字符串进行遍历。 如果当前字符为数字字符&#xff0c;判断当前字符的下一个字符是否也是数字字符&#x…

决战排序之巅(二)

决战排序之巅&#xff08;二&#xff09; 排序测试函数 void verify(int* arr, int n) 归并排序递归方案代码可行性测试 非递归方案代码可行性测试 特点分析 计数排序代码实现代码可行性测试 特点分析 归并排序 VS 计数排序&#xff08;Release版本&#xff09;说明1w rand( ) …

Kafka 消息不能正常消费问题排查

订单宽表数据不同步 事情的起因是专员在 ze app 上查不到订单了&#xff0c;而订单数据是从 mysql 的 order_search_info 查询的&#xff0c;order_search_info 表的数据是从 oracel 的 BZ_ORDER_INFO 表同步过来的&#xff0c;查不到说明同步有问题 首先重启&#xff0c;同步…

【K8S 】K8S配置资源管理

一、Secret&#xff1a; 1、概念 用来保存密码。token&#xff0c;敏感的K8S资源 这类数据可以直接存放在镜像中&#xff0c;但是放在Secret中可以更方便的控制&#xff0c;减少暴露的风险 Secret&#xff1a;保存加密的信息 2、Secret类型&#xff1a; docker-registry&am…

第十二章 Java内存模型与线程(二)

文章目录 12.4 Java与线程12.4.1 线程的实现12.4.2 Java线程调度12.4.3 状态转换 12.5 Java与协程12.5.1 内核线程的局限12.5.2 协程的复苏12.5.3 Java的解决方案 12.4 Java与线程 12.4.1 线程的实现 实现线程主要有三种方式&#xff1a;使用内核线程实现&#xff08;1&#…

算法通关村第十六关—滑动窗口与堆结合(黄金)

滑动窗口与堆结合 堆与滑动窗口问题的结合 LeetCode239给你一个整数数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位&#xff0c;返回滑动窗口中的最大值。  对于最大值、K个最大这种场…

【教3妹学编程-算法题】最大频率元素计数

2哥 : 3妹&#xff0c;最近有个电视剧《繁花》非常火&#x1f525;&#xff0c;你听说了吗&#xff1f; 3妹&#xff1a;没有&#xff0c;最近一直在忙着找工作&#xff0c;哪有时间看电视啊 2哥 : 啊&#xff1f;大周末还不休息一下啊&#xff0c;这么辛苦。 3妹&#xff1a;当…

压力测试JMeter

一、JMeter概述 Apache JMeter是100%纯JAVA桌面应用程序&#xff0c;被设计为用于测试客户端/服务端结构的软件(例如web应用程序)。它可以用来测试静态和动态资源的性能&#xff0c;例如&#xff1a;静态文件&#xff0c;Java Servlet,CGI Scripts,Java Object,数据库和FTP服务…

k8s node节点加入集群,token过期

1、master01节点执行 kubeadm token create --print-join-command 2、执行命令 kubeadm join 192.168.0.236:16443 --token qucd8q.hsfq4a1afluzaky3 --discovery-token-ca-cert-hash sha256:92175a356db070deb2ddd3823e288e3005a4baeec9b68580dcc11ce4d3767195 3、查看node02…

FPGA节省资源篇------正确处理设计优先级

声明&#xff1a;以下文章来源于孤独的单刀&#xff0c;仅供学习用途 概述 假如现在有一种方法–可以在不怎么需要修改已有设计的情况下&#xff0c;就可以帮您节省50%的设计资源&#xff0c;那你会试试看吗&#xff1f; 当前市场环境下&#xff0c;更低廉的成本却可获得同等…

steam游戏搬砖项目还能火多久?

最近放假回到老家&#xff0c;见了不少亲戚朋友&#xff0c;大家不约而同都在感叹今年大环境不好&#xff0c;工作不顺&#xff0c;生意效益不好&#xff0c;公司状况不佳&#xff0c;反问我们生意如何&#xff1f;为了让他们心里好受一点&#xff0c;我也假装附和道:也不咋地&…

3000多个厂商默认帐号、默认密码

做网工这行&#xff0c;多少都会遇上各种各样的厂商设备&#xff0c;遇上一些新设备&#xff0c;虽然没有更改密码&#xff0c;但不知道初始默认账号和密码是啥。 今天就给你整理了一波&#xff0c;三千多个厂商默认帐号、默认密码&#xff0c;方便你查阅。 不过&#xff0c;…

自创C++题目——风扇

预估难度 简单 题目描述 有一个风扇&#xff0c;它有个旋转叶片&#xff0c;每个旋转叶片的编号是&#xff0c;请输出它旋转后&#xff0c;中心点与地面的直线距离哪个叶片最近&#xff0c;输出此旋转叶片的编号。默认以“”的形式。 当时&#xff1a; 当或时&#xff0c;…

MATLAB二维与三维绘图实验

本文MATLAB源码&#xff0c;下载后直接打开运行即可[点击跳转下载]-附实验报告https://download.csdn.net/download/Coin_Collecter/88740747 一、实验目的 掌握图形对象属性的基本操作。掌握利用图形对象进行绘图操作的方法。 二、实验内容 利用图形对象绘制曲线&#xff…

Java基础 - 黑马

我是南城余&#xff01;阿里云开发者平台专家博士证书获得者&#xff01; 欢迎关注我的博客&#xff01;一同成长&#xff01; 一名从事运维开发的worker&#xff0c;记录分享学习。 专注于AI&#xff0c;运维开发&#xff0c;windows Linux 系统领域的分享&#xff01; 知…