SpringCloud升级之路2020.0.x版-21.Spring Cloud LoadBalancer简介
本系列代码地址: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
所以可以被替换,这就是我们的扩展点
@LoadBalancerClient和
@LoadBalancerClients在
LoadBalancerClientConfiguration的基础上额外指定配置。
我们这一节简要介绍了 Spring Cloud LoadBalancer 的使用场景,以及结构设计和扩展点。下一节我们将详细分析 Spring Cloud LoadBalancer 的源代码来理解其中的原理。
微信搜索“我的编程喵”关注公众号,每日一刷,轻松提升技术,斩获各种offer:
- SpringCloud升级之路2020.0.x版-22.Spring Cloud LoadBalancer核心源码
- SpringCloud升级之路2020.0.x版-24.测试Spring Cloud LoadBalancer
- SpringCloud升级之路2020.0.x版-23.订制Spring Cloud LoadBalancer
- Spring Cloud 升级之路 - 2020.0.x - 7. 使用 Spring Cloud LoadBalancer (2)
- 【spring cloud hoxton】Ribbon 真的能被 spring-cloud-loadbalancer 替代吗
- SpringCloud使用Feign出现java.lang.ClassNotFoundException: org.springframework.cloud.client.loadbalancer....
- Spring Cloud 升级之路 - 2020.0.x - 4. 使用 Eureka 作为注册中心
- Spring Cloud 升级之路 - 2020.0.x - 2. 使用 Undertow 作为我们
- Spring Cloud 升级之路 - 2020.0.x - 4. 使用 Eureka 作为注册中心
- springCloud出现:Load balancer does not have available server for client: SERVICE-XXX的错误解决方法
- SpringCloud简介(技术搭配+升级版本策略)
- Spring Cloud 升级之路 - 2020.0.x - 3. Undertow 的 acces
- Spring Cloud 升级之路 - 2020.0.x - 1. 背景知识、需求描述与公共依赖
- Spring Cloud 升级之路 - 2020.0.x - 1. 背景知识、需求描述与公共依赖
- Spring Cloud Alibaba简介与环境搭建
- Spring Cloud微服务分布式云架构-集成项目简介
- Spring Cloud Gateway使用简介
- (三)spring cloud微服务分布式云架构 - Spring Cloud集成项目简介
- Spring Cloud Alibaba学习笔记:入门简介
- SpringCloud(一)- SpringCloud简介