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