一、Ribbon目前也进入维护模式
(1)是什么
(2)维护模式不再介绍了,了解即可
GitHub - Netflix/ribbon: Ribbon is a Inter Process Communication (remote procedure calls) library with built in software load balancers. The primary usage model involves REST calls with various serialization scheme support.
(3)Ribbon未来替换方案
二、spring-cloud-loadbalancer概述
(1)官网
(2)是什么
(3)面试题
客户端负载 VS 服务器端负载区别
三、spring-cloud-loadbalancer负载均衡解析
(1)负载均衡演示案例—理论
架构说明:80通过轮询负载访问8001/8002/8003
LoadBalancer 在工作时分成两步:
- 第一步,先选择ConsulServer从服务端查询并拉取服务列表,知道了它有多个服务(上图3个服务),这3个实现是完全一样的
- 第二步,按照指定的负载均衡策略从server取到的服务注册列表中由客户端自己选择一个地址,所以LoadBalancer是一个客户端的负载均衡器
(2)负载均衡演示案例—实操
4.2.1官网参考如何正确使用?
Spring Cloud LoadBalancer :: Spring Cloud Commons
4.2.2按照8001拷贝后新建8002微服务
(1)consul agent -dev
(2)将8001/8002启动后注册进微服务
(3)bug
- 我们之前的配置完全消失了,没有持久化保存
- Consul数据持久化配置并且注册为Windows服务
- D:\devSoft\consul目录下(即consul.exe所在位置)新建(1)空文件夹mydata(2)新建文件consul_start.bat后缀为.bat
- 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
- 右键管理员权限打开
- 启动结果
- win后台
- 后续consul的配置数据会保存进mydata文件夹,重启有了
- D:\devSoft\consul目录下(即consul.exe所在位置)新建(1)空文件夹mydata(2)新建文件consul_start.bat后缀为.bat
(4)后台自启动Consul测试地址
localhost:8001/pay/get/info
4.2.3启动Consul,将8001/8002启动后注册进微服务
4.2.4订单80模块修改POM并注册进consul,新增LoadBalancer组件
<!--loadbalancer-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
4.2.5订单80模块修改Controller并启动80
4.2.6目前consul上的服务
4.2.7测试
- localhost/consumer/pay/get/info
- 通过上述地址,交替访问到了8001/8002
(3)负载均衡演示案例—小总结
3.3.1编码使用DiscoveryClient动态获取所有上线的服务列表
3.3.2代码解释,修改80微服务的Controller
@Resourceprivate 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();}
3.3.3结合前面实操,负载选择原理小总结
- 负载均衡算法:rest接口第几次请求数 % 服务器集群总数量 = 实际调用服务器位置下标 ,每次服务重启动后rest接口计数从1开始
- 举例说明:
四、负载均衡算法原理
(1)默认算法是什么?有几种?
4.1.1官网Load balancing algorithm
Spring Cloud LoadBalancer :: Spring Cloud Commons
4.1.2默认2种
- 轮询:public class RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer
- 随机:public class RandomLoadBalancer implements
ReactorServiceInstanceLoadBalancer
4.1.3源码流程浅读,不用深入非重点
- org.springframework.cloud.client.loadbalancer.reactive.ReactiveLoadBalancer
- 接口: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@LoadBalancedpublic RestTemplate restTemplate(){return new RestTemplate();}@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory){String name = environment.getProperty(loadBalancerClientFactory.PROPERTY_NAME);return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}
}
(3)测试
http://localhost/consumer/pay/get/info