目录

SpringCloudLoadBalancer负载均衡服务调用

SpringCloud——LoadBalancer负载均衡服务调用

一、Ribbon目前也进入维护模式

(1)是什么

https://i-blog.csdnimg.cn/direct/726ca2a29e53449eb08f76500b990d8d.png https://i-blog.csdnimg.cn/direct/abe5859220c241ed94735cd1d1b2df4f.png

(2)维护模式不再介绍了,了解即可

https://i-blog.csdnimg.cn/direct/4ff0aea7f8d84dada3a6bf1f6b01c143.png

(3)Ribbon未来替换方案

二、spring-cloud-loadbalancer概述

(1)官网

https://i-blog.csdnimg.cn/direct/1d0b90dd18fb4b43b292591aaf98a49a.png

(2)是什么

https://i-blog.csdnimg.cn/direct/220d73f7048747399d12dc8569add986.png https://i-blog.csdnimg.cn/direct/b79da76b14f044cf91aef7e6bd34f5d5.png

(3)面试题

客户端负载 VS 服务器端负载区别

https://i-blog.csdnimg.cn/direct/e780b5bf918346a39532e95ffecf63a3.png https://i-blog.csdnimg.cn/direct/22c4ac8c9d0d450a96a875dc0a9277fa.png

三、spring-cloud-loadbalancer负载均衡解析

(1)负载均衡演示案例—理论

架构说明:80通过轮询负载访问8001/8002/8003 https://i-blog.csdnimg.cn/direct/39ef829c425c480d9a7de082a1cb8c84.png

LoadBalancer 在工作时分成

两步

  1. 第一步 ,先选择ConsulServer从服务端查询并拉取服务列表,知道了它有多个服务(上图3个服务),这3个实现是完全一样的
  2. 第二步 ,按照指定的负载均衡策略从server取到的服务注册列表中由客户端自己选择一个地址,所以LoadBalancer是一个客户端的负载均衡器

(2)负载均衡演示案例—实操

4.2.1官网参考如何正确使用?

https://i-blog.csdnimg.cn/direct/0e35924921564c9ea7e0ef937bb9ee0a.png https://i-blog.csdnimg.cn/direct/2372fb649edb4a27b4c0d3a9faa4aab2.png

4.2.2按照8001拷贝后新建8002微服务

(1)consul agent -dev

https://i-blog.csdnimg.cn/direct/f6d6da8ba1f54241bc2da73e2d82b22b.png

(2)将8001/8002启动后注册进微服务

https://i-blog.csdnimg.cn/direct/757082068936444fab22b7f871054b69.png

(3)bug
  1. 我们之前的配置完全消失了,没有持久化保存 https://i-blog.csdnimg.cn/direct/69cfc3ba30b341ab910c24321b1bdc47.png
  2. Consul数据持久化配置并且注册为Windows服务
    1. D:\devSoft\consul目录下(即consul.exe所在位置)新建(1)空文件夹mydata(2)新建文件consul_start.bat后缀为.bat https://i-blog.csdnimg.cn/direct/2ef06c86906d480990d0d8b4ad4ccff9.png

    2. consul_start.bat内容信息

      @echo.服务启动......  
      @echo off  
      @sc create Consul binpath= "D:\devSoft\consul_1.20.4_windows_386\consul.exe agent -server -ui -bind=127.0.0.1 -client=0.0.0.0 -bootstrap-expect  1  -data-dir D:\devSoft\consul_1.20.4_windows_386\mydata"
      @net start Consul
      @sc config Consul start= AUTO  
      @echo.Consul start is OK......success
      @pause
    3. 右键管理员权限打开 https://i-blog.csdnimg.cn/direct/1879066dab0f413ab9e84111c19f1fee.png

    4. 启动结果 https://i-blog.csdnimg.cn/direct/0b3eba2cd0724c8d8d48253ccb358480.png

    5. win后台 https://i-blog.csdnimg.cn/direct/6b96e1eca32542eb8931158be92e0aca.png

    6. 后续consul的配置数据会保存进mydata文件夹,重启有了

(4)后台自启动Consul测试地址

4.2.3启动Consul,将8001/8002启动后注册进微服务

https://i-blog.csdnimg.cn/direct/a5016e0378654e948cc98f905cf8f23a.png

4.2.4订单80模块修改POM并注册进consul,新增LoadBalancer组件

https://i-blog.csdnimg.cn/direct/04ab2448295242c69f8933a5cc5ae4ac.png

<!--loadbalancer-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

https://i-blog.csdnimg.cn/direct/98b6203152fa4714af3f843c5f2ade1a.png

4.2.5订单80模块修改Controller并启动80

https://i-blog.csdnimg.cn/direct/1e558cc596ac4481b8c408e2718736b8.png https://i-blog.csdnimg.cn/direct/a484576c65da4bf5a96ff719db95f074.png

4.2.6目前consul上的服务

https://i-blog.csdnimg.cn/direct/92976b8dcce3456995ffeb38db3f154c.png

4.2.7测试

  1. 通过上述地址,交替访问到了8001/8002 https://i-blog.csdnimg.cn/direct/0ab6b83619f34f7588477ed293497da2.png https://i-blog.csdnimg.cn/direct/b68cd744ace44b83a5fc9532ae256aa1.png

(3)负载均衡演示案例—小总结

3.3.1编码使用DiscoveryClient动态获取所有上线的服务列表

https://i-blog.csdnimg.cn/direct/8c9ab5dbb1074e6ba3dc7c4692a158b0.png

3.3.2代码解释,修改80微服务的Controller

@Resource
    private DiscoveryClient discoveryClient;
    @GetMapping("/consumer/discovery")
    public String discovery(){
        List<String> services = discoveryClient.getServices();
        for (String element : services) {
            System.out.println(element);
        }
        System.out.println("==========================================================");

        List<ServiceInstance> instances = discoveryClient.getInstances("cloud-payment-service");
        for (ServiceInstance element : instances) {
            System.out.println(element.getServiceId() + "\t" + element.getHost() + "\t" + element.getPort() + "\t" + element.getUri());
        }

        return instances.get(0).getServiceId() + ":" + instances.get(0).getPort();
    }

https://i-blog.csdnimg.cn/direct/f374479cbf794f5eb7b22c33f3cd798c.png https://i-blog.csdnimg.cn/direct/d88a11dcbef545b88e162b8b1a162ce1.png

3.3.3结合前面实操,负载选择原理小总结

  1. 负载均衡算法

    :rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标  ,每次服务重启动后rest接口计数从1开始

  2. 举例说明https://i-blog.csdnimg.cn/direct/45a4efd617bc4e228b00da182df03b75.png

四、负载均衡算法原理

(1)默认算法是什么?有几种?

4.1.1官网Load balancing algorithm

4.1.2默认2种

https://i-blog.csdnimg.cn/direct/49d9b035c74144c5885fa8fe6853b177.png

  1. 轮询 :public class RoundRobin LoadBalancer implements ReactorServiceInstanceLoadBalancer

  2. 随机 :public class Random LoadBalancer implements

    ReactorServiceInstanceLoadBalancer

4.1.3源码流程浅读,不用深入非重点

  1. org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer
  2. 接口:ReactiveLoadBalancer

(2)算法切换

从默认的轮询,切换为随机算法,修改RestTemplateConfig

package com.atguigu.cloud.config;

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClient;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.web.client.RestTemplate;

@Configuration
@LoadBalancerClient(value = "cloud-payment-service",configuration = RestTemplateConfig.class)
public class RestTemplateConfig {

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

https://i-blog.csdnimg.cn/direct/20481e1da2b34f6684082654843dbc32.png https://i-blog.csdnimg.cn/direct/6b8a63932cc1492099bc3e3dd429b846.png https://i-blog.csdnimg.cn/direct/6936b9b17e6449009edd50ee2993fe73.png

(3)测试

http://localhost/consumer/pay/get/info