SpringCloud FeignClient 生成代理过程

【云原生&微服务十三】SpringCloud之深度源码剖析OpenFeign如何扫描所有的FeignClient SpringCloud之Feign实现声明式客户端负载均衡详细案例SpringCloud之OpenFeign实现服务间请求头数据传递(OpenFeign拦截器RequestInterceptor的使用)SpringCloud之OpenFeign的常用配置(超时、数据压缩、日志)SpringCloud之OpenFeign的核心组件(Encoder、Decoder、Contract)SpringBoot启动流程中开启OpenFeign的入口(ImportBeanDefinitionRegistrar详解)PS。 阅读详情

 

文章目录

1. @EnableFeignClients注解

@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
@Documented
@Import({FeignClientsRegistrar.class})
public @interface EnableFeignClients

我们使用@EnableFeignClients来开启feign的功能。从源码中看,该注解主要作用是通过@Import注解引入FeignClientsRegistrar类,追踪源码。

2. 注入类FeignClientsRegistrar.class

class FeignClientsRegistrar implements ImportBeanDefinitionRegistrar, ResourceLoaderAware, BeanClassLoaderAware, EnvironmentAware 

该类实现了ResourceLoaderAware,BeanClassLoaderAware,EnvironmentAware接口,在解析@import注解的过程中会将感兴趣的bean注入到该类中。实现了ImportBeanDefinitionRegisterar接口,通过重写registerBeanDefinitions方法来注册默认的feign配置类和注册feignClients对应的FeignClientFactoryBean到容器当中。看一下源码:

public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
        this.registerDefaultConfiguration(metadata, registry); // 注册@EnableFeignClients指定的默认配置类到容器
        this.registerFeignClients(metadata, registry);//注册feignClients对应的feignClientFactoryBean到容器
}
注册feignclients,实际上是其对应的工厂bean
public void registerFeignClients(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
        ClassPathScanningCandidateComponentProvider scanner = this.getScanner();
        scanner.setResourceLoader(this.resourceLoader);// 注解扫描器
        Map<String, Object> attrs = metadata.getAnnotationAttributes(EnableFeignClients.class.getName());
        AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter(FeignClient.class); // 设置扫描的目标注解
        Class<?>[] clients = attrs == null ? null : (Class[])((Class[])attrs.get("clients"));
        Object basePackages;
        if (clients != null && clients.length != 0) {
            .........

        Iterator var17 = ((Set)basePackages).iterator();

        while(var17.hasNext()) {
            String basePackage = (String)var17.next();
            Set<BeanDefinition> candidateComponents = scanner.findCandidateComponents(basePackage);
            Iterator var21 = candidateComponents.iterator();

            while(var21.hasNext()) {
                BeanDefinition candidateComponent = (BeanDefinition)var21.next();
                if (candidateComponent instanceof AnnotatedBeanDefinition) {
                    AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition)candidateComponent;
                    AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();
                    Assert.isTrue(annotationMetadata.isInterface(), "@FeignClient can only be specified on an interface");
                    Map<String, Object> attributes = annotationMetadata.getAnnotationAttributes(FeignClient.class.getCanonicalName());
                    String name = this.getClientName(attributes);
                    this.registerClientConfiguration(registry, name, attributes.get("configuration"));
                    this.registerFeignClient(registry, annotationMetadata, attributes);
                }
            }
        }

    }

注册方法:registerFeignClient

 private void registerFeignClient(BeanDefinitionRegistry registry, AnnotationMetadata annotationMetadata, Map<String, Object> attributes) 

3 FeignClientFactoryBean类

FeignClientFactoryBean 是一个工厂bean,提供了获取FeignClient代理bean的getObject方法,直接看一下方法源码:

 public Object getObject() throws Exception

4 生成feign代理类的,追踪源码到ReflectiveFeign。

public Object getObject() throws Exception {
        FeignContext context = (FeignContext)this.applicationContext.getBean(FeignContext.class);
        Builder builder = this.feign(context);
        ........
       
            Targeter targeter = (Targeter)this.get(context, Targeter.class);
            return targeter.target(this, builder, context, new HardCodedTarget(this.type, this.name, url));
        }
    }
        public <T> T target(Target<T> target) {
            return this.build().newInstance(target);
        }
 public <T> T newInstance(Target<T> target) {
        Map<String, MethodHandler> nameToHandler = this.targetToHandlersByName.apply(target);
        Map<Method, MethodHandler> methodToHandler = new LinkedHashMap();
        List<DefaultMethodHandler> defaultMethodHandlers = new LinkedList();
        Method[] var5 = target.type().getMethods();
        int var6 = var5.length;

        for(int var7 = 0; var7 < var6; ++var7) {
            Method method = var5[var7];
            if (method.getDeclaringClass() != Object.class) {
                if (Util.isDefault(method)) {
                    DefaultMethodHandler handler = new DefaultMethodHandler(method);
                    defaultMethodHandlers.add(handler);
                    methodToHandler.put(method, handler);
                } else {
                    methodToHandler.put(method, nameToHandler.get(Feign.configKey(target.type(), method)));
                }
            }
        }

        InvocationHandler handler = this.factory.create(target, methodToHandler);
        T proxy = Proxy.newProxyInstance(target.type().getClassLoader(), new Class[]{target.type()}, handler);
        Iterator var12 = defaultMethodHandlers.iterator();

        while(var12.hasNext()) {
            DefaultMethodHandler defaultMethodHandler = (DefaultMethodHandler)var12.next();
            defaultMethodHandler.bindTo(proxy);
        }

        return proxy;
    }

 

SpringCloud Netflix复习之OpenFeign OpenFeign的核心组件和实战,以及从源码层面对OpenFeign动态代理和处理请求进行验证 阅读详情

相关推荐

Spring Cloud OpenFeign 接口请求代理

在微服务架构下,各个服务之间通常会存在依赖关系,所以需要一个解决方案来进行相互调用。Spring Cloud 是由 Pivotal 团队提供的一系列框架,其中包括 Spring Boot、Spring Cloud Netflix 和 Spring Cloud Alibaba,其中 Spring Cloud Feign 提供了声明式 Web 服务客户端。Feign是一个声明式的Web Service客户端,它使得编写Web Service客户端变得简单。

AI天才研究院 1664

用MATLAB在地图上标出34个中国省会城市:一份完整的数据处理与可视化教程

本文详细介绍了如何使用MATLAB进行地理数据可视化,从34个中国省会城市的经纬度数据处理到精美地图的绘制,涵盖了基础地图绘制、高级样式定制、交互功能与空间分析等全流程。通过多种MATLAB工具和方法,帮助用户快速掌握专业级的地理数据可视化技术。

weixin_30432579的博客 406

OpenClaw 聪明设置指南(真实可用方案)

本文介绍了OpenClaw AI系统的配置与优化指南,主要内容包括:1)基础配置,涵盖初始化流程、安全设置和配置文件位置;2)模型分层策略,推荐主力模型与降级方案;3)性能优化,包括推理加速和内存管理;4)智能提升方法,如人格定义和技能安装;5)高级功能如多Agent协同和Token优化。文章提供了详细的配置命令和参数说明,帮助用户根据需求平衡性能与成本,实现高效AI助手部署。

qq_43344878的博客 709

Feign接口单独设置代理访问地址

feign okhttp

qq_25379811的博客 2147

跟着Cell学单细胞转录组分析(五):单细胞转录组marker基因鉴定及细胞群注释

书接上回(跟着Cell学单细胞转录组分析(四):单细胞转录组测序UMAP降维聚类)。完成数据降维和细胞聚类后,最主要的环节和工作就是确定各个细胞群,明确是什么类型的细胞,正群的细胞定群很关键,涉及到整个研究,所以这一步宁愿多费时间,也不要出错。当然,这也不是一蹴而就的,需要反复的确认。 要确定各个群是什么细胞,首先需要了解细胞群的marker基因,因为不同类型的细胞突出 表达的基因也是不同的。这里使用FindAllMarkers鉴定各个细胞群的高表达基因。 DefaultAssay(scedata)

qq_42090739的博客 1万+

endnote让参考文献整整齐齐

这篇文章主要是针对利用 endnote 插入参考文献时,参考文献第一行和后面的行对不齐的问题 下面是示意图 可以看到我们的参考文献对的整整齐齐的,比较好看。 下面介绍具体步骤 1、打开endnote。编辑我们使用的参考文献样式。我这儿是叫 ZZ_MODIFIED_GEEBINF 复制 2、找到布局,每个参考开头,将光标放在在参考开头后面,点插入字段,制表符 3、右下角悬挂式输出哪儿选择全部段...

雾隐雾现的至渝博客 5万+

通過OkHttpClient給FeignClient添加網絡代理

背景:localhost調平安的ekyc接口,網絡的關係需要添加代理才能成功,額日期額我們堅持要用feignClient來做接口調用,於是最後只能給FeignClient加網絡代理了,但uat的測試場和PROD是不需要這麽做的,所以後來又考慮通過spring boot 條件裝配來定義需要代理和不需要代理的feignClient的bean對象。這裏就説説代理怎麽做 貼代碼: import feign.Feign; import okhttp3.OkHttpClient; import org..

萌宝的程序人生 980

VMD分子可视化实战:5个隐藏技巧让你的科研图像秒变顶刊级别

本文深入探讨了VMD分子可视化软件在科研图像美化中的5个高阶技巧,旨在帮助研究者将分子结构图提升至顶刊级别。内容涵盖原子色彩与材质的艺术化定制、沉浸式分子环境构建、专业构图与视角控制、数据驱动的动态可视化以及自动化工作流建立,通过精细的色彩映射、光照调整、周期性边界展示和脚本自动化,显著增强图像的科学叙事性与视觉冲击力。

weixin_29240343的博客 420

Spring Cloud FeignClient 代理方式探究

背景 每次跟人讲起 feignClient 的大致原理,我都是含糊其词: 程序启动时,Spring 会为每个加了@FeignClient(name=”provider”)注解的接口生成一个代理 bean, 名称为注解的 name 属性(本例为provider),方法就为接口的方法列表。等你执行接口某个方法的时候,代理的方法就会帮你做请求和响应的参数拼接以及 HTTP 请求 直到最近被一个同事打破砂锅问到底,我反倒一脸懵逼。虽然上面那套说辞大体上能自圆其说,但是真相还是需要亲身去探索。 程...

ywb201314的专栏 803

Fabric学习笔记(一)- Centos 7下的Fabric 2.3.2环境搭建

一、 环境准备 (一)、在VMware Workstation 15 安装一个Centos 7的虚拟环境,切换到图形化界面: 参考文章链接:Centos 7切换图形化界面 其中可能在yum groupinstall "X Window System"时会报错:Cannot find a valid baseurl for repo: base/7/x86_6,参考这篇文章即可:安装图形化界面报错解决 (二)、打开终端,安装所需的库: 切换root用户,输入命令:su root yum更新,输入命令:y

茕夜 2611

别再只插线了!用示波器‘偷看’USB-C PD协议握手全过程(附BMC/4B5B编码解析)

本文详细介绍了如何使用示波器捕获并解码USB-C PD协议的握手过程,包括BMC/4B5B编码的解析技巧。从硬件配置到波形分析,再到协议注入,为工程师提供了一套完整的实战解码手册,帮助深入理解PD协议的工作原理。

weixin_42526417的博客 402

FeignClient代理类创建过程分析

前言 基于Feign进行微服务调用时,我们只需要定义一个接口,在加上一些注解,即可。在使用过程中,代码隐式的为我们针对于接口生成了代理类,让我们只需关心业务处理。那么FeignClient代理类是如何生成的呢?本篇博文将进行解答。 一、Feign使用 日常我们大致通过如下方式,基于FeignClient注解,进行微服务请求。基于FeignClient注解,Spring Cloud会我们生成该接口的代理类,从而基于类似声明式方式,进行服务请求。 @FeignClient(name = "quelongjian

weixin_46053046的博客 921

am62x A53与R5F通信

AM62x是Ti的一款异构多核芯片。remoteproc驱动,硬编码(写死)了R5F/M4F固件的名字,这样驱动启动时,就会找硬件编码的固件,下面是其对应关系。值得注意的是,linux内核中的M4F remoteproc驱动启动M4F,而linux内核中的R5F remoreteproc驱动不启动R5F,相反,它attach到已经在boot阶段启动的R5F固件上。在/lib/firmware的真实固件名:,而我们生成的固件名如下所示,没有直接对应的,经确认,.out文件就是我们需要的,重命名后即可。

鹰之翔 1358

源码篇--SpringCloud-OpenFeign--代理类的生成

我们知道SpringCloud-OpenFeign 是通过jdk 的动态代理为接口生成代理对象,从而由代理对象完成请求的访问,下面具体看下在Spring 中 是如何完成对接口的代理的;通常在启动类中我们需要添加 @EnableFeignClients 注解来开启feign 接口的扫描;Class<?Class<?Class<?

拽着尾巴的鱼儿的博客 1467

基于STM32L4XX、HAL库的ICP-10111压力传感器驱动程序设计

define ICP10111_CMD_MEAS_ULN 0x7866 // 超低噪声模式。#define ICP10111_CMD_MEAS_LP 0x609C // 低功耗模式。#define ICP10111_CMD_MEAS_LN 0x70DF // 低噪声模式。#define ICP10111_CMD_MEAS_N 0x6825 // 正常模式。ICP10111_MODE_LN, // 低噪声。// 等待测量完成(根据模式不同等待时间不同)

zhusl6688的博客 416

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

springcloud openfeign原理-FeignClient初始化以及代理对象的创建

必备知识:ImportBeanDefinitionRegistrar方式实现Bean的动态装载 在ImportBeanDefinitionRegistrar方式实现Bean的动态装载 一文中,@EnableFeignClients 这个注解的作用是,开启openfeign客户端

weixin_41300437的博客 2618

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

图文Debug一步一步带你看清SpringCloud OpenFeign源码执行过程

文章目录版本Spring Cloud openfeign 使用源码分析1. 开启Feign自动装配注解 @EnableFeignClients2. 配置类 FeignClientsRegistrar.class总结 这里是weihubeats,觉得文章不错可以关注公众号小奏技术,文章首发。拒绝营销号,拒绝标题党 版本 Version: spring-cloud-openfeign-core:3.0.1 Spring Cloud openfeign 使用 我们首先看看Spring Cloud openfe

念念不忘,必有回响 1657

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

SpringCloud之Feign原理与源码分析

Feign原理 - 源码解析 本文基于SpringCloud版本:Hoxton.SR12(2.2.9.RELEASE) 一、扫描FeignClient生成代理Bean放入Spring容器 1.@EnableFeignClient注解导入注册类。 @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @Documented @Import({FeignClientsRegistrar.class}) public @interface

优快云__luo的博客 450

springcloud feign服务调用

feign/openFeign 解决问题:解决集群时,接口地址的管理,以及如何进行负载均衡。 一、简介 feigin是一种模板化,声明式的http客户端,feign可以通过注解绑定到接口上来简化Http请求访问。当然我们也可以在创建Feign对象时定制自定义解码器(xml或者json等格式解析)和错误处理。 二、快速入门 feign底层是使用了ribbon作为负载均衡的客户端,而ribbon的负载均衡也是依赖于eureka 获得各个服务的地址。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直

zengqingfa123的博客 241

Spring Cloud OpenFeign的源码剖析

本文深入OpenFeign的源码,分析了OpenFeign如何帮我们动态生成FeignClient的实现类,如何整合Ribbon和Hystrix实现负载均衡和熔断降级。

施勇 636

再学一下Feign的原理

Feign是Spring Cloud Netflix组件中的一个轻量级Restful的HTTP服务客户端,它简化了服务间调用的方式。Feign是一个声明式的web service客户端.它的出现使开发web service客户端变得更简单.使用Feign只需要创建一个接口加上对应的注解, 比如@FeignClient注解。Feign是一种声明式、模板化的HTTP客户端。

zk1z23456789的博客 1565

【微服务】15 SpringCloud之深度源码剖析OpenFeign如何为FeignClient生成动态代理类

1、OpenFeign如何为FeignClient生成动态代理类? 2、SpringMvcContract组件如何解析FeignClient中标注了SpringMVC注解的方法?

健身变秃,coding变强 2935

【SpringCloud原理】OpenFeign之FeignClient动态代理生成原理

前段时间我发布两篇关于nacos源码的文章,一篇是聊一聊nacos是如何进行服务注册的,另一篇是一文带你看懂nacos是如何整合springcloud -- 注册中心篇。今天就继续接着剖析SpringCloud中OpenFeign组件的源码,来聊一聊OpenFeign是如何工作的。至于其他组件的原理,我也会不断的剖析和更新,有需要的同学关注一下微信公众号 三友的java日记。 一、@EnableFeignClinets作用源码剖析 我们都知道,要使用feign,必须要使用@EnableFeignClin

weixin_45630885的博客 5179

SpringCloud原理:OpenFeign之FeignClient动态代理生成原理

今天我们深入剖析一下SpringCloud中OpenFeign组件的源码,来聊一聊OpenFeign是如何工作的。一、@EnableFeignClinets作用源码剖析我们都知道,要使用feign,必须要使用@EnableFeignClinets来激活,这个注解其实就是整个feign的入口,接下来我们着重分析一下这个注解干了什么事。@Retention(Retention...

Java知音 1179

「SpringCloud原理」OpenFeign之FeignClient动态代理生成源码

前面时候我发布两篇关于nacos源码的文章,一篇是聊一聊nacos是如何进行服务注册的,另一篇是一文带你看懂nacos是如何整合springcloud -- 注册中心篇。今天就继续接着剖析SpringCloud中OpenFeign组件的源码,来聊一聊OpenFeign是如何工作的。一、@EnableFeignClinets作用源码剖析我们都知道,要使用feign,必须要使用@EnableFeignClinets来激活,这个注解其实就是整个feign的入口,接下来我们着重分析一下这个注解干了什么事。 这个

Firstlucky77的博客 602

springcloud-alibba之FeignClient

springcloud阿里巴巴组件之feignclient组件的详细概述

tom有cat 1405
上一篇: Java - Map 简要笔记
下一篇: SpringBoot自动配置的加载流程及实现原理
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

仰望星空@脚踏实地

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值