基本介绍
主要功能:LoadBlancer的主要作用就是提供客户端软件的负载均衡,然后由OpenFeign去调用具体的微服务。负载均衡的算法,分为轮询和随机。
使用
场景: 订单模块的负载均衡。通过消费者模块,访问订单支付模块(子模块8001/8002/8003)
例子前提:
- 已经使用了注册服务中心(https://www.cnblogs.com/luyj00436/p/18576831),根据前面的例子,已经使用了Consul。
- 已有订单支付模块,并且配置Consul服务。
- 消费者模块,已引用订单支付模块。
步骤
1. 消费者服务模块添加负载均衡。因为spring-cloud-starter-consul-discovery 中已经集成了spring-cloud-starter-loadbalancer,所以不需要额外加注解了。负载均衡注解 @LoadBalanced 。如果没有loadbalancer的依赖,那就自己加上。
@Configuration public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();} }
2.将调用的url改成在注册中心注册的名称。
public static final String PaymentSrv_URL = "http://cloud-payment-service";
3. 添加测试的方法。
支付模块,添加当前接口方法。
1 @GetMapping(value = "/pay/get/port") 2 @Operation(summary = "获取端口号",description = "获取当前项目端口号") 3 public ResultData<String> getInfoByConsul(HttpServletRequest request) { 4 int serverPort = request.getServerPort(); 5 return ResultData.success("返回端口号:" + serverPort) ; 6 }
消费者模块,添加支付者模块接口方法的引用
1 @GetMapping(value = "/consumer/pay/get/port") 2 @Operation(summary = "获取接口",description = "获取接口") 3 public ResultData<String> getPayPort() { 4 return restTemplate.getForObject(url + "/pay/get/port",ResultData.class); 5 }
4. 使用Services,为支付模块添加不同端口的服务。https://www.cnblogs.com/luyj00436/p/18580834 。支付模块的端口号为8001,添加的不同服务端口号为8002,8003。启动这3个服务。此时,我们在Consul可以看到这3个服务。
4. 调用消费者模块的测试方法。发现轮番调用8001,8002,8003的方法,即负载均衡。
基本原理
- 会在项目中创建一个DiscoveryClient对象
- 通过DiscoveryClient对象,就能够获取注册中心中所有注册的服务
- 然后将获取的服务与调用地址中传入的微服务名称进行对比
- 如果一致,就会将微服务集群的相关信息返回
- 然后通过负载均衡算法,选择出其中一个服务进行调用
负载均衡算法切换
LoadBlancer默认包含两种负载均衡算法,轮询算法和随机算法,同时还可以自定义负载均衡算法(通过实现接口完成,不详细说了,一般我们不会这么用)。
切换算法方式如下:
1 @Configuration 2 //下面的value值大小写一定要和consul里面的名字一样,必须一样 3 //value的值是指对哪个微服务生效 4 @LoadBalancerClient(value = "cloud-payment-service",configuration = RestTemplateConfig.class) 5 public class RestTemplateConfig 6 { 7 @Bean 8 @LoadBalanced 9 public RestTemplate restTemplate(){ 10 return new RestTemplate(); 11 } 12 13 @Bean 14 ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment, 15 LoadBalancerClientFactory loadBalancerClientFactory) { 16 String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); 17 18 //这里切换成了随机算法 19 return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name); 20 } 21 }