Spring Cloud——LoadBalancer
一、负载均衡(LoadBalance)
负载均衡(Load Balance)
,简单的说就是将用户的请求分摊到多个服务上,从而使系统达到高可用性,常见的负载均衡有软件Nginx
、LVS
,硬件F5
等。Spring Cloud LoadBalancer
是由Spring Cloud
官网提供的一个开源的、简单易用的客户端负载均衡器
,它包含在Spring Cloud Commons
中用来替换以前的Ribbon
组件。想比较于Ribbon
,Spring Cloud LoadBalancer
不仅能够支持RestTemplate
,还支持WebClient
(WebClient
是Spring Web Flux
中提供的功能,可以实现响应式异步请求)
1.LoadBalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别
Nginx
是服务器负载均衡,客户端所有请求都会交给Nginx
,然后由Nginx
实现转发请求,即负载均衡是由服务端实现的。LoadBalancer
本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表
之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。
二、LoadBalancer
LoadBalancer
工作步骤如下:
第一步:先从ConsulServer
查询并拉取服务列表,知道了它有多个服务,每个服务实现是完全一样的,默认轮询调用谁都可以正常执行。 第二步:按照指定的负载均衡策略从server
取到的服务注册列表中由客户端自己选择一个地址,所以LoadBalancer是一个客户端的负载均衡器。
1.Spring RestTemplate as a LoadBalancer Client
第一步,在服务调用方加入LoadBalancer
组件:
< dependency>
< groupId> org.springframework.cloud</ groupId>
< artifactId> spring-cloud-starter-loadbalancer</ artifactId>
</ dependency>
第二步,赋予RestTemplate
负载均衡的能力:@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate ( ) {
return new RestTemplate ( ) ;
}
}
2.编码使用DiscoveryClient动态获取所有上线的服务列表
3.从默认的轮询,切换为随机算法
@Configuration
@LoadBalancerClient (
value = "cloud-payment-service" , configuration = RestTemplateConfig . class )
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate ( ) {
return new RestTemplate ( ) ;
}
@Bean
ReactorLoadBalancer < ServiceInstance > randomLoadBalancer ( Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment. getProperty ( LoadBalancerClientFactory . PROPERTY_NAME ) ;
return new RandomLoadBalancer ( loadBalancerClientFactory. getLazyProvider ( name, ServiceInstanceListSupplier . class ) , name) ;
}
}