OpenFeign远程调用负载均衡原理详解

article/2025/10/10 3:08:01

      SpringCloudAlibaba中使用OpenFeign时,默认的负载均衡策略是轮询调用。我们不做任何配置的时候,使用OpenFeign调用的时候,框架中是如何把负载均衡LoadBalanced和FeignClient结合到一起的?我们一起来分析一下。

1 DefaultFeignLoadBalancedConfiguration

位置:org.springframework.cloud.openfeign.ribbon.DefaultFeignLoadBalancedConfiguration

图1.1

项目启动的时候,会用LoadBalancerFeignClient注册一个feign.Client到ioc容器中。

FeignClientFactoryBean会生成一个@FeignClient注解的对应的service实例。

2 FeignClientFactoryBean

位置:org.springframework.cloud.openfeign.FeignClientFactoryBean

图2.1
图2.2

FeignClientFactoryBean实现了FactoryBean,我们都知道,在spring中实现了FactoryBean的类在spring生命周期过程中,spring会把 getObject() 返回的实例注册到ioc容器。方便以后实例的调用。

在spring生命周期过程中会调用getObject(),从ioc容器中获取到的client就是第一步注册到ioc容器的负载均衡实例LoadBalancerFeignClient,通过builder.client(client)到Feign.builder中。如图2.2。

图2.3
图2.4

现在我们可以分析图2.2最后一行。return targeter.target(this, builder, context, target)。以下图2.5和图2.6为FeignClientFactoryBean的getObject最终要初始化的实例。可以明显的看到创建了一个关于SynchronousMethodHandler.Factory的实例。第一个client参数就是上面已经注册好的LoadBalancerFeignClient的实例。

图2.5
图2.6

SynchronousMethodHandler 是个拦截器。项目初始话过程中,会为所有加了@FeignClient的service接口结合FeignClientFactoryBean生成对应接口的代理对象,客户端调用接口时会调用SynchronousMethodHandler的invoke方法。

图2.7
图2.8

 从图2.9可以看出调用servcie接口时是通过 client.execute(request, options) 调用的。client即为上面已经注册好的LoadBalancerFeignClient的实例。

图2.9

 3 探究client调用时如何做负载的?默认调用的哪种策略的负载?

跟进executeWithLoadBalancer方法。

图3.1

跟进submit方法

图3.2

可以看到图3.3中server为null的时候,执行selectServer()方法。跟进selectServer()。

图3.3

跟进getServerFromLoadBalancer()。

图3.4

继续跟进,可以看到 ILoadBalancer lb = getLoadBalancer(),可以获取到要负载的对应接口的服务列表。ILoadBalancer主要就是一个负载均衡器的接口,作用就是从被负载的服务列表里选出一个服务去调用。

下图为ILoadBalancer的实现类。默认调用的是ZoneAwareLoadBalancer。

图3.5

图3.5可以看出,Server svc = lb.chooseServer(loadBalancerKey),是从服务列表里面选择一个服务去调用。

跟进chooseServer()方法。默认会按照图3.6执行。

图3.6

继续跟进super.chooseServer(key)方法。红框中的rule有多种实现。图3.7调用的时候默认调用的是RoundRobinRule。即轮询策略。至此,我们已探究出FeignClient默认情况下会有负载均衡,且用的是netflix的ribbon的轮询策略。

图3.7
图3.8

结合图3.7从3.8中可以看出rule默认的就是 RoundRobinRule()。

4 我们如何自定义配置来修改默认的负载均衡策略呢?

位置:org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration。

加载 ribbonLoadBalancer 方法时会从ioc容器中查找注册好的Rule来通过参数注入到ZoneAwareLoadBalancer实例中。如果使用默认的,此时的rule默认使用的是ZoneAvoidanceRule,即依赖的rule为RoundRobinRule roundRobinRule = new RoundRobinRule()。

所以如果想定义一个需要的rule,只需要添加以下配置就可以了。

@Configuration
public class TestConfiguration {@Beanpublic IRule ribbonRule() {return new RandomRule();  //规则可以自己定义,也可以选择已有的}}

 上述配置代码添加后会注册到ioc容器,下图代码为初始化 ILoadBalancer 实例时通过参数注入的方式 把ioc容器中注入好的rule实例传递给这个方法,完成负载策略的实现。


http://chatgpt.dhexx.cn/article/HW6FOnfl.shtml

相关文章

负载均衡原理

开头先理解一下所谓的“均衡” 不能狭义地理解为分配给所有实际服务器一样多的工作量,因为多台服务器的承载能力各不相同,这可能体现在硬件配置、网络带宽的差异,也可能因为某台服务器身兼多职,我们所说的“均衡”,也就…

简谈docker swarm中负载均衡原理

同一集群内部的负载均衡模式 基于在swarm中创建节点即可分配内部域名的情况下: dnsrr 单纯通过内部DNS内部组件进行负载均,由于DNS缓存机制等问题,有局限性。VIP: 简单来讲是 (内部)DNSVIP(iptableipvs转发,ipvs有几…

LVS 负载均衡原理

一 简介 负载均衡集群是 Load Balance 集群。是一种将网络上的访问流量分布于各个节点,以降低服务器压力,更好的向客户端提供服务的一种方式。常用开源负载均衡软件有Nginx、LVS、Haproxy(ngnix和haproxy是七层负载均衡,LVS是四层负载均衡)&a…

Ribbon-负载均衡原理及部分源码

黑马程序员-Ribbon负载均衡源码 前提:服务提供者有多个服务集群,不然要是只有一个服务,还负载均衡个锤子! Ribbon负载均衡基本原理: 1、Ribbon会拦截Eureka Client客户端发出的http请求,获得服务名&#x…

01-Ribbon负载均衡原理

Ribbon负载均衡流程 总体流程 当我们直接用服务名端口在浏览器访问时,浏览器不认识这种地址所以当Ribbon得到一个请求是服务名端口的形式的时候就会取eureka-server中拉取服务eureka-server会返回一个服务列表给RibbonRibbon在服务列表中的挑选服务 详细流程 Ribb…

一文带你深入理解负载均衡原理

一、背景 "远古时期",单机计算机处理性能很低,一般我们会通过扩容机器配置资源,以便更好承载我们的应用,例如:当时的个人电脑,如果你想玩大型游戏,我们最直接的做法就是替换更好的CP…

Nginx详解(正向代理,反向代理,负载均衡原理)

Nginx详解(正向代理,反向代理,负载均衡原理) 文章目录 Nginx详解(正向代理,反向代理,负载均衡原理)1、Nginx概述:2. 反向代理3. 负载均衡 1、Nginx概述: ngi…

Zookeeper——分布式ID和负载均衡原理

摘要 本文主要是介绍zookeeper的除了大部分人都知道的特性意外的一些其他的特性,对于整体的了解一个分布式注册中心的实现具有完整的了解,同时利用zookeeper的其他的特性在工作中,有利于的更好的解决工作的问题。zookeeper相关的特性或许在解…

OpenFeign 整合 Nacos负载均衡原理

一.OpenFeign介绍 OpenFeign是实现微服务间调用的工具,功能包括编解码、构造http请求等。同时OpenFeign又集成了ribbon功能实现客户端负载均衡能力,Bibbon默认的客户端负载均衡能力是与Eurake集成,Nacos通过重写ribbon的ServerList功能实现ri…

负载均衡技术原理

参看文章: 快速理解高性能HTTP服务端的负载均衡技术原理 简介几种负载均衡原理 浅谈几种常用负载均衡架构 一篇读懂分布式架构下的负载均衡技术:分类、原理、算法、常见方案等 一、 引言 负载均衡(Load Balance)是指将负载(工作任…

Docker Swarm 内部服务发现和负载均衡原理

1. 集群环境准备 搭建三台服务器,并安装docker环境,并保证能正常连接互联网,后面会使用其他镜像做负载均衡测试。 192.168.104.79192.168.104.80192.168.104.81 首先修改hostname,便于后面区分当前操作所在机器:使用…

Spring Cloud - Ribbon 负载均衡原理、负载策略、懒加载

目录 ​编辑 一、Ribbon 负载均衡原理 1.1、前言 1.2、负载均衡的工作流程 二、负载均衡策略 2.1、策略原理 2.2、负载均衡自定义方式 三、Ribbon 加载方式 一、Ribbon 负载均衡原理 1.1、前言 ps:案例是上一章所讲的 “根据订单id查询订单的同时&#xff0…

Ribbon-负载均衡原理

负载均衡原理 SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的。 那么我们发出的请求明明是http://userservice/user/1,怎么变成了http://localhost:8081的呢? 源码跟踪 为什么我们只输入了service名称就可以访问了…

Nginx负载均衡原理与实战

Nginx 负载均衡原理与实践 本篇摘自《亿级流量网站架构核心技术》第二章 Nginx 负载均衡与反向代理 部分内容。 当我们的应用单实例不能支撑用户请求时,此时就需要扩容,从一台服务器扩容到两台、几十台、几百台。然而,用户访问时是通过如的…

Nginx负载均衡原理

Nginx简介 Nginx是通过反向代理实现的负载均衡。 什么是正向代理与反向代理? 正向代理就是,客户端通过一台代理服务器访问服务端。 反向代理就是,服务端通过代理服务器为客户端提供服务。 看起来似乎没有什么区别,举个例子。 …

负载均衡原理及算法

目录 背景概述原理分类按照软硬件分类硬件负载均衡软件负载均衡 按照地理结构分类本地负载均衡全局负载均衡 按照实现技术DNS负载均衡IP负载均衡链路层负载均衡混合型负载均衡 按照OSI层次二层负载均衡(数据链路层)三层负载均衡(网络层&#…

Ribbon负载均衡原理

Ribbon restTemplate相结合实现负载均衡,具体原理图详见以下截图: LoadBalancerClient 类执行具体的负载均衡,其继承于 LoadBalancerBase。LoadBalancerInterceptor 中注入了 LoadBalancerClient 对象,LoadBalancerClient执行具…

什么是负载均衡,负载均衡的原理解析是怎么样的

负载均衡对于很多大型企业来说,不管网游,商城,金融等业务,他的重要性无需多说,今天带来负载均衡的原理解析。 开头先理解一下所谓的“均衡”。 不能狭义地理解为分配给所有实际服务器一样多的工作量,因为…

负载均衡工作原理详解

负载均衡是由多台服务器以对称的方式组成一个服务器集合,每台服务器都具有等价的地位,都可以单独对外提供服务而无须其他服务器的辅助。通过某种负载分担技术,将外部发送来的请求均匀分配到对称结构中的某一台服务器上,而接收到请求的服务器独立地回应客户的请求。 均衡负…

负载均衡原理及实现

什么是负载均衡? 负载均衡( LoadBalance ),顾名思义就是把任务压力进行平衡的分摊到集群中各个操作单元(或机器)上,使得避免集群中部分机器压力过大而部分机器过于空闲。经过负载均衡,使得每个机器获取适合自己的处理能力负载。 …