day03-loadbalancer

yuqiu2004 / 2024-07-10 / 原文

1 概述

  1. LoadBalancer: 被包含于spring cloud commons下用来替换以前的ribbon组件,一个客户端负载均衡器。不仅支持RestTemplate,还支持WebClient(Spring Web Flux中提供的功能,可以实现响应式异步请求)。
  2. 客户端负载均衡和服务端负载均衡有什么区别
    • 服务端负载均衡:负载均衡在服务器上实现
    • 客户端负载均衡:调用微服务接口的时候,会在注册中心获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务技术

2 Windows环境下Consul配置持久化

  1. 根路径下新增存储配置的文件夹 如/mydata

  2. 根路径下建立一个脚本文件consul_start.bat

    @echo.服务启动......  
    @echo off  
    @sc create Consul binpath= "F:\consul_1.19.0_windows_386\consul.exe agent -server -ui -bind=127.0.0.1 -client=0.0.0.0 -bootstrap-expect  1  -data-dir F:\consul_1.19.0_windows_386\mydata   "
    @net start Consul
    @sc config Consul start= AUTO  
    @echo.Consul start is OK......success
    @pause
    
  3. 之后启动consul就双击脚本文件启动即可,然后登入localhost:8500编写配置即可持久化

3 客户端服务调用负载均衡

  1. 引入负载均衡的依赖
<!--loadbalancer-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
  1. 修改consumer的controller,添加一个调用微服务的接口,例如下述代码

        @GetMapping("/consumer/pay/get/info")
        public ResultData getConfigInfo(){
            return restTemplate.getForObject(PaymentSrv_URL+"/pay/get/info",ResultData.class);
        }
    
  2. 访问测试

4 负载均衡算法

​ 实际上使用默认的轮询就已经足够了

  • 轮询 RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer

    • 负载均衡算法:rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标 ,每次服务重启动后rest接口计数从1开始。
  • 随机 RandomLoadBalancer implements ReactorServiceInstanceLoadBalancer

切换算法:

@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);
    }
}