【OpenFeign】【源码+图解】【三】FeignClient的配置信息

news2025/2/1 4:15:46

【OpenFeign】【源码+图解】【二】注册OpenFeign接口的实例

目录

  • 4. FeignClient的配置信息
    • 4.1 FeignClientFactoryBean
    • 4.2 FeignClientFactoryBean.getObject()
      • 4.2.1 FeignContext
      • 4.2.2 Feign.Builder
        • 4.2.2.1 Bean的配置方式
          • YML
          • @FeignClient.configuration
          • @EnableFeignClients.defaultConfiguration
      • Targeter

4. FeignClient的配置信息

上一节中利用FeignClientFactoryBean创建@FeignClient接口的实例client,使用的时候通过**FeignClientFactoryBean.getObject()获得。本节分两步介绍:1、认识FeignClientFactoryBean ** 2、FeignClientFactoryBean.getObject()

4.1 FeignClientFactoryBean

先看下它的类图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GcWQyCHO-1671541668520)(C:\Lanna\技术经验\Spring\OpenFeign\OpenFeign\2\1.png)]

先看下它的属性,它的属性基本是从**@FeignClient的属性赋值过来的,参考前面一节;再看它实现的接口,其中FactoryBean**的getObject则是分析的重点

4.2 FeignClientFactoryBean.getObject()

先看下其总体流程图

在这里插入图片描述

整个流程主要分两部分

  1. 从FeignContext获取各种beans
  2. 将beans赋值给Feign.Builder,主要是承接yml文件中feign的配置,或者@FeignClient.configuration的配置,或者@EnableFeignClients.defaultConfiguration
  3. 通过工具类Targeter类创建instance

接下来我们逐一分析

4.2.1 FeignContext

在这里插入图片描述

如果看过前面关于LoadBalance的3.2节文章就会了解NamedContextFactory,这里不再详细分析。

对于FeignContext它是在Spring启动的时候通过FeignAutoConfiguration注入容器的
看下FeignAutoConfiguration

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(Feign.class)
@EnableConfigurationProperties({ 
    FeignClientProperties.class,  // yml文件中feign.client.*的配置
    FeignHttpClientProperties.class, // yml文件中feign.httpclient.*的配置
	FeignEncoderProperties.class }) // yml文件中feign.encoder.*的配置
public class FeignAutoConfiguration {
    @Autowired(required = false)
    // configurations即@EnableFeignClients.defaultConfiguration和@FeignClient.configuration,参考FeignClientsRegistrar的流程图
	private List<FeignClientSpecification> configurations = new ArrayList<>();

	@Bean
	public FeignContext feignContext() {
		FeignContext context = new FeignContext();
        // 设置configurations
		context.setConfigurations(this.configurations);
		return context;
	}
}

FeignClientFactoryBean.getObject()方法中使用了大量的getInstance(String contextName, String beanName, Class<T> type)方法,过程不再详述(参考LoadBalance的3.2节),大致过程是:

  1. 首次根据configurations创建名为contextName的ApplicationContext,并存放到FeignContext,之后直接取用
  2. 从ApplicationContext获取beanName的bean

FeignClientFactoryBean.getObject()主要是获取了以下的类:

  1. Feign.Builder
  2. Client
  3. FeignBuilderCustomizer
  4. Targeter
  5. FeignClientConfigurer
  6. FeignLoggerFactory
  7. Encoder(SpringEncoder)
  8. Decoder(OptionalDecoder)
  9. Contract(SpringMvcContract)
  10. Request.Options
  11. Logger.Level
  12. Retryer
  13. ErrorDecoder
  14. FeignErrorDecoderFactory
  15. RequestInterceptor
  16. QueryMapEncoder
  17. ExceptionPropagationPolicy
  18. Capability

这些类可以自配置

4.2.2 Feign.Builder

先看下它的类图
在这里插入图片描述

FeignClientFactoryBean.getObject()中对Feign.Builder赋值结束后默认的值如下

在这里插入图片描述

对于Builder里面的类,如RequestInterceptor等的默认配置是通过下列Configuration注入的

在这里插入图片描述

当然,也可以自己配置,实现相应的接口,然后通过yml文件配置,如下图

在这里插入图片描述

4.2.2.1 Bean的配置方式

Contract为例,三种方式:YML、@FeignClient.configuration、@EnableFeignClients.defaultConfiguration

YML

在这里插入图片描述

@FeignClient.configuration
  1. 实现接口

    public class MyContract implements Contract {
        @Override
        public List<MethodMetadata> parseAndValidateMetadata(Class<?> targetType) {
            return new ArrayList<>();
        }
    }
    
  2. 添加配置文件

    public class MyConfiguration {
        @Bean
        @Primary
        MyContract myContract() {
            return new MyContract();
        }
    }
    
  3. 添加到@FeignClient

    @FeignClient(value = "product", configuration = MyConfiguration.class)
    public interface ProductFeignClient{
    }
    
@EnableFeignClients.defaultConfiguration
  1. 实现接口

    public class MyDefaultContract implements Contract {
        @Override
        public List<MethodMetadata> parseAndValidateMetadata(Class<?> targetType) {
            return new ArrayList<>();
        }
    }
    
  2. 添加配置文件

    public class MyDefaultConfiguration {
    
        @Bean
        MyDefaultContract defaultContract() {
            return new MyDefaultContract();
        }
    }
    
  3. 添加到@FeignClient

    @SpringBootApplication
    @EnableFeignClients(defaultConfiguration = MyDefaultConfiguration.class)
    public class FeignClientApplication {
    
    	public static void main(String[] args) {
    		SpringApplication.run(FeignClientApplication.class, args);
    	}
    }
    

注意

  1. 注入的顺序:YML > @FeignClient.configuration , @EnableFeignClients.defaultConfiguration
  2. @FeignClient.configuration与@EnableFeignClients.defaultConfiguration同时使用时要注明谁是Primary,否则会报错

Targeter

先看下Targeter的类图,了解下功能

在这里插入图片描述

Targeter的作用主要是中转站,默认实现是DefaultTargeter,先看下FeignClientFactoryBean.getObject()中的源码调用

public class FeignClientFactoryBean
		implements FactoryBean<Object>, InitializingBean, ApplicationContextAware, BeanFactoryAware {
    @Override
	public Object getObject() {
        // 1
		return getTarget();
	}
    
    <T> T getTarget() {
        ......
        if (!StringUtils.hasText(url)) {
            ......
            // 2
			return (T) loadBalance(builder, context, new HardCodedTarget<>(type, name, url));
		}
    }
    
    protected <T> T loadBalance(Feign.Builder builder, FeignContext context, HardCodedTarget<T> target) {
		Client client = getOptional(context, Client.class);
		if (client != null) {
			builder.client(client);
			applyBuildCustomizers(context, builder);
            // 获取Targeter实例,默认DefaultTargeter
			Targeter targeter = get(context, Targeter.class);
            // 这里的target为HardCodedTarget
            // 3 下一章节的入口
			return targeter.target(this, builder, context, target);
		}
        ......
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/104517.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

5.Node中的模块

目录 1 模块化 2 加载模块 3 模块作用域 4 module对象 4.1 初识module对象 4.2 module.exports 4.2.1 module.exports与require() 4.2.2 添加变量与方法 5 exports对象 5.1 初识exports对象 5.2 添加变量与方法 1 模块化 向我们之前引入的 fs,path,htt…

Baklib|为什么说企业需要重视客户体验?

数十年来&#xff0c;人们都在寻求使自己的品牌获得成功的秘密&#xff0c;企业和品牌也在不断地想着怎样在竞争中胜出&#xff0c;从而获得顾客的青睐。 有些公司已经竭尽全力争取顾客的信赖&#xff0c;并竭力争取更多的市场份额。 但是&#xff0c;即便那些著名的公司不会…

5G无线技术基础自学系列 | RF优化原理

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 RF优化主要是依据各种收集到的数据&…

C++ Primer 第五章 Statements

C Primer 第五章 Statements5.3. Conditional Statements5.3.2. The switch Statement5.4. Iterative Statements5.4.3. Range for Statement5.6. try Blocks and Exception Handling5.6.1. A throw Expression5.6.2. The try Block5.6.3. Standard Exceptions5.3. Conditional…

【传递窗】洁净区与非洁净室之间的传递

广州特耐苏净化设备有限公司详细介绍&#xff1a;传递窗分类及安装与使用方法 传递窗是一种洁净室的辅助设备&#xff0c;用于不同的洁净区之间&#xff0c;洁净区与非洁净区之间小物件的传递&#xff0c;具有气闸的作用&#xff0c;防止非洁净的空气进入洁净室。同时&#xf…

git cherry-pick 同步修改到另一个分支

我们在开发中有时会遇到&#xff0c;需要将另一个分支部分修改同步到当前分支。 如下图&#xff0c;想把 devA 分支中 commit E 和 F&#xff0c;同步到下面绿色的 devB 分支中。 这时候就可以使用 git cherry-pick 来完成这项任务。 &#xff08;cherry-pick 有筛选、精选的…

音视频开发——H265码流解析

概述 H.265技术的应用 编码技术主要运用于视频播放设备、软件应用以及拍摄、录制视频的设备。人们最熟悉的莫过于PPS网络视频播放器。在PC屏客户端产品上面&#xff0c;PPS已经于2013年初推出了基于H.265标准的高清视频&#xff0c;并命名“臻高清”为自己的高清品牌。同时 P…

极限一个月,突破Java高频面试题和核心技术,跳槽涨薪6K

前言 先说一下我的情况&#xff0c;双非本科毕业后就在几家小公司工作了3年&#xff0c;5月份的时候有去大厂面试过&#xff0c;结果都是凉凉&#xff0c;下面会跟大家分享一下我的经验以及建议。 有的朋友可能会认为学历是自己的问题&#xff0c;面试官连简历都不会看。其实…

Java Stream 编程

Java Stream 编程 教程&#xff1a;https://www.bilibili.com/video/BV1te411w722 1. 不可变集合 1.1 不可变集合应用场景 元数据&#xff0c;只允许查询的数据集合 1.2 创建不可变集合 List、Set、Map 接口中的静态方法 of() List<String> list List.of("张…

SpringCloud 2021版本教程:使用nacos作为注册中心和配置中心(2021版本+Boot2.7.6)

目录 前言 系列文章目录 一、什么是Nacos 1、nacos架构原理 2、nacos、eureka、zookeeper的区别 1、参考博客&#xff0c;写得很详细通俗易懂&#xff1a;一文说清eureka、zookepeer、nacos三者的关系 - 知乎 2、三者区别&#xff1a; 3、CAP原理&#xff1a; 二、项目…

MyBatis八股文

1、什么是MyBatis框架&#xff1f; MyBatis 是一款优秀的持久层框架&#xff0c;它支持定制化 SQL、存储过程以及高级映射&#xff0c;它内部封装了jdbc&#xff0c;不需要我们再写JDBC连接、使开发者只需要关注sql语句本身和业务&#xff0c;而不需要花费精力去处理加载驱动、…

【数据结构】基础:常见排序算法

【数据结构】基础&#xff1a;常见排序算法 摘要&#xff1a;本文将从排序的概念及其附属概念出发&#xff0c;再对排序算法进行分类&#xff0c;并对其思想与实现进行说明&#xff0c;最后对各个算法进行总结。 文章目录【数据结构】基础&#xff1a;常见排序算法一. 排序的概…

K8s CRD 和 Operator 来进行 NebulaGraph 的部署

中间件及运维管理 我们基于 K8s CRD 和 Operator 来进行 NebulaGraph 的部署&#xff0c;同时通过服务集成到现有的部署配置页面和运维管理页面&#xff0c;来获得对 Pod 的执行和迁移的控制能力。基于 sidecar 模式监控、收集 NebulaGraph 的核心指标并通过 Telegraf 发送到携…

【第十四章 错误日志,二进制日志,查询日志,慢查询日志】

第十四章 第十四章 错误日志&#xff0c;二进制日志&#xff0c;查询日志&#xff0c;慢查询日志 1.错误日志&#xff1a; ①错误日志是 MySQL 中最重要的日志之一&#xff0c;它记录了当 mysqld 启动和停止时&#xff0c;以及服务器在运行过程中发生任何严重错误时的相关信息…

Servlet还不会?那就看这篇文章吧

一. Servlet是什么? Servlet是Server Applet的简称&#xff0c;也就是服务程序。当然&#xff0c;杨哥习惯称它为"服务连接器"。 像上面这么说&#xff0c;大家可能会有所疑惑&#xff1a;什么是服务程序&#xff1f;可能有些人对这个还是不太懂&#xff0c;那么接下…

我国汽车配件行业需求空间较大 国产品牌配件市场份额逐渐提升

根据观研报告网发布的《2022年中国汽车配件行业分析报告-行业全景调研与发展战略咨询》显示&#xff0c;根据Markline全球汽车信息平台统计&#xff0c;2020年&#xff0c;全球整车市场产量规模约为7769.80万辆。对于整车厂而言&#xff0c;在委托上游制造商按照要求供应零部件…

软文营销对企业品牌推广的好处有哪些?

众所周知&#xff0c;互联网改变了我们的生活&#xff0c;他的横空出世一度改变我们的工作模式&#xff0c;又跟我们生活息息相关。如今&#xff0c;随着网络的深入发展&#xff0c;网络对企业的营销模式也产生了巨大的改变。其中网络软文营销成为了当下众多企业的主要营销手段…

Web漏洞扫描-Appscan安装配置及扫描

软件介绍 AppScan 是一种 Web 应用程序安全扫描工具&#xff0c;可帮助组织识别和修复其 Web 应用程序中的漏洞。它结合使用自动和手动测试技术来识别漏洞&#xff0c;例如跨站点脚本 (XSS)、SQL 注入和不安全的文件上传等。 AppScan 可用于在开发生命周期的不同阶段扫描 Web…

Unity 摄像机

摄像机分为两种 &#xff08;1&#xff09;透视摄像机 &#xff08;2&#xff09; 正交摄像机 一般3D游戏使用的透视多一点&#xff0c;2D游戏使用正交多一点。 相机参数 清除标记&#xff1a; &#xff08;1&#xff09;天空盒 &#xff08;2&#xff09;仅深度&#xff…

Problem J. Prime Game(数学 贡献)[2018-2019 ACM-ICPC, Asia Nanjing Regional Contest]

题目如下&#xff1a; 题解 or 思路 我们可以发现暴力去求解是无法完成的 O(n2)O(n^2)O(n2) 我们可以从贡献出发&#xff0c;计算每一个位置上的质因子所做的贡献 我们可以先通过分解质因子&#xff0c;记录每一个质因子的位置&#xff0c;在这里使用 vectorvectorvector 容器…