【SpringCloud】2.LoadBalancer——服务调用与负载均衡

基本介绍

主要功能: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
    @LoadBalanced
    public 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的方法,即负载均衡。

 基本原理

  1. 会在项目中创建一个DiscoveryClient对象
  2. 通过DiscoveryClient对象,就能够获取注册中心中所有注册的服务
  3. 然后将获取的服务与调用地址中传入的微服务名称进行对比
  4. 如果一致,就会将微服务集群的相关信息返回
  5. 然后通过负载均衡算法,选择出其中一个服务进行调用

负载均衡算法切换

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 }

 

posted @ 2024-12-02 16:10  陆陆无为而治者  阅读(224)  评论(0编辑  收藏  举报