您的位置:首页 > 编程语言 > Java开发

SpringCloud升级之路2020.0.x版-21.Spring Cloud LoadBalancer简介

2021-08-26 09:08 477 查看

本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford

我们使用 Spring Cloud 官方推荐的 Spring Cloud LoadBalancer 作为我们的客户端负载均衡器。

Spring Cloud LoadBalancer背景

Spring Cloud LoadBalancer是一个客户端负载均衡器,类似于Ribbon,但是由于Ribbon已经进入维护模式,并且Ribbon 2并不与Ribbon 1相互兼容,所以Spring Cloud全家桶在Spring Cloud Commons项目中,添加了Spring cloud Loadbalancer作为新的负载均衡器,并且做了向前兼容,就算你的项目中继续用 Spring Cloud Netflix 套装(包括Ribbon,Eureka,Zuul,Hystrix等等)让你的项目中有这些依赖,你也可以通过简单的配置,把ribbon替换成Spring Cloud LoadBalancer。

负载均衡器在哪里使用?

Spring Cloud 中内部微服务调用默认是 http 请求,主要通过下面三种 API:

  • RestTemplate:同步 http API
  • WebClient:异步响应式 http API
  • 三方客户端封装,例如 openfeign

如果项目中加入了 spring-cloud-loadbalancer 的依赖并且配置启用了,那么会自动在相关的 Bean 中加入负载均衡器的特性。

  • 对于 RestTemplate,会自动对所有
    @LoadBalanced
    注解修饰的 RestTemplate Bean 增加 Interceptor 从而加上了负载均衡器的特性。
  • 对于 WebClient,会自动创建
    ReactorLoadBalancerExchangeFilterFunction
    ,我们可以通过加入
    ReactorLoadBalancerExchangeFilterFunction
    会加入负载均衡器的特性。
  • 对于三方客户端,一般不需要我们额外配置什么。

这些使用的示例,会在我们系列升级完最后的测试部分看到。

Spring Cloud LoadBalancer 结构简介

系列之前的文章我们提到了 NamedContextFactory,Spring Cloud LoadBalancer 这里也是使用了这个机制实现了不同微服务使用不同的 Spring Cloud LoadBalancer 配置。相关核心实现是

@LoadBalancerClient
@LoadBalancerClients
这两个注解,以及
NamedContextFactory.Specification
的实现
LoadBalancerClientSpecification
NamedContextFactory
的实现
LoadBalancerClientFactory
。如下图所示:

  1. 可以通过
    loadbalancer.client.name
    这个属性获取当前要创建的 Bean 是哪个微服务的
  2. 可以知道默认配置是
    LoadBalancerClientConfiguration
    ,再查看它里面的源代码我们可以知道主要初始化两个 Bean: ReactorLoadBalancer,负载均衡器,因为有
    @ConditionalOnMissingBean
    所以可以被替换,这就是我们的扩展点
  3. ServiceInstanceSupplier,提供实例信息的 Supplier,因为有
    @ConditionalOnMissingBean
    所以可以被替换,这就是我们的扩展点
  • Specification 为 LoadBalancerSpecification,再分析其调用可以知道,可以通过
    @LoadBalancerClient
    @LoadBalancerClients
    LoadBalancerClientConfiguration
    的基础上额外指定配置。
  • 我们这一节简要介绍了 Spring Cloud LoadBalancer 的使用场景,以及结构设计和扩展点。下一节我们将详细分析 Spring Cloud LoadBalancer 的源代码来理解其中的原理。

    微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer

    内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
    标签: