iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >SpringCloud LoadBalancerClient 负载均衡原理解析
  • 276
分享到

SpringCloud LoadBalancerClient 负载均衡原理解析

2024-04-02 19:04:59 276人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录深入解析 LoadBalancerClient 接口源码:1、LoadBalancerClient 源码解析:2、ILoadBalancer 源码解析:  &

        LoadBalancerClient 是 SpringCloud 提供的一种负载均衡客户端,Ribbon 负载均衡组件内部也是集成了 LoadBalancerClient 来实现负载均衡。那么 LoadBalancerClient 内部到底是如何做到的呢?我们先大概讲一下 LoadBalancerClient 的实现原理,然后再深入源码中进行解析。

        LoadBalancerClient 在初始化时会通过 Eureka Client 向 Eureka 服务端获取所有服务实例的注册信息并缓存在本地,并且每10秒向 EurekaClient 发送 “ping”,来判断服务的可用性。如果服务的可用性发生了改变或者服务数量和之前的不一致,则更新或者重新拉取。最后,在得到服务注册列表信息后,ILoadBalancer 根据 IRule 的策略进行负载均衡(默认策略为轮询)。

        当使用 LoadBalancerClient 进行远程调用的负载均衡时,LoadBalancerClient 先通过目标服务名在本地服务注册清单中获取服务提供方的某一个实例,比如订单服务需要访问商品服务,商品服务有3个节点,LoadBalancerClient 会通过 choose() 方法获取到3个节点中的一个服务,拿到服务的信息之后取出服务IP信息,就可以得到完整的想要访问的IP地址和接口,最后通过 RestTempate 访问商品服务。

深入解析 LoadBalancerClient 接口源码:

1、LoadBalancerClient 源码解析:

        LoadBalancerClient 是 spring cloud 提供的一个非常重要的接口,它继承自 ServiceInstanceChooser 接口,该接口的实现类是 RibbonLoadBalanceClient,它们之间的关系如下图所示:

(1)LoadBalancerClient 接口源码:

首先我们开始追踪 LoadBalancerClient 源码:


public interface LoadBalancerClient extends ServiceInstanceChooser 
{
	<T> T execute(String serviceId, LoadBalancerRequest<T> request) throws ioException;
     
    <T> T execute(String serviceId, ServiceInstance serviceInstance, LoadBalancerRequest<T> request) throws IOException;
    
    URI reconstructURI(ServiceInstance instance, URI original);
}

        可以发现 LoadBalancerClient 接口继承了 ServiceInstanceChooser 接口,主要的方法为2个 execute() 方法,均是用来执行请求的。还有个 reconstructURI() 是用来重构URL的。

(2)ServiceInstanceChooser 接口源码:

继续查看 LoadBalancerClient 继承的 ServiceInstanceChooser 接口源码,具体如下:


public interface ServiceInstanceChooser 
{
	ServiceInstance choose(String serviceId);
}

        ServiceInstanceChooser 接口中的主要方法为 choose(),该方法用于根据服务的名称 serviceId 来选择其中一个服务实例,即根据 serviceId 获取ServiceInstance。

(3)RibbonLoadBalanceClient 实现类源码:

        接下来我们看看 LoadBalancerClient 的实现类 RibbonLoadBalanceClient,它用来执行最终的负载均衡请求。其中,RibbonLoadBalanceClient 的一个 choose() 方法用于选择具体的服务实例,其内部是通过 getServer() 方法交给 ILoadBalancer 完成的。我们先看下 RibbonLoadBalanceClient 里面几个重要实现方法的源码:

① 第一个:choose(),用来选择具体的服务实例。

@Override
	public ServiceInstance choose(String serviceId) {
		return choose(serviceId, null);
	}
	
	public ServiceInstance choose(String serviceId, Object hint) {
		Server server = getServer(getLoadBalancer(serviceId), hint);
		if (server == null) {
			return null;
		}
		return new RibbonServer(serviceId, server, isSecure(server, serviceId),
				serverIntrospector(serviceId).getMetadata(server));
	}

② 第二个:getServer(),获取实例。

protected Server getServer(ILoadBalancer loadBalancer) {
		return getServer(loadBalancer, null);
	}
	protected Server getServer(ILoadBalancer loadBalancer, Object hint) {
		if (loadBalancer == null) {
			return null;
		}
        // 最终通过 loadBalancer 去做服务实例的选择。
		// Use 'default' on a null hint, or just pass it on?
		return loadBalancer.chooseServer(hint != null ? hint : "default");
	}

        可以看到最终通过 loadBalancer 去做服务实例的选择。那我们下面就看下 loadBalancer 是怎么怎么实现服务实例的选择的?

(4)BaseLoadBalancer 源码:

        我们从上面能看到 ILoadBalancer 中的 chooseServer 方法里面默认值为 default,进入ILoadBalancer 实现类 BaseLoadBalancer 的 chooseServer() 看下:

         我们的 key 的值为“default”,那么这个 key 代表的是什么意思呢?进去 rule 对象里面看下:

        可以看到这个 rule 是 IRule 接口声明出来的,且默认定义的实现类是 RoundRobinRule(),也就是轮询策略。那我们接下来看下 IRule 接口:

(5)IRule 接口源码:

public interface IRule{
    
    public Server choose(Object key);
    
    public void setLoadBalancer(ILoadBalancer lb);
    
    public ILoadBalancer getLoadBalancer();    
}

        我们可以看到 IRule 接口定义了3个方法,choose() 是用来选择实例的,setLoadBalancer() 和 getLoadBalance() 用来设置和获取 ILoadBalancer 的。那么接下来 IRule 接口有多少个实现类:

 (1)随机策略 RandomRule:随机数选择服务列表中的服务节点Server,如果当前节点不可用,则进入下一轮随机策略,直到选到可用服务节点为止

(2)轮询策略 RoundRobinRule:按照接收的请求顺序,逐一分配到不同的后端服务器

(3)重试策略 RetryRule:在选定的负载均衡策略机上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用 subRule 的方式选择一个可用的server;

(4)可用过滤策略 PredicateBaseRule:过滤掉连接失败 和 高并发连接 的服务节点,然后从健康的服务节点中以线性轮询的方式选出一个节点返回

(5)响应时间权重策略 WeightedRespinseTimeRule:根据服务器的响应时间分配一个权重weight,响应时间越长,weight越小,被选中的可能性越低。主要通过后台线程定期地从 status 里面读取平均响应时间,为每个 server 计算一个 weight

(6)并发量最小可用策略 BestAvailableRule:选择一个并发量最小的服务节点 server。ServerStats 的 activeRequestCount 属性记录了 server 的并发量,轮询所有的server,选择其中 activeRequestCount 最小的那个server,就是并发量最小的服务节点。该策略的优点是可以充分考虑每台服务节点的负载,把请求打到负载压力最小的服务节点上。但是缺点是需要轮询所有的服务节点,如果集群数量太大,那么就会比较耗时。

(7)区域权重策略 ZoneAvoidanceRule:综合判断 server 所在区域的性能 和 server 的可用性,使用 ZoneAvoidancePredicate 和 AvailabilityPredicate 来判断是否选择某个server,前一个判断判定一个zone的运行性能是否可用,剔除不可用的zone(的所有server),AvailabilityPredicate 用于过滤掉连接数过多的Server。

同样的,如果我们也可以通过实现 IRule 接口来自定义一个负载均衡策略。

2、ILoadBalancer 源码解析:

        ILoadBalancer 是一个接口,该接口定义了一系列实现负载均衡的方法,LoadBalancerClient 的实现类 RibbonLoadBalanceClient 也将负载均衡的具体实现交给了 ILoadBalancer 来处理,ILoadBalancer 通过配置 IRule、IPing 等,向 EurekaClient 获取注册列表信息,默认每10秒向 EurekaClient 发送一次 “ping”,进而检查是否需要更新服务的注册列表信息。最后,在得到服务注册列表信息后,ILoadBalancer 根据 IRule 的策略进行负载均衡。ILoadBalancer 接口的实现类结果如下图所示:

        查看 BaseLoadBalancer 和 DynamicServerListLoadBalancer 源码,默认情况下实现了以下配置:

(1)IClientConfig clientConfig:用于配置负载均衡客户端,默认实现类是 DefaultClientConfigImpl。

(2)IRule rule:用于配置负载均衡的策略,默认使用的是 RoundRobinRule 轮询策略。

(3)IPing ping:用于检查当前服务是否有响应,从而判断当前服务是否可用,默认实现类是 DummyPing,该实现类的 isAlive() 方法返回值是 true,默认所有服务实例都是可用的。

(4)ServerList serverList:用于获取所有 Server 注册列表信息。通过跟踪源码会发现,ServerList 的实现类是 DiscoveryEnabledNIWSServerList,该类定义的 obtainServersViaDiscovery() 方法是根据 eurekaClientProvider.get() 方法获取 EurekaClient,再根据 EurekaClient 获取服务注册列表信息。EurekaClient 的实现类是DiscoveryClient,DiscoveryClient 具有服务注册、获取服务注册列表等功能。

(5)ServerListFilter filter:定义了根据配置过滤或者动态获取符合条件的服务列表,默认实现类是 ZonePreferenceServerListFilter,该策略能够优先过滤出与请求调用方处于同区域的服务实例。

到此这篇关于springCloud LoadBalancerClient 负载均衡原理的文章就介绍到这了,更多相关SprinGCloud LoadBalancerClient 负载均衡内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: SpringCloud LoadBalancerClient 负载均衡原理解析

本文链接: https://www.lsjlt.com/news/139072.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • SpringCloud LoadBalancerClient 负载均衡原理解析
    目录深入解析 LoadBalancerClient 接口源码:1、LoadBalancerClient 源码解析:2、ILoadBalancer 源码解析:  &...
    99+
    2024-04-02
  • SpringCloud Ribbon负载均衡原理
    目录一、Ribbon负载均衡原理1 负载均衡原理2 负载均衡策略(IRule接口)3 Ribbon默认懒加载4 总结:Ribbon负载均衡规则、自定义、饥饿加载一、Ribbon负载均...
    99+
    2024-04-02
  • 详解SpringCloud的负载均衡
    目录一.什么是负载均衡 二.负载均衡的简单分类 三.为什么需要做负载均衡 四.springCloud如何开启负载均衡 五.IRule 1.RandomRule:表示随机策略,它将从服...
    99+
    2024-04-02
  • 深入理解Java SpringCloud Ribbon 负载均衡
    目录前言1、抛出问题2、源码解析2.1、LoadBalancerIntercepor2.2、LoadBalancerClient2.3、负载均衡策略IRule2.4、总结3、负载均衡...
    99+
    2024-04-02
  • Spring Cloud负载均衡组件Ribbon原理解析
    目录前言一个问题引发的思考Ribbon的简单使用Ribbon 原理分析LoadBalancerAutoConfiguration 自动装配RestTemplateCustomizer...
    99+
    2024-04-02
  • SpringCloud负载均衡组件Ribbon源码分析
    本文小编为大家详细介绍“SpringCloud负载均衡组件Ribbon源码分析”,内容详细,步骤清晰,细节处理妥当,希望这篇“SpringCloud负载均衡组件Ribbon源码分析”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-07-02
  • springcloud负载均衡怎么搭建
    要搭建Spring Cloud负载均衡,你可以使用Ribbon作为负载均衡器。下面是搭建Spring Cloud负载均衡的步骤:1....
    99+
    2023-09-01
    springcloud 负载均衡
  • springcloud负载均衡怎么实现
    Spring Cloud提供了多种方式来实现负载均衡,常用的有以下几种方式:1. Ribbon:Ribbon是Spring Clou...
    99+
    2023-09-02
    springcloud 负载均衡
  • SpringCloud客户端负载均衡——Ribbon
      Ribbon——A ribbon is a long, narrow piece of cloth that you use for tying things together or as a decoration.  Ribbon是一...
    99+
    2023-06-02
  • springcloud负载均衡怎么配置
    Spring Cloud提供了多种负载均衡的方式,可以通过在配置文件中配置相关参数来进行配置。 使用Ribbon负载均衡器: 在...
    99+
    2023-10-26
    springcloud
  • springcloud怎么实现负载均衡
    Spring Cloud中实现负载均衡,可以使用Ribbon和Feign两种方式。1. Ribbon负载均衡:Ribbon是一个客户...
    99+
    2023-08-26
    springcloud
  • Nginx Tomcat负载均衡动静分离原理解析
    目录nginx实现负载均衡原理nginx动静分离原理nginx静态处理优势nginx+tomcat动静分离、负载均衡配置1.准备三台服务器,nginx作为负载均衡器,tomcat作为...
    99+
    2022-11-13
    Nginx Tomcat负载均衡动静分离 Nginx Tomcat
  • SpringCloud怎么实现Ribbon负载均衡
    这篇文章主要讲解了“SpringCloud怎么实现Ribbon负载均衡”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SpringCloud怎么实现Ribbon负载均衡”吧!Ribbon使用R...
    99+
    2023-06-30
  • springcloud负载均衡策略有哪些
    springcloud负载均衡策略有:1、Ribbon,它是一个基于Netflix Ribbon实现的一套客户端负载均衡工具;2、Fegin的配置,它是一个声明式的Web服务客户端,能够更加容易编写Web服务客户端,只要在api层建设一个接...
    99+
    2024-04-02
  • 云负载均衡原理是什么
    云负载均衡原理是将来自客户端的请求分发到多个服务器上,以实现负载均衡和提高系统的可用性和性能。云负载均衡的原理主要包括以下几个方面:...
    99+
    2023-09-01
    云负载均衡
  • 负载均衡的原理是什么
    负载均衡的原理是指将大量请求作业合理地分摊到多个操作单元上进行执行,从而解决网络中的高并发和高可用问题。具体内容如下:负载均衡是高可用网络基础架构的一个关键组成部分,有了负载均衡,我们通常可以将我们的应用服务器部署多台,然后通过负载均衡将用...
    99+
    2024-04-02
  • Nginx负载均衡原理与实现
    引言:随着网站访问量的不断增加,服务器的负载压力也越来越大。为了解决这个问题,负载均衡应运而生。Nginx作为一款高性能的开源反向代理服务器,被广泛应用于负载均衡的场景中。本文将介绍Nginx负载均衡的原理和实现方法,并附上具体的代码示例。...
    99+
    2023-10-21
    nginx 实现 负载均衡
  • zookeeper负载均衡原理是什么
    Zookeeper是一个分布式协调服务,而不是负载均衡器。它的主要功能是提供分布式系统中的数据管理和协调服务。然而,Zookeepe...
    99+
    2023-09-01
    zookeeper 负载均衡
  • 什么是SpringCloud客户端负载均衡
    本篇内容介绍了“什么是SpringCloud客户端负载均衡”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!S...
    99+
    2024-04-02
  • springcloud负载均衡策略怎么实现
    在Spring Cloud中,负载均衡策略的实现主要依赖于Ribbon和Eureka。Ribbon是Netflix开源的负载均衡组件...
    99+
    2023-09-27
    springcloud
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作