为什么Gateway网关引入了LoadBalancer组件就拥有了负载均衡能力?

文章探讨了在SpringBoot项目中引入LoadBalancer组件后,为何Gateway网关能具备负载均衡能力。关键在于Gateway的特定自动配置类GatewayReactiveLoadBalancerClientAutoConfiguration,它在LoadBalancerAutoConfiguration之后注册,并基于条件注解确保只有在特定条件下才会生效。此配置类注册了两个Bean:ReactiveLoadBalancerClientFilter和LoadBalancerServiceInstanceCookieFilter,实现了负载均衡功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、思考:

一般而言,当我们在项目中引入了 LoadBalancer 负载均衡启动器组件,那么SpringBoot自动配置的ClassPath类路径加载机制会扫描到 LoadBalancer 类路径下的 spring.factories 配置文件,会注册一些Bean ,但为什么网关 Gateway项目只要引入了 LoadBalancer 就拥有了负载均衡这个能力呢?两者之间是怎么产生的化学反应的呢?下面我们一起台所一下吧!

  1. GatewayReactiveLoadBalancerClientAutoConfiguration

之所以在 Gateway 网关中引入了 LoadBalancer 组件,Gateway就拥有了负载均衡能力,关键一点在于

Gateway 网关提前做好了 LoadBalancer组件的适配工作,其主要实现是由 Gateway 网关专门为集成为LoadBalancer 而实现自动配置类 GatewayReactiveLoadBalancerClientAutoConfiguration 完成

源码如下:

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ ReactiveLoadBalancer.class, LoadBalancerAutoConfiguration.class, DispatcherHandler.class })
@AutoConfigureAfter(LoadBalancerAutoConfiguration.class)
@EnableConfigurationProperties(GatewayLoadBalancerProperties.class)
public class GatewayReactiveLoadBalancerClientAutoConfiguration {

    @Bean
    @ConditionalOnBean(LoadBalancerClientFactory.class)
    @ConditionalOnMissingBean(ReactiveLoadBalancerClientFilter.class)
    @ConditionalOnEnabledGlobalFilter
    public ReactiveLoadBalancerClientFilter gatewayLoadBalancerClientFilter(LoadBalancerClientFactory clientFactory,
            GatewayLoadBalancerProperties properties) {
        return new ReactiveLoadBalancerClientFilter(clientFactory, properties);
    }

    @Bean
    @ConditionalOnBean({ ReactiveLoadBalancerClientFilter.class, LoadBalancerClientFactory.class })
    @ConditionalOnMissingBean
    @ConditionalOnEnabledGlobalFilter
    public LoadBalancerServiceInstanceCookieFilter loadBalancerServiceInstanceCookieFilter(
            LoadBalancerClientFactory loadBalancerClientFactory) {
        return new LoadBalancerServiceInstanceCookieFilter(loadBalancerClientFactory);
    }

}

从上面的源码可以看到,GatewayReactiveLoadBalancerClientAutoConfiguration 该自动配置类是在LoadBalancerAutoConfiguration 配置类注册完成之后才能被注册,也就意味着,一旦Gateway 网关项目没有引入 LoadBalancer 组件的话,那么该GatewayReactiveLoadBalancerClientAutoConfiguration 配置类将永远不会生效,因为两者之间存在着注册的前后依赖关系,也就意味着,一旦Bean注册的前置条件不满足,那么该Bean将无法注册生效。此外,从该配置类的 @ConditionalOnClass 注解条件也同样可以看出,上面的依赖关系,只不过

@ConditionalOnClass 的条件更多。回归到源码内容:从该配置类的内容可以看出,其内注册了两个

Bean 分别是:ReactiveLoadBalancerClientFilterLoadBalancerServiceInstanceCookieFilter

### Spring Gateway 支持的负载均衡策略及其实现方式 Spring Cloud Gateway 是一种基于 Reactor 和 Netty 的高性能 API 网关,它提供了多种内置的负载均衡策略以及扩展机制来满足不同的需求。以下是常见的负载均衡策略和支持的方式: #### 1. **轮询 (Round Robin)** 轮询是一种最基础也是最常见的负载均衡算法,通过依次分配请求给各个服务实例来达到流量分发的目的。可以通过 `RoundRobinLoadBalancer` 类实现该功能[^1]。 ```java @Bean public RoundRobinLoadBalancer roundRobinLoadBalancer() { return new RoundRobinLoadBalancer(); } ``` 此方法适用于大多数场景,默认情况下会均匀分布请求至所有可用的服务节点上。 --- #### 2. **随机选择 (Random Selection)** 另一种简单有效的策略是随机选取目标服务器处理请求。这种做法可以减少某些特定条件下可能出现的热点问题。具体可通过自定义逻辑或者利用框架中的工具类完成设置[^2]。 ```java @Bean public RandomLoadBalancer randomLoadBalancer() { return new RandomLoadBalancer(); } ``` 上述代码片段展示了如何创建并注入一个随机型负载平衡器对象。 --- #### 3. **加权轮询 (Weighted Round Robin)** 为了进一步优化资源利用率,在实际应用中可能需要考虑不同后端机器性能差异等因素的影响。因此引入权重概念便显得尤为重要——即让更强大的主机承担更多工作量的同时保持整体系统的稳定性与效率。此类定制化方案通常需开发者自行编写业务规则加以实现。 --- #### 4. **最少连接数 (Least Connections)** 这一原则旨在优先把新来的客户端交给当前活跃链接数量较少的那个成员去响应。虽然原生库并未直接提供相应组件,但借助 SPI 插件体系完全可以达成预期效果。 --- #### 5. **IP 哈希 (IP Hash)** 确保来自同一 IP 地址的所有 HTTP 请求始终转发到同一个上游服务器上去执行操作。这种方式特别适合那些要求维持状态的应用程序环境之中。不过需要注意的是,如果某个指定的目标失败掉线,则后续访问可能会重新定向至其他地方直到恢复为止。 --- 关于这些策略的具体部署流程一般遵循以下几个方面来进行调整和完善: - 添加 DiscoveryClient 相关依赖以便于自动发现网络内的候选者集合; - 修改路由 URI 参数前缀为 lb://serviceName 形式从而激活动态解析能力; - 注册服务中心地址信息使得网关能够正常加入集群管理范畴之内;最后再依据项目实际情况灵活选用合适的调度模式即可。 --- ### 示例代码展示完整的集成过程如下所示: ```yaml spring: cloud: gateway: discovery: locator: enabled: true # 开启服务发现功能开关 loadbalancer: retry: enabled: true # 启动重试机制提高成功率 server: port: 8090 # 设置监听端口号 eureka: client: service-url: defaultZone: http://localhost:8761/eureka/ # Eureka Server URL路径说明文档位置指派 ``` 以上 YAML 文件配置了必要的参数选项用于启动整个生态链路之间的协作关系构建起来。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值