003-LoadBalancer负载均衡服务调用

文章目录

  • 前言
  • [1 简介](#1 简介)
  • [客户端负载 VS 服务器端负载区别](#客户端负载 VS 服务器端负载区别)
  • [2 spring-cloud-loadbalancer负载均衡解析](#2 spring-cloud-loadbalancer负载均衡解析)
    • [2.1 负载均衡演示案例-理论](#2.1 负载均衡演示案例-理论)
    • [2.2 负载均衡演示案例-实操](#2.2 负载均衡演示案例-实操)
      • [2.2.1 参考官网如何使用](#2.2.1 参考官网如何使用)
      • [2.2.2 启动consul,将8001/8002注册微服务](#2.2.2 启动consul,将8001/8002注册微服务)
      • [2.2.3 80模块改POM](#2.2.3 80模块改POM)
      • [2.2.3 80模块改RestTemplateConfig](#2.2.3 80模块改RestTemplateConfig)
      • [2.2.4 80模块改Controller并启动](#2.2.4 80模块改Controller并启动)
      • [2.2.5 查看consul上的服务](#2.2.5 查看consul上的服务)
      • [2.2.6 测试](#2.2.6 测试)
    • [2.3 负载均衡演示案例-小总结](#2.3 负载均衡演示案例-小总结)
      • [2.3.1 编码使用DiscoveryClient动态获取所有上线的服务列表](#2.3.1 编码使用DiscoveryClient动态获取所有上线的服务列表)
      • [2.3.2 代码解释,修改80微服务的Controller](#2.3.2 代码解释,修改80微服务的Controller)
      • [2.3.3 结合前面实操,负载选择原理小总结](#2.3.3 结合前面实操,负载选择原理小总结)
  • [3 负载均衡算法原理](#3 负载均衡算法原理)
    • [3.1 默认算法是什么?有几种?](#3.1 默认算法是什么?有几种?)
    • [3.2 算法切换](#3.2 算法切换)
    • [3.2 测试](#3.2 测试)

前言

通过百度网盘分享的文件:springcloud

链接:https://pan.baidu.com/s/1MU9HHeGGbUzN8SVLQtEM3A

提取码:msr3

官网:https://docs.spring.io/spring-cloud-commons/docs/current/reference/html/#spring-cloud-loadbalancer

1 简介

LB负载均衡(Load Balance)是什么

简单的说就是将用户的请求平摊的分配到多个服务上,从而达到系统的HA(高可用),常见的负载均衡有软件Nginx,LVS,硬件 F5等

spring-cloud-starter-loadbalancer组件是什么

Spring Cloud LoadBalancer是由SpringCloud官方提供的一个开源的、简单易用的客户端负载均衡器,它包含在SpringCloud-commons中用它来替换了以前的Ribbon组件。相比较于Ribbon,SpringCloud LoadBalancer不仅能够支持RestTemplate,还支持WebClient(WeClient是Spring Web Flux中提供的功能,可以实现响应式异步请求)

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

loadbalancer本地负载均衡客户端 VS Nginx服务端负载均衡区别

Nginx是服务器负载均衡,客户端所有请求都会交给nginx,然后由nginx实现转发请求,即负载均衡是由服务端实现的。

loadbalancer本地负载均衡,在调用微服务接口时候,会在注册中心上获取注册信息服务列表之后缓存到JVM本地,从而在本地实现RPC远程服务调用技术。

2 spring-cloud-loadbalancer负载均衡解析

2.1 负载均衡演示案例-理论

架构说明:80通过轮询负载访问8001/8002/8003

LoadBalancer 在工作时分成两步:

第一步,先选择ConsulServer从服务端查询并拉取服务列表,知道了它有多个服务(上图3个服务),这3个实现是完全一样的,

默认轮询调用谁都可以正常执行。类似生活中求医挂号,某个科室今日出诊的全部医生,客户端你自己选一个。

第二步,按照指定的负载均衡策略从server取到的服务注册列表中由客户端自己选择一个地址,所以LoadBalancer是一个客户端的负载均衡器。

2.2 负载均衡演示案例-实操

2.2.1 参考官网如何使用

官网:https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html

java 复制代码
@Configuration
public class MyConfiguration {

    @LoadBalanced//添加注解即可
    @Bean
    RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

2.2.2 启动consul,将8001/8002注册微服务

  1. consul agent -dev (如果已经持久化请忽略)
  2. 按照8001拷贝后新建8002微服务
  3. 测试:http://localhost:8002/pay/get/info

2.2.3 80模块改POM

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

xml 复制代码
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>

2.2.3 80模块改RestTemplateConfig

当然了,在之前我们已经加过@LoadBalanced注解

java 复制代码
@Configuration
public class RestTemplateConfig {
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

2.2.4 80模块改Controller并启动

在controller中追加方法,用来测试轮询效果

java 复制代码
@GetMapping(value = "/consumer/pay/get/info")
    private String getInfoByConsul()
    {
        return restTemplate.getForObject(PaymentSrv_URL + "/pay/get/info", String.class);
    }

2.2.5 查看consul上的服务

2.2.6 测试

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

通过上述地址,交替访问到了8001/8002

2.3 负载均衡演示案例-小总结

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

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

java 复制代码
@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();
}

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

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

List instances = discoveryClient.getInstances("cloud-payment-service");

如: List 0 instances = 127.0.0.1:8002

   List 1 instances = 127.0.0.1:8001

8001+ 8002 组合成为集群,它们共计2台机器,集群总数为2, 按照轮询算法原理:

当总请求数为1时: 1 % 2 =1 对应下标位置为1 ,则获得服务地址为127.0.0.1:8001

当总请求数位2时: 2 % 2 =0 对应下标位置为0 ,则获得服务地址为127.0.0.1:8002

当总请求数位3时: 3 % 2 =1 对应下标位置为1 ,则获得服务地址为127.0.0.1:8001

当总请求数位4时: 4 % 2 =0 对应下标位置为0 ,则获得服务地址为127.0.0.1:8002

如此类推...

3 负载均衡算法原理

3.1 默认算法是什么?有几种?

官网load balancing algorithm:https://docs.spring.io/spring-cloud-commons/reference/spring-cloud-commons/loadbalancer.html#switching-between-the-load-balancing-algorithms

默认2种:

  1. 轮询
  2. 随机

3.2 算法切换

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

调整RestTemplateConfig类:

添加注解@LoadBalancerClient(如果是轮询算法可以不加)

添加bean切换算法

java 复制代码
@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);
    }
}

3.2 测试

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

相关推荐
章老师说5 小时前
NGINX官方谈Lua风险:这其实是两条网关技术路线之争
运维·nginx·负载均衡·lua·openresty
LiaoWL1236 小时前
【SpringCloud合集-02】Spring Cloud LoadBalancer 负载均衡器学习笔记
学习·spring cloud·负载均衡
姚不倒1 天前
F5 SSL Profile 证书卸载深入篇
运维·网络协议·负载均衡·ssl·f5
oscar9991 天前
3.4 Nginx 负载均衡——动态再平衡的反人性纪律
nginx·github·负载均衡·财富源代码
姚不倒1 天前
F5 健康检查 Monitor 深入篇
运维·负载均衡·f5
我是一颗柠檬3 天前
【Java项目技术亮点】加权轮询负载均衡算法
java·算法·负载均衡
fei_sun4 天前
等价负载均衡(等价路由ECMP)
运维·负载均衡
地瓜伯伯21 天前
从MESI缓存一致性协议讲透synchronized的底层
java·spring boot·spring·spring cloud·微服务·springcloud
我登哥MVP22 天前
SpringCloud Alibaba 核心组件解析:服务调用和负载均衡
java·spring boot·后端·spring·spring cloud·java-ee·负载均衡
星辰_mya23 天前
openfeign之在回首
java·架构·dubbo·springcloud·openfeign