3. Spring Cloud LoadBalancer 入门与使用

一、什么是 LoadBalancer?

LoadBalancer(负载均衡器)是一种网络设备或软件机制,用于分发传入的网络流量负载(请求)到多个后端目标服务器上,从而实现系统资源的均衡利用和提高系统的可用性和性能。

1.1 负载均衡分类

服务器负载均衡是在服务端通过硬件设备(如 F5)或软件(如 Nginx)接收客户端请求并依据算法将其分发至后端多个服务器以平衡负载

客户端负载均衡是客户端自身维护可用服务列表并按特定算法自主选择服务实例来发送请求。

1.2 常见负载均衡策略

静态负载均衡策略

这类策略不考虑服务器的实时负载情况,根据预设的规则进行请求分配。

  • 轮询(Round Robin)

    • 负载均衡器按照顺序依次将客户端请求分配给后端服务器列表中的每一台服务器,当分配到列表末尾时,再从头开始。

    • 例如,有三台服务器 A、B、C,请求 1 分配给 A,请求 2 分配给 B,请求 3 分配给 C,请求 4 又分配给 A,以此类推。该策略简单易实现,适用于各服务器性能相近的场景。

  • 加权轮询(Weighted Round Robin)

    • 考虑到后端服务器的性能差异,为每台服务器分配一个权重值,负载均衡器根据权重比例来分配请求。

    • 比如,服务器 A、B、C 的权重分别为 2、3、1,那么在分配请求时,每 6 个请求中,服务器 A 会收到 2 个,服务器 B 会收到 3 个,服务器 C 会收到 1 个。这种策略能更合理地利用不同性能的服务器资源。

  • IP 哈希(IP Hash)

    • 根据客户端的 IP 地址进行哈希计算,将计算结果与后端服务器数量取模,得到的结果对应服务器列表中的索引,从而将请求分配到该服务器上。

    • 这意味着同一客户端的请求总是会被分配到同一台服务器上,适合需要保持会话状态的应用场景,如购物车、用户登录等。

动态负载均衡策略

这类策略会实时监测服务器的负载情况,根据服务器的当前状态来分配请求。

  • 最少连接(Least Connections)

    • 负载均衡器会将新的请求分配给当前连接数最少的服务器,以确保各服务器的负载相对均衡。

    • 例如,服务器 A 当前有 10 个连接,服务器 B 有 5 个连接,服务器 C 有 8 个连接,那么新的请求会被分配给服务器 B。该策略能动态地适应服务器的负载变化,充分利用服务器资源。

  • 加权最少连接(Weighted Least Connections)

    • 结合了服务器的权重和当前连接数来分配请求。在考虑服务器连接数的同时,也考虑服务器的性能差异。

    • 给性能高的服务器分配更高的权重,在分配请求时,会综合计算服务器的连接数和权重,选择相对负载最轻的服务器。比如,服务器 A 权重为 2,当前连接数为 10;服务器 B 权重为 1,当前连接数为 5,可能会根据特定的计算公式来判断将请求分配给哪台服务器更合适。

  • 响应时间(Response Time)

    • 负载均衡器会实时监测后端服务器的响应时间,将请求分配给响应时间最短的服务器。

    • 这样可以保证客户端能够更快地得到响应,提高用户体验。例如,在电商网站的促销活动期间,不同服务器的处理能力和负载可能会有较大差异,通过响应时间策略可以将请求导向处理速度快的服务器。

二、LoadBalancer在微服务中的作用

流量分发与负载均衡

  • 均匀分配请求:微服务通常会部署多个实例以应对高并发和提高可用性。LoadBalancer 能将客户端的请求均匀地分发到这些实例上,避免部分实例过载而部分闲置的情况。例如,一个电商系统的商品服务部署了多个实例,LoadBalancer 可根据各实例的负载状态,将商品查询请求合理分配,确保每个实例的工作负载相对均衡。

  • 应对流量高峰:在业务流量高峰期,如电商的促销活动期间,LoadBalancer 能够动态调整请求的分配,将更多的流量导向负载较轻的实例,保障系统的整体性能和稳定性,防止因某个实例不堪重负而崩溃。

高可用性与容错

  • 实例健康检查:LoadBalancer 会定期对后端的微服务实例进行健康检查,判断实例是否正常运行。若发现某个实例出现故障或响应异常,会自动将其从可用实例列表中移除,不再向其分配请求。比如,当一个用户服务实例因代码异常无法正常响应时,LoadBalancer 能及时发现并停止向该实例分发新的用户登录、注册等请求。

  • 故障转移:当某个微服务实例出现故障时,LoadBalancer 会迅速将后续请求转发到其他正常的实例上,实现故障转移,确保服务的连续性。例如,支付服务的一个实例突然崩溃,LoadBalancer 会立即把支付请求路由到其他健康的支付服务实例,让用户的支付操作不受太大影响。

服务发现与路由

  • 服务发现集成:在微服务环境中,服务的实例数量和位置可能会动态变化。LoadBalancer 可以与服务发现组件(如 Consul、Eureka)集成,实时获取微服务实例的注册信息和状态。这样,当有新的实例加入或旧的实例下线时,LoadBalancer 能及时更新可用实例列表,保证请求的正确分发。

  • 智能路由:根据不同的业务规则和请求特征,LoadBalancer 可以实现智能路由。例如,根据请求的来源地、用户身份、请求的内容等信息,将请求路由到特定的微服务实例或服务版本。比如,对于来自特定地区的用户请求,将其路由到距离该地区最近的数据中心的服务实例,以提高响应速度。

安全与隔离

  • 访问控制:LoadBalancer 可以作为一道安全屏障,对进入微服务系统的请求进行访问控制。可以设置访问规则,如限制特定 IP 地址的访问、对请求进行身份验证和授权等,防止非法请求进入系统,保护微服务的安全。

  • 服务隔离:通过将不同类型的微服务请求分配到不同的实例组或集群,实现服务之间的隔离。这样,当某个微服务出现问题时,不会影响到其他微服务的正常运行,提高了系统的整体稳定性和安全性。例如,将核心业务服务和非核心业务服务的请求分别路由到不同的实例组,避免非核心业务的故障影响核心业务。

三、如何使用?

在项目中添加 Spring Cloud OpenFeign 和注册中心如 Nacos 之后,再添加 Spring Cloud LoadBalancer 则会在进行接口调用时直接使用 Spring Cloud LoadBalancer。

四、默认负载均衡策略

轮询

五、随机负载均策略

5.1 创建随机负载均衡器

public class RandomLoadBalancerConfig {@Beanpublic ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {String name = environment.getProperty("loadbalancer.client.name");return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name,ServiceInstanceListSupplier.class), name);}
}

5.2 设置随机负载均衡器 (局部设置)

@Service
@FeignClient("loadbalancer-service")
 设置局部负载均衡策略
//@LoadBalancerClient(name = "loadbalancer-service",
//        configuration = CustomLoadBalancerConfig.class)
public interface UserService {@RequestMapping("/user/getname")String getName(@RequestParam("id") Integer id);
}

5.3 设置全局负载均衡器

@SpringBootApplication
@EnableFeignClients // 开启 Openfeign
 设置全局的负载均衡策略
//@LoadBalancerClients(defaultConfiguration =
//        CustomLoadBalancerConfig.class)
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}}

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

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

相关文章

本地部署AI模型 --- DeepSeek(二)---更新中

目录 FAQ 1.Failed to load the model Exit code: 18446744072635812000 FAQ 1.Failed to load the model Exit code: 18446744072635812000 问题描述&#xff1a; &#x1f972; Failed to load the model Error loading model. (Exit code: 18446744072635812000). Unkn…

项目一 - 任务3:搭建Java集成开发环境IntelliJ IDEA

本次实战任务通过搭建 Java 集成开发环境 IntelliJ IDEA&#xff0c;深入体验了 Java 开发的全流程。从安装 IntelliJ IDEA 到配置开发环境&#xff0c;再到创建 Java 项目、包和类&#xff0c;每一步都为后续开发奠定了基础。通过编写简单的 Java 程序&#xff0c;如 Welcome …

【uni-app】对齐胶囊容器组件

代码碎片 <template><div><view :style"{ height: ${statusBarHeight}px }"></view><viewclass"":style"{height: ${menuButtonHeight menuButtonPadding * 2}px,width: ${menuButtonInfo.left}px,}"><slot …

OpenCV(8):图像直方图

在图像处理中&#xff0c;直方图是一种非常重要的工具&#xff0c;它可以帮助我们了解图像的像素分布情况。通过分析图像的直方图&#xff0c;我们可以进行图像增强、对比度调整、图像分割等操作。 1 什么是图像直方图&#xff1f; 图像直方图是图像像素强度分布的图形表示&am…

攻防世界 Reversing-x64Elf-100

进入题目&#xff0c;先下载附件 将下载好的RE文件拖入ExeinfoPE查看&#xff0c;有无壳 “Diagnose” 一栏的信息 “NOT WIN EXE -o - ELF executable [64bit obj. Exe file - CPU: AMD x86” 可知&#xff0c;这是一个 ELF 格式的可执行文件&#xff08;通常用于 Linux 系统…

【C】堆的应用1 -- 堆排序

之前学习了堆&#xff0c;堆的一棵以顺序结构存储的完全二叉树&#xff0c;堆本身又氛围大根堆和小根堆&#xff0c;假设以大根堆为例&#xff0c;由于堆顶部元素是一棵二叉树里面最大的元素&#xff0c;所以如果每次都取堆顶的元素&#xff0c;那么取出的元素就是一个降序排列…

CentOS 7配置YOLOv8环境指南:无显卡版教程 - 幽络源

看本篇教程前请确保Centos7系统已安装配置Python3环境&#xff0c;参考幽络源上一篇文章>CentOS 7安装Python3环境详细指南&#xff1a;从源码编译到PIP配置 步骤1&#xff1a;建立python虚拟环境项目 在home目录下执行如下命令新建虚拟环境python项目 python3 -m venv y…

Confluence知识库管理系统安装步骤(Windows版本)

我们介绍的是安装7.15.1以下版本的安装方式,8.0以上的安装方式暂不支持。 如果你要安装8.0以上的版本,请参考本文末尾的附录中提供的相关网址。 首先我们安装之前需要准备安装所需文件以上文件可以在这里下载:【https://download.csdn.net/download/Elegant_Kevin/90412040】…

Uniapp 开发中遇到的坑与注意事项:全面指南

文章目录 1. 引言Uniapp 简介开发中的常见问题本文的目标与结构 2. 环境配置与项目初始化环境配置问题解决方案 项目初始化注意事项解决方案 常见错误与解决方案 3. 页面与组件开发页面生命周期注意事项示例代码 组件通信与复用注意事项示例代码 样式与布局问题注意事项示例代码…

学习笔记--电磁兼容性EMC

一、基本概念 电磁兼容性&#xff08;Electromagnetic Compatibility&#xff0c;EMC&#xff09;是电子电气设备在特定电磁环境中正常工作的能力&#xff0c;同时不会对其他设备产生不可接受的电磁干扰。其核心目标是确保设备在共享的电磁环境中既能抵抗干扰&#xff0c;又能避…

Unity百游修炼(2)——Brick_Breaker详细制作全流程

一、项目简介 Brick Breaker 是一款经典的打砖块游戏&#xff0c;本次案例将使用 Unity 引擎来实现该游戏的核心功能。 游戏画面如下&#xff1a; Brick_ breaker 二、项目结构概览和前期准备 &#xff08;1&#xff09;在 Unity 项目视图中&#xff0c;我们可以看到几个重要…

Java基础常见的面试题(易错!!)

面试题一&#xff1a;为什么 Java 不支持多继承 Java 不支持多继承主要是为避免 “菱形继承问题”&#xff08;又称 “钻石问题”&#xff09;&#xff0c;即一个子类从多个父类继承到同名方法或属性时&#xff0c;编译器无法确定该调用哪个父类的成员。同时&#xff0c;多继承…

算法题(77):数组中的第k个最大元素

审题&#xff1a; 需要我们在时间复杂度O(n)的前提下找到数组中第k个最大元素 思路&#xff1a; 方法一&#xff1a;建堆实现 首先写一个dowmset函数&#xff0c;实现对第i个索引位置的向下调整。然后创建build函数&#xff0c;利用dowmset实现向下调整建堆&#xff0c;再根据k…

PCIe学习笔记1:PCIe体系架构——PCIe简介

目录 一、PCIe简介 1.1 串行传输 1.1.1 相对于并行传输的优化 1.1.2 带宽计算 1.1.3 差分信号传输 1.1.4 基于数据包的传输协议 1.2 PCIe的系统拓扑结构 1.2.1 根组件&#xff08;Root Complex&#xff0c;RC&#xff09; 1.2.2 上行端口与下行端口 1.2.3 交换机与桥 …

一天记20个忘10个之4:man

据说&#xff0c;给你一个支点&#xff0c;你就能撬起地球。 那好&#xff0c;今天&#xff0c;我给你一个 man&#xff0c;如果你能完成记20个忘10个的任务&#xff0c;你就真的很 man 了。 零、热身 young manold manmedical man 一、man之复合词 1.1 man复合词 chairm…

SpringBoot之自定义简单的注解和AOP

1.引入依赖 <!-- AOP依赖--> <dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.8</version> </dependency>2.自定义一个注解 package com.example.springbootdemo3.an…

利用开源小智AI制作桌宠机器狗

本文主要介绍如何利用开源小智AI制作桌宠机器狗 1 源码下载 首先下载小智源码,下载地址, 下载源码后,使用vsCode打开,需要在vscode上安装esp-idf,安装方式请自己解决 2 源码修改 2.1添加机器狗控制代码 在目录main/iot/things下添加dog.cc文件,内容如下; #include…

深入理解IP子网掩码子网划分{作用} 以及 不同网段之间的ping的原理 以及子网掩码的区域划分

目录 子网掩码详解 子网掩码定义 子网掩码进一步解释 子网掩码的作用 计算总结表 子网掩码计算 子网掩码对应IP数量计算 判断IP是否在同一网段 1. 计算步骤 2. 示例 3. 关键点 总结 不同网段通信原理与Ping流程 1. 同网段通信 2. 跨网段通信 网段计算示例 3. P…

利用python和gpt写一个conda环境可视化管理工具

最近在学习python&#xff0c;由于不同的版本之间的差距较大&#xff0c;如果是用环境变量来配置python的话&#xff0c;会需要来回改&#xff0c;于是请教得知可以用conda来管理&#xff0c;但是conda在管理的时候老是要输入命令&#xff0c;感觉也很烦&#xff0c;于是让gpt帮…

Linux内核,slub分配流程

我们根据上面的流程图&#xff0c;依次看下slub是如何分配的 首先从kmem_cache_cpu中分配&#xff0c;如果没有则从kmem_cache_cpu的partial链表分配&#xff0c;如果还没有则从kmem_cache_node中分配&#xff0c;如果kmem_cache_node中也没有&#xff0c;则需要向伙伴系统申请…