Spring Cloud------LoadBalancer
- 一、负载均衡(LoadBalance)
-
- [1.LoadBalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别](#1.LoadBalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别)
- 二、LoadBalancer
-
- [1.Spring RestTemplate as a LoadBalancer Client](#1.Spring RestTemplate as a LoadBalancer Client)
- 2.编码使用DiscoveryClient动态获取所有上线的服务列表
- 3.从默认的轮询,切换为随机算法
一、负载均衡(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组件:xml<!--loadbalancer--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> -
第二步,赋予
RestTemplate负载均衡的能力:java@Configuration public class RestTemplateConfig { /** * 使用 @LoadBalanced 注解赋予 RestTemplate 负载均衡的能力 */ @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
2.编码使用DiscoveryClient动态获取所有上线的服务列表
-
负载均衡算法:
rest接口第几次请求数%服务器集群总数量 = 实际调用服务器位置下标,每次服务器重启后rest接口计数从1开始。java@Resource private DiscoveryClient discoveryClient; @GetMapping("/discovery") public ResponseResult<List<String>> discovery() { List<String> list = new ArrayList<>(); List<String> services = discoveryClient.getServices(); for (String element : services) { List<ServiceInstance> instances = discoveryClient.getInstances(element); for (ServiceInstance ele : instances) { list.add(ele.getServiceId() + " " + ele.getHost() + " " + ele.getPort() + " " + ele.getUri()); } } return ResponseResult.success(list); }
3.从默认的轮询,切换为随机算法
java
/**
* 将负载均衡的默认轮询算法,切换为随机算法
*/
@Configuration
@LoadBalancerClient(
//下面的value值大小写一定要和consul里面的名字一样,必须一样
value = "cloud-payment-service", configuration = RestTemplateConfig.class)
public class RestTemplateConfig {
@Bean
@LoadBalanced //使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
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);
}
}