3. Spring Cloud LoadBalancer 入门与使用

news/2025/2/25 19:30:52

一、什么是 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 {
    @Bean
    public 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.niftyadmin.cn/n/5865884.html

相关文章

Seata分布式事务【详解分布式事务AT模式、2PC两阶段提交协议、Seata Server(TC)环境搭建,附有示例+代码】

文章目录 六.Seata 分布式事务6.1 分布式事务介绍6.2 常见分布式事务解决方案6.3 2PC两阶段提交协议&#xff1a;Prepare&#xff1a;提交事务请求Commit&#xff1a;执行事务提交2PC问题 6.4 AT 模式介绍6.5 Seata是什么&#xff1f;6.6 Seata快速开始Seata Server&#xff08…

Apache Pinpoint工具介绍

Apache Pinpoint&#xff1a;分布式系统性能分析与链路追踪 一、Pinpoint 简介 Apache Pinpoint 是一个开源的 分布式追踪系统&#xff0c;专为微服务架构设计&#xff0c;支持 HTTP、RPC、MQTT 等协议的调用链追踪。其核心功能包括&#xff1a; 链路可视化&#xff1a;展示…

一个用于测试内存屏障差异的 C 语言示例程序

下面是一个用于测试内存屏障差异的 C 语言示例程序,演示在弱内存模型(如 ARM Cortex-A35)中,指令重排序可能导致的数据不一致问题,并对比不同同步机制的效果: 测试目标 验证以下场景: 无内存屏障:多线程环境下可能出现数据竞争。内存屏障:强制指令顺序,避免数据竞争…

香港多IP站群服务器

香港多IP站群服务器是指一种具有多个独立IP地址、能够同时运行多个网站或应用的服务器。这种服务器特别适用于需要大量IP地址来扩展和管理多个站点的企业或个人&#xff0c;尤其是在SEO优化、网络营销、以及需要避免IP封锁或限制的场景下。下面是对香港多IP站群服务器的详细扩展…

如何使用爬虫获取淘宝商品详情:API返回值说明与案例指南

在电商数据分析和运营中&#xff0c;获取淘宝商品详情是常见的需求。淘宝开放平台提供了丰富的API接口&#xff0c;允许开发者通过合法的方式获取商品信息。本文将详细介绍如何使用PHP编写爬虫&#xff0c;通过淘宝API获取商品详情&#xff0c;并解析API返回值的含义和结构。 一…

Java Map实现类面试题

Java Map实现类面试题 HashMap Q1: HashMap的实现原理是什么&#xff1f; HashMap基于哈希表实现&#xff0c;使用数组链表红黑树&#xff08;Java 8&#xff09;的数据结构。 public class HashMapPrincipleExample {// 模拟HashMap的基本结构public class SimpleHashMap&…

分布式深度学习:探索无限可能

分布式深度学习:探索无限可能 大家好,我是Echo_Wish,一名专注于人工智能和Python的自媒体创作者。今天,我们将深入探讨分布式深度学习,这个技术不仅是AI发展的前沿,更是应对大规模数据和复杂模型的关键解决方案。随着数据量和模型复杂度的不断增加,传统的单机深度学习已…

netty十八罗汉之——挖耳罗汉(Decoder)

佛教中除不听各种淫邪声音之外&#xff0c;更不可听别人的秘密。因他论耳根最到家&#xff0c;故取挖耳之形&#xff0c;以示耳根清净。 来看看netty的核心组件解码器Decoder Decoder的作用半包&#xff0c;粘包问题从模板和装饰器模式看Decoder解码原理 1.Decoder作用 最根本…