欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

微服务架构实战学习笔记 第四章 Spring Cloud Netflix Ribbon与负载均衡

程序员文章站 2022-03-21 08:12:38
基于Spring Cloud Netflix Ribbon 实现负载均衡的,Ribbon从Eureka中获取所有注册的服务列表,通过负载均衡策略实现服务调用。调用结构图一、负载均衡所谓负载均衡(Load Balance)LB,...

基于Spring Cloud Netflix Ribbon 实现负载均衡的,Ribbon从Eureka中获取所有注册的服务列表,通过负载均衡策略实现服务调用。调用结构图

微服务架构实战学习笔记 第四章 Spring Cloud Netflix Ribbon与负载均衡

一、负载均衡

所谓负载均衡(Load Balance)LB,就是将请求分摊到多个操作单元上进行执行。示意图:

微服务架构实战学习笔记 第四章 Spring Cloud Netflix Ribbon与负载均衡

1、负载均衡的类型

(1)服务端负载均衡

微服务架构实战学习笔记 第四章 Spring Cloud Netflix Ribbon与负载均衡

2、客户端负载均衡

优势:不会出现集中式负载均衡所产生的瓶颈,但是由于所运行是信息都需要在多个负载均衡器之间进行传递,会在一定程度上加重网络流量负载。简单的说就是在客户端程序内部设定一个调度算法,计算出目标服务器的地址。

微服务架构实战学习笔记 第四章 Spring Cloud Netflix Ribbon与负载均衡

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查找服务

微服务架构实战学习笔记 第四章 Spring Cloud Netflix Ribbon与负载均衡

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 的子类。

微服务架构实战学习笔记 第四章 Spring Cloud Netflix Ribbon与负载均衡

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来执行真正的负载均衡。

微服务架构实战学习笔记 第四章 Spring Cloud Netflix Ribbon与负载均衡

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