springcloud~ LoadBalancer
前言
由于 Netflix Ribbon 進(jìn)入停更維護(hù)階段,因此 SpringCloud 2020.0.1 版本之后 刪除了eureka中的ribbon,替代ribbon的是spring cloud自帶的LoadBalancer,默認(rèn)使用的是輪詢的方式,新版本的 Nacos discovery 都已經(jīng)移除了 Ribbon ,此時(shí)我們需要引入loadbalancer代替,才能調(diào)用服務(wù)提供者提供的服務(wù)。
Spring Cloud全家桶在Spring Cloud Commons項(xiàng)目中,添加了Spring cloud Loadbalancer作為新的負(fù)載均衡器,并且做了向前兼容,就算你的項(xiàng)目中繼續(xù)用 Spring Cloud Netflix 套裝(包括Ribbon,Eureka,Zuul,Hystrix等等)讓你的項(xiàng)目中有這些依賴,你也可以通過(guò)簡(jiǎn)單的配置,把ribbon替換成Spring Cloud LoadBalancer。
均衡負(fù)載
- 大概就是兩種:網(wǎng)關(guān)層均衡負(fù)載和客戶端層均衡負(fù)載
- 網(wǎng)關(guān)層想我之前公司有用的F5,就是在網(wǎng)管層做均衡負(fù)載,就是你只管請(qǐng)求我,我來(lái)負(fù)責(zé)維護(hù)服務(wù)地址列表,你也不需要搞什么服務(wù)發(fā)現(xiàn)這些。(壞處是涉及到網(wǎng)關(guān)層維護(hù),網(wǎng)絡(luò)消耗和復(fù)雜度維護(hù)角度不簡(jiǎn)單)
- 客戶端層就好比我們這個(gè)LoadBalancer,就是我作為一個(gè)客戶端我自己去不斷去發(fā)現(xiàn)更新維護(hù)自己的一套服務(wù)列表,我自己去定義服務(wù)的均衡負(fù)載策略,不管是隨機(jī)還是計(jì)數(shù)甚至可以搞小流量的金絲雀
客戶端負(fù)載均衡組件

架構(gòu)設(shè)計(jì)
- 默認(rèn)使用BlockingLoadBalancerClient來(lái)實(shí)現(xiàn),也可以自己去定義,不建議再使用ribbon了。

兩種負(fù)載算法
目前 SpringCloud LoadBalance 僅支持兩種負(fù)載均衡策略:【輪詢策略】和【隨機(jī)策略】,默認(rèn)是輪詢策略。
隨機(jī)策略的使用
- 首先需要定義隨機(jī)的算法對(duì)象,并通過(guò) @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 注解,針對(duì)具體服務(wù)配置具體的客戶端負(fù)載均衡算法策略。
@LoadBalancerClient(name = "PROVIDER-APP", configuration = RandomLoadBalancerConfig.class)
@Configuration
public class RestTemplateConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
相關(guān)配置
spring:
cloud:
loadbalancer:
health-check:
initial-delay: 1s
clients:
myclient:
health-check:
interval: 30s
上面的例子將合成一個(gè)@ConfigurationProperties的對(duì)象并且設(shè)置了initial-dalay=1s和interval=30s。
- 大多數(shù)client屬性可以單獨(dú)配置,除了以下的全局配置:
spring.cloud.loadbalancer.enabled:全局啟用/關(guān)閉load-balancingspring.cloud.loadbalancer.retry.enabled:全局啟用/關(guān)閉load-balancing重試機(jī)制,如果全局啟用了它,仍然可以在單獨(dú)的client屬性中配置來(lái)關(guān)閉它。spring.cloud.loadbalancer.cache.enabled:全局啟用/關(guān)閉load-balancing緩存,如果全局啟用了它,仍然可以通過(guò)創(chuàng)建自定義配置(在ServiceInstanceListSupplier委托層級(jí)中不包含CachingServiceInstanceListSupplier)來(lái)關(guān)閉它。spring.cloud.loadbalancer.stats.micrometer.enabled:全局啟用/關(guān)閉LoadBalancer Micrometer metrics。
幾個(gè)注解
- @LoadBalanced
使用@LoadBalanced注解描述RestTemplate對(duì)象時(shí),系統(tǒng)底層在基于RestTemplate進(jìn)行遠(yuǎn)程服務(wù)調(diào)用時(shí),會(huì)被一個(gè)攔截器(LoadBalancerInterceptor)攔截到,然后進(jìn)行功能增強(qiáng),這里的功能增強(qiáng)指的是,基于loadBalancerClient對(duì)象進(jìn)行服務(wù)實(shí)例獲取,而這個(gè)服務(wù)實(shí)例獲取的過(guò)程,底層會(huì)采用負(fù)載均衡。
- @EnableFeignClients
用于描述一些配置類,告訴系統(tǒng)底層啟動(dòng)時(shí)為@FeignClient注解描述的接口創(chuàng)建實(shí)現(xiàn)類及對(duì)象,然后交給Spring管理
- @FeignClient
@FeignClient 注解告訴Feign Starter,在項(xiàng)目啟動(dòng)時(shí),為此注解描述的接口創(chuàng)建實(shí)現(xiàn)類-代理類,用于描述遠(yuǎn)程服務(wù)調(diào)用接口,其value屬性值有兩個(gè)層面的含義:
1.你要調(diào)用的遠(yuǎn)程服務(wù)名
2.當(dāng)前bean的名字,假如不使用這個(gè)名字還可以使用contextId指定bean的名字
OpenFeign
- OpenFeign 同時(shí)集成了 Spring Cloud LoadBalancer 和 Spring Cloud CircuitBreaker,提供負(fù)載均衡和熔斷降級(jí)的功能。
- Feign 默認(rèn)的負(fù)載均衡策略是輪詢調(diào)用。
浙公網(wǎng)安備 33010602011771號(hào)