如何为Spring Cloud Gateway配置具体的负载均衡策略?

作者:IT橘子皮日期:2025/10/12

以下是针对 ​Spring Cloud Gateway​ 配置具体负载均衡策略(如加权轮询、最小连接数等)的详细指南,结合最新技术文档和最佳实践:


一、基础配置与依赖

1. ​引入依赖

确保项目中已包含 Spring Cloud Gateway 和负载均衡器(Spring Cloud LoadBalancer)的依赖:

1<dependency>
2    <groupId>org.springframework.cloud</groupId>
3    <artifactId>spring-cloud-starter-gateway</artifactId>
4</dependency>
5<dependency>
6    <groupId>org.springframework.cloud</groupId>
7    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
8</dependency>
9

若需集成服务发现(如 Nacos/Eureka),还需添加对应依赖 。

2. ​启用负载均衡

在路由配置中使用 lb://service-id格式的 URI,Gateway 会自动启用负载均衡:

1spring:
2  cloud:
3    gateway:
4      routes:
5        - id: user-service
6          uri: lb://user-service  # 启用负载均衡
7          predicates:
8            - Path=/api/user/**
9

二、配置内置负载均衡策略

Spring Cloud LoadBalancer 默认支持以下策略,可通过配置或代码自定义:

1. ​轮询策略(默认)​

无需额外配置,默认按顺序分配请求到服务实例 。

2. ​加权轮询

通过服务实例的元数据(Metadata)设置权重,动态调整流量分配:

  • 步骤1​:在服务注册时添加权重元数据(以 Nacos 为例):
1spring:  
2  cloud:  
3    nacos:  
4      discovery:  
5        metadata:  
6          weight: "3"  # 权重值(数值越大分配流量越多)  
  • 步骤2​:在 Gateway 中配置加权响应时间策略:
1@Configuration  
2public class WeightedLoadBalancerConfig {  
3    @Bean  
4    public ReactorLoadBalancer<ServiceInstance> weightedLoadBalancer(  
5        Environment env, LoadBalancerClientFactory factory) {  
6        String serviceId = env.getProperty("loadbalancer.client.name");  
7        return new WeightedResponseTimeLoadBalancer(  
8            factory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class),  
9            serviceId);  
10    }  
11}  

需配合 @LoadBalancerClient(name = "user-service", configuration = WeightedLoadBalancerConfig.class)注解使用 。

3. ​随机策略

自定义随机选择实例的负载均衡器:

1@Bean
2public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(
3    Environment env, LoadBalancerClientFactory factory) {
4    String serviceId = env.getProperty("loadbalancer.client.name");
5    return new RandomLoadBalancer(
6        factory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class),
7        serviceId);
8}
9

注册方式同加权轮询 。


三、高级自定义策略

1. ​最小连接数策略

需自行实现 ReactorServiceInstanceLoadBalancer接口,通过监控实例活跃请求数选择负载最低的实例:

1public class LeastConnectionsLoadBalancer implements ReactorServiceInstanceLoadBalancer {
2    private final ConcurrentHashMap<String, AtomicInteger> connectionCounts = new ConcurrentHashMap<>();
3
4    @Override
5    public Mono<Response<ServiceInstance>> choose(Request request) {
6        return supplier.get().next().map(instances -> {
7            ServiceInstance selected = instances.stream()
8                .min(Comparator.comparingInt(instance -> 
9                    connectionCounts.getOrDefault(instance.getInstanceId(), new AtomicInteger(0)).get()))
10                .orElseThrow();
11            connectionCounts.computeIfAbsent(selected.getInstanceId(), k -> new AtomicInteger(0)).incrementAndGet();
12            return new Response<>(selected);
13        });
14    }
15}
16

注册为 Bean 后通过 @LoadBalancerClient指定服务 。

2. ​一致性哈希策略

适用于需要会话粘性(Sticky Session)的场景:

1public class HashLoadBalancer implements ReactorServiceInstanceLoadBalancer {
2    @Override
3    public Mono<Response<ServiceInstance>> choose(Request request) {
4        String clientIp = request.getHeaders().getFirst("X-Forwarded-For");
5        int hash = Objects.hashCode(clientIp);
6        return supplier.get().next().map(instances -> {
7            int index = hash % instances.size();
8            return new Response<>(instances.get(Math.abs(index)));
9        });
10    }
11}
12

通过请求头或客户端 IP 哈希固定路由到同一实例 。


四、动态策略调整与监控

1. ​结合配置中心

通过 Nacos/Apollo 动态更新负载均衡策略参数(如权重),无需重启服务 。

2. ​监控与调试

  • 启用 Actuator 端点​:
1management:  
2  endpoints:  
3    web:  
4      exposure:  
5        include: gateway,loadbalancer  

访问 /actuator/loadbalancer/stats查看负载均衡统计信息 。

  • Prometheus 集成​:监控各实例的请求分布和性能指标 。

五、生产建议

  1. 策略选择​:
    • 加权轮询​:适合实例性能差异明显的场景(如混合部署新旧硬件)。
    • 最小连接数​:适用于长连接或处理耗时差异大的服务(如文件上传)。
    • 一致性哈希​:需要会话保持的遗留系统迁移 。
  2. 性能优化​:避免在自定义策略中嵌入复杂计算,优先使用内置策略 + 元数据控制 。

通过以上配置,可灵活适配不同业务场景的负载均衡需求。


如何为Spring Cloud Gateway配置具体的负载均衡策略?》 是转载文章,点击查看原文


相关推荐


零基础学JavaScript:手把手带你搭建环境,写出第一个程序!
良山有风来2025/10/11

开头:你是不是也遇到过这些问题? 刚学JavaScript的时候,你是不是一脸懵? 打开教程,满屏的“Node.js”、“npm”、“VS Code”,完全不知道从哪下手? 照着网上的教程配置环境,结果各种报错,心态爆炸? 写了半天代码,连个“Hello World”都显示不出来? 别担心!这篇文章就是为你准备的。 我会用最直白的方式,带你一步步搭建JavaScript开发环境,并写出你的第一个程序。 看完这篇文章,你不仅能顺利运行第一个JavaScript程序,还能理解背后的原理,为后续学习打


【机器学习】无监督学习 —— K-Means 聚类、DBSCAN 聚类
一杯水果茶!2025/10/9

K-Means 聚类标准 K-Means 算法K-Means 评估:肘部法则(Elbow Method)与轮廓系数(Silhouette Score)1. 肘部法则(Elbow Method)2. 轮廓系数(Silhouette Score) DBSCAN 聚类(Density-Based Spatial Clustering of Applications with Noise)DBSCAN 的关键参数DBSCAN 算法 K-Means 聚类 K‑Means 聚类 是一种


一文读懂 Vue 组件间通信机制(含 Vue2 / Vue3 区别)
excel2025/10/8

一、组件间通信的概念 在 Vue 中,组件(Component) 是最核心的概念之一。每个 .vue 文件都可以视为一个独立的组件。 而 通信(Communication) 是指一个组件如何将信息传递给另一个组件。 通俗地说: 组件间通信,就是不同组件之间如何共享数据、触发行为、进行信息交互的过程。 例如:当我们使用 UI 框架中的 table 组件时,需要向它传入 data 数据,这个“传值”的过程本质上就是一种组件通信。 二、组件间通信解决了什么问题? 在实际开发中,每个组件都有自己的


【Node】Node.js 多进程与多线程:Cluster 与 Worker Threads 入门
你的人类朋友2025/10/6

前言 在 Node.js 开发中,处理 CPU 密集型任务和提升应用性能是常见需求。 今天我们来深入理解 Node.js 提供的两种并发处理方案:Cluster 模块和 Worker Threads 模块。 ☺️ 这边要求阅读本文的新手小伙伴要有一个印象:【Cluster】 与【进程】相关,【Worker Threads】 与【线程】相关 小贴士 📚: ✨Cluster 的中文意思是集群 ✨Worker Threads 的中文意思是工作线程 官方定义解析 Node.js 官方文档指出:


【Linux系统】快速入门一些常用的基础指令
落羽的落羽2025/10/5

各位大佬好,我是落羽!一个坚持不断学习进步的学生。 如果您觉得我的文章还不错,欢迎多多互三分享交流,一起学习进步! 也欢迎关注我的blog主页: 落羽的落羽 文章目录 pwd、whoami、clearmkdir、touch、treecdlsrmdir、rmmanechocat、tac、more、less、head、tailcp、mvfind、which、whereisaliasgrepzip、unzip、taruname 开始学习使用Linux,我们首先要掌握一些Linux


快速搭建redis环境并使用redis客户端进行连接测试
你的人类朋友2025/10/4

前言 最近工作要用到 redis,所以这边简要记录一下自己搭建 redis 环境的过程,后面忘记了回头看比较方便。 正文 一、环境安装 这边推荐个跨 windows 和 mac 的 redis 客户端,another Redis Desktop Manager windows 一般安装Another-Redis-Desktop-Manager-win-1.7.1-x64.exe mac 一般安装Another-Redis-Desktop-Manager-mac-1.7.1-arm64.dmg 具


Java 设计模式在 Spring 框架中的实践:工厂模式与单例模式
武昌库里写JAVA2025/10/2

# Java 设计模式在 Spring 框架中的实践:工厂模式与单例模式 概述 在软件开发中,设计模式是为了解决特定问题的最佳实践经验的总结。而工厂模式和单例模式是其中两个最为常用和重要的设计模式,在 Java 开发中得到了广泛应用。在 Spring 框架中,工厂模式和单例模式也有着非常重要的应用。本文将从实际的案例出发,介绍工厂模式和单例模式在 Spring 框架中的实践。 工厂模式在 Spring 框架中的实践 工厂模式简介 工厂模式是一种创


如何用 CSS 中写出超级美丽的阴影效果
非优秀程序员2025/10/2

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」。 在我看来,最好的网站和Web应用程序对它们具有切实的"真实"质量。实现这种质量涉及很多因素,但阴影是一个关键因素。 然而,当我环顾网络时,很明显,大多数阴影并不像它们所希望的那样丰富。网络上覆盖着模糊的灰色盒子,看起来并不像影子。 在本教程中,我们将学习如何将典型的箱形阴影转换为美丽、逼真的阴影: 为什么还要使用阴影? 我保证,我们很快就会谈到有趣的CSS技巧。但首先,我想退后一步,谈谈为什么阴影存在于CSS中,以


Xrdp 远程桌面配置【笔记】
AnsonNie2025/10/2

Xrdp 远程桌面配置 Xrdp 是一个开源的 远程桌面协议(RDP)服务器。 核心功能:它允许您使用来自其他计算机的图形化桌面连接到运行它的 Linux 服务器。工作原理:它在 Linux 系统上创建一个 RDP 服务端。您可以从任何兼容 RDP 的客户端(如 Windows 自带的“远程桌面连接”、macOS 的 Microsoft Remote Desktop、Linux 的 Remmina 等)进行连接。底层技术:通常,Xrdp 本身并不直接提供桌面环境,而是与现有的 X Windo


starrocks查询伪代码
syty202010/1/2025

尽可能下推到存储层,在扫描时利用索引 (前缀索引、Bloom Filter、位图索引、ZoneMap) 提前过滤掉大量无关数据块,减少 I/O 和 CPU 处理量。​,实现了极致的查询性能。它将数据处理任务分解成高效的、针对现代硬件优化的批处理操作流,最大限度地榨干了 CPU 和 I/O 的性能。​ 在列数据上执行紧凑的循环,最大化 CPU 缓存利用率。​ 只读查询需要的列,利用列存格式的压缩和编码优势。​ (数据流驱动,最小化等待) 两大核心技术,结合​。​ (所有算子处理 Batch) 和 ​。

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0