Spring Cloud——LoadBalancer
这里只是简单的讲解了一下LoadBalancer如何使用,因为实际上我们使用的不是很多,主要还是使用OpenFeign。
·
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
组件:<!--loadbalancer--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency>
- 第二步,赋予
RestTemplate
负载均衡的能力:@Configuration public class RestTemplateConfig { /** * 使用 @LoadBalanced 注解赋予 RestTemplate 负载均衡的能力 */ @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
2.编码使用DiscoveryClient动态获取所有上线的服务列表
- 负载均衡算法:
rest
接口第几次请求数%服务器集群总数量 = 实际调用服务器位置下标,每次服务器重启后rest
接口计数从1开始。@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.从默认的轮询,切换为随机算法
/**
* 将负载均衡的默认轮询算法,切换为随机算法
*/
@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);
}
}
更多推荐
已为社区贡献2条内容
所有评论(0)