微服务架构实战学习笔记 第四章 Spring Cloud Netflix Ribbon与负载均衡
基于Spring Cloud Netflix Ribbon 实现负载均衡的,Ribbon从Eureka中获取所有注册的服务列表,通过负载均衡策略实现服务调用。调用结构图
一、负载均衡
所谓负载均衡(Load Balance)LB,就是将请求分摊到多个操作单元上进行执行。示意图:
1、负载均衡的类型
(1)服务端负载均衡
2、客户端负载均衡
优势:不会出现集中式负载均衡所产生的瓶颈,但是由于所运行是信息都需要在多个负载均衡器之间进行传递,会在一定程度上加重网络流量负载。简单的说就是在客户端程序内部设定一个调度算法,计算出目标服务器的地址。
3、负载均衡算法
分为:静态负载均衡算法、动态负载均衡算法
(1)静态负载均衡算法
代表是:随机算法和轮询算法
随机算法:器实现是使用JDK的Random 随机算法地址服务器提供者的地址,加权算法是随机算法的一中改进,可以提高服务的重用。
轮询算法:加权轮询算法同样使用权重,循环遍历服务提供者,达到上线之后归0,继续循环直到指定某一台服务器作为服务的提供者。
(2)动态负载均衡算法
典型的动态算法包括:最少连接算法、服务调用延时算法、源IP哈希算法。
最少连接数:对传入的请求根据每台服务打开的连接数来分配
服务调用延时算法:服务消费者缓存并计算所有服务提供者的服务调用延时,根据服务调用和平均延时的差值动态调整权重。
源IP哈希算法:实现请求IP粘滞连接,尽可能让消费者总是向同一提供者发起调用服务。
二、使用Ribbon实现客户端负载均衡
1、Ribbon主要功能是提供客户端负载均衡算法,两种方式方式是实现客户端负载均衡功能:
(1)使用@LoadBalanced注解和RestTemplate
服务消费者直接通过使用被@LoadBalanced注解修饰过的RestTemplate就可以自动实现服务调用过程中的负载均衡功能。
(2)使用@RibbonClient注解
通过@RibbonClient注解拉实现更细粒度的客户端配置。
两总方式的前提都是通过Eureka提供DiscoveryClient工具类查找注册在Eureka的服务。
2、使用DiscoveryClient查找服务
3、通过RestTemplate调用服务
在启动类中:加入
@LoadBalanced
@Bean
public RestTrmplate getRestTemplate(){
return new RestTemplate();
}
三、Ribbon基本框架
1、Ribbon核心机制
客户端负载均衡要做到:(1)服务列表中有那些服务 (2)如何从这些服务中选择一个进行调用。
Ribbon的核心接口ILoadBalancer 就是围绕着两个问题来设计的
addServers(List<Server> newServers) 加载后端服务
chooseServer(Object key)选择一个后端服务
markServerDown(Server server)标记一个服务不可用
getAllServers()获取所有服务列表
getReachableServer() 获取当前可用的服务列表
其最基本的实现类时BaseLoadBalancer。
IRule 负载均衡策略,可以插件化的为负载均衡提供各种适用的负载均衡算法。
IPing 判断目标服务是否存活,该接口中只有一个isAlive()方法,通过对服务器发出IPing操作来获取服务响应,从而判断服务是否可用。
LoadBalancerStats 记录负载均衡使用时运行信息,用来作为负载均衡策略的运行时输入。
因此如何选择一个服务是通过:IRule实现的。
动态加载后端服务列表是通过DynamicServerListLoadBalancer类实现的,是BaseLoadBalance 的子类。
2、Ribbon 负载均衡策略
IRule接口包含3个方法:其中最重要的是choose()方法根据key获取后台服务,而setLoadBalancer()和getLoadBalance()方法来设置和获取ILoadBalancer。
RoundRobinRule 轮询策略
以轮询的方式一次请求不同的服务器,即每次调度执行i=(i+1)mod n 操作从而选择第i台服务器,mode取模操作。
RandomRule 随机策略
随机选择状态为可用的服务。
WeightedResponseTimeRule 权重策略
根据响应时间分配一个权重,响应时长越长,权重越小,被选中的可能行也低。
RetryRule重试策略
对选定的负载均衡策略执行重试机制,在一个可配置的时间段内,每当选择服务器不成功,就一直尝试选择一个可用的服务器。
AvailbilityFilteringRule策略
通过检查LoadBalanceStats中记录的各个服务器的运行状态,过来掉一直失败或者高并发的后端服务器。
BestAvailbleRule 最少连接策略
选择一个并发请求量最小的服务器,逐个考察服务器后选择其中活跃请求数最小的服务器。
ZoneAwareRule 区感知策略
区域感知负载均衡内置电路跳闸逻辑,可被配置基于区域亲和性来选择目标服务器实例。当本区域发生故障时快速完成切换。
@LoadBalanced 注解和RestTemplate
@LoadBalanced 注解就是个RestTemplate添加一种修饰,以便通过拦截的方式将代码执行流程导向负载均衡客户端LoadBalacneClient。
事实上,在Ribbon中存在一个LoadBalancerAutiConfiguration类,即LoadBalancer的自动配置类。在该类中首先维护了一个被@LoadBalance修饰的TestTemplate对象列表,在初始化的过程中,对目标RestTemplate增加一个LoadBalancerInterceptor用于实现拦截,而在他的拦截方法上本质是使用LoadBalanceClent来执行真正的负载均衡。
LoadBalanceClient的定义:
ServiceInstance choose(String serviceId)选择服务实例,根据传入的服务serviceId从负载均衡中挑选一个对应的服务实例。
T execute(String serviceId,LoadBalanceRequest request) 执行服务调用
URI reconstructURI(ServiceInstance instance,URI original) 构建URI。
本文地址:https://blog.csdn.net/kyh1003381120/article/details/107152536
上一篇: HTML父页面监听子页面关闭并回调方法
下一篇: EE基础_MVC架构_:)