springcloud~ LoadBalancer
前言
由于 Netflix Ribbon 进入停更维护阶段,因此 SpringCloud 2020.0.1 版本之后 删除了eureka中的ribbon,替代ribbon的是spring cloud自带的LoadBalancer,默认使用的是轮询的方式,新版本的 Nacos discovery 都已经移除了 Ribbon ,此时我们需要引入loadbalancer代替,才能调用服务提供者提供的服务。
Spring Cloud全家桶在Spring Cloud Commons项目中,添加了Spring cloud Loadbalancer作为新的负载均衡器,并且做了向前兼容,就算你的项目中继续用 Spring Cloud Netflix 套装(包括Ribbon,Eureka,Zuul,Hystrix等等)让你的项目中有这些依赖,你也可以通过简单的配置,把ribbon替换成Spring Cloud LoadBalancer。
均衡负载
- 大概就是两种:网关层均衡负载和客户端层均衡负载
- 网关层想我之前公司有用的F5,就是在网管层做均衡负载,就是你只管请求我,我来负责维护服务地址列表,你也不需要搞什么服务发现这些。(坏处是涉及到网关层维护,网络消耗和复杂度维护角度不简单)
- 客户端层就好比我们这个LoadBalancer,就是我作为一个客户端我自己去不断去发现更新维护自己的一套服务列表,我自己去定义服务的均衡负载策略,不管是随机还是计数甚至可以搞小流量的金丝雀
客户端负载均衡组件
架构设计
- 默认使用BlockingLoadBalancerClient来实现,也可以自己去定义,不建议再使用ribbon了。
两种负载算法
目前 SpringCloud LoadBalance 仅支持两种负载均衡策略:【轮询策略】和【随机策略】,默认是轮询策略。
随机策略的使用
- 首先需要定义随机的算法对象,并通过 @Bean 将其加载到 Spring 容器中,具体如下:
public class RandomLoadBalancerConfig {
@Bean
ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(
Environment environment, LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new RandomLoadBalancer(loadBalancerClientFactory
.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}
}
- 然后在@LoadBalancerClient 或 @LoadBalancerClients 注解,针对具体服务配置具体的客户端负载均衡算法策略。
@LoadBalancerClient(name = "PROVIDER-APP", configuration = RandomLoadBalancerConfig.class)
@Configuration
public class RestTemplateConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
相关配置
spring:
cloud:
loadbalancer:
health-check:
initial-delay: 1s
clients:
myclient:
health-check:
interval: 30s
上面的例子将合成一个@ConfigurationProperties的对象并且设置了initial-dalay=1s和interval=30s。
- 大多数client属性可以单独配置,除了以下的全局配置:
spring.cloud.loadbalancer.enabled:全局启用/关闭load-balancingspring.cloud.loadbalancer.retry.enabled:全局启用/关闭load-balancing重试机制,如果全局启用了它,仍然可以在单独的client属性中配置来关闭它。spring.cloud.loadbalancer.cache.enabled:全局启用/关闭load-balancing缓存,如果全局启用了它,仍然可以通过创建自定义配置(在ServiceInstanceListSupplier委托层级中不包含CachingServiceInstanceListSupplier)来关闭它。spring.cloud.loadbalancer.stats.micrometer.enabled:全局启用/关闭LoadBalancer Micrometer metrics。
几个注解
- @LoadBalanced
使用@LoadBalanced注解描述RestTemplate对象时,系统底层在基于RestTemplate进行远程服务调用时,会被一个拦截器(LoadBalancerInterceptor)拦截到,然后进行功能增强,这里的功能增强指的是,基于loadBalancerClient对象进行服务实例获取,而这个服务实例获取的过程,底层会采用负载均衡。
- @EnableFeignClients
用于描述一些配置类,告诉系统底层启动时为@FeignClient注解描述的接口创建实现类及对象,然后交给Spring管理
- @FeignClient
@FeignClient 注解告诉Feign Starter,在项目启动时,为此注解描述的接口创建实现类-代理类,用于描述远程服务调用接口,其value属性值有两个层面的含义:
1.你要调用的远程服务名
2.当前bean的名字,假如不使用这个名字还可以使用contextId指定bean的名字
OpenFeign
- OpenFeign 同时集成了 Spring Cloud LoadBalancer 和 Spring Cloud CircuitBreaker,提供负载均衡和熔断降级的功能。
- Feign 默认的负载均衡策略是轮询调用。