一、业务需求

在Spring Cloud的项目中,A服务使用Feign调用B服务的某个接口,如果需要传递全局认证token或参数,在方法参数里面加相应字段的方式显然是不可取的。

首先想到的是AOP方式,使用切面拦截Feign方法,在AOP切面里面向方法参数里面添加数据,Feign方法执行完成之后,从响应对象里面获取返回的数据,这样的方式可以解决数据的传递和接收,但也必将需要方法参数和响应对象的支持,与业务耦合,并不是合理的架构实现方案。

如果有某种机制可以拦截到Feign的请求对象和响应对象,便可以获取到请求头和响应头,就可以使用请求头和响应头来传递数据。

经过一番调查,了解到Feign的RequestInterceptor可以拦截到Feign请求,可以获取到请求对象和请求头,但是RequestInterceptor无法处理响应。

于是又进行调查,得知解码器Decoder是对响应进行解码的组件,可以获取到响应对象和响应头。

在调查过程中,还有另外的收获:FeignClientsConfiguration类。

二、FeignClientsConfiguration类

Feign默认配置类是FeignClientsConfiguration类,该类定义了Feign默认的编码器、解码器、所使用的契约等。

Spring Cloud允许通过注解@FeignClient的configuration属性自定义Feign配置,自定义配置的优先级比FeignClientsConfiguration要高。

这个类的核心代码如下:

 1 @Configuration
2 public class FeignClientsConfiguration {
3
4 @Autowired
5 private ObjectFactory<HttpMessageConverters> messageConverters;
6
7 @Autowired(required = false)
8 private List<AnnotatedParameterProcessor> parameterProcessors = new ArrayList<>();
9
10 @Autowired(required = false)
11 private List<FeignFormatterRegistrar> feignFormatterRegistrars = new ArrayList<>();
12
13 @Autowired(required = false)
14 private Logger logger;
15
16 @Bean
17 @ConditionalOnMissingBean
18 public Decoder feignDecoder() {
19 return new OptionalDecoder(new ResponseEntityDecoder(new SpringDecoder(this.messageConverters)));
20 }
21
22 @Bean
23 @ConditionalOnMissingBean
24 @ConditionalOnMissingClass("org.springframework.data.domain.Pageable")
25 public Encoder feignEncoder() {
26 return new SpringEncoder(this.messageConverters);
27 }
28
29 @Bean
30 @ConditionalOnMissingBean
31 public Contract feignContract(ConversionService feignConversionService) {
32 return new SpringMvcContract(this.parameterProcessors, feignConversionService);
33 }
34
35 @Bean
36 @Scope("prototype")
37 @ConditionalOnMissingBean
38 public Feign.Builder feignBuilder(Retryer retryer) {
39 return Feign.builder().retryer(retryer);
40 }
41 }

三、Feign请求拦截器

参考FeignClientsConfiguration类,我们可以编写一个configuration类,注入自定义的RequestInterceptor实现类对象,在apply(RequestTemplate requestTemplate)方法中获取到请求RestTemplate对象,使用RequestTemplate对象设置请求参数、添加请求头。

示例如下:

1 @Configuration
2 public class MyConfig {
3 @Bean("myInterceptor")
4 public RequestInterceptor getRequestInterceptor() {
5 return new MyClientInterceptor();
6 }
7 }

MyClientInterceptor类:

1 class MyClientInterceptor implements RequestInterceptor {
2 @Override
3 public void apply(RequestTemplate requestTemplate) {
4 requestTemplate.query("name", "Allen");
5 requestTemplate
6 .header("token", "token")
7 .header("id", id);
8 }
9 }

四、Feign解码器

1、解码器概述

Feign解码器负责对响应进行解码,返回符合Feign接口需求的对象。

我们可以参考FeignClientsConfiguration类中的方式编写和注入自定义的解码器。

1 @Bean
2 @ConditionalOnMissingBean
3 public Decoder feignDecoder() {
4 return new OptionalDecoder(
5 new ResponseEntityDecoder(new SpringDecoder(this.messageConverters)));
6 }

2、继承SpringDecoder自定义解码器

 1 class TraceDecoder extends SpringDecoder {
2
3 TraceDecoder(ObjectFactory<HttpMessageConverters> messageConverters) {
4 super(messageConverters);
5 }
6
7 @Override
8 public Object decode(Response response, Type type) throws IOException, FeignException {
9
10 // 这里可以从response对象里面获取响应头和响应体
11
12 // 获取响应头
13 Map<String, Collection<String>> headers = response.headers();
14
15 return super.decode(response, type);
16 }
17 }

3、注入自定义解码器

feignDecoder()方法完全参考了FeignClientsConfiguration类的写法。

 1 @Slf4j
2 @Configuration
3 @ConditionalOnClass({Feign.class})
4 @AutoConfigureBefore(FeignAutoConfiguration.class)
5 public class CommonLogFeignConfig {
6
7 @Autowired
8 private ObjectFactory<HttpMessageConverters> messageConverters;
9
10 @Bean
11 public Decoder feignDecoder() {
12 return new OptionalDecoder(new ResponseEntityDecoder(new TraceDecoder(this.messageConverters)));
13 }
14 }

Feign拦截器和解码器的更多相关文章

  1. 阶段5 3.微服务项目【学成在线】_day18 用户授权_19-微服务之间认证-Feign 拦截器

    4.2 Feign 拦截器 4.2.1 定义Feign拦截器 微服务之间使用feign进行远程调用,采用feign拦截器实现远程调用携带JWT. 在common工程添加依赖: <dependen ...

  2. 自定义Feign拦截器

    简介 Feign的拦截器RequestInterceptor SpringCloud的微服务使用Feign进行服务间调用的时候可以使用RequestInterceptor统一拦截请求来完成设置head ...

  3. Feign拦截器应用 (F版)

    Spring Cloud 为开发者提供了在分布式系统中的一些常用的组件(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线,一次性令牌,全局锁定,决策竞选,分布式会话集群状态).使用Sprin ...

  4. Feign 请求拦截器和日志

    Feign 支持请求拦截器,在发送请求前,可以对发送的模板进行操作,例如设置请求头等属性,自定请求拦截器需要实现 feign.RequestInterceptor 接口,该接口的方法 apply 有参 ...

  5. 实现Feign请求拦截器,对请求header等参数进行转发

    参考:Feign传递请求头信息(Finchley版本) 问题:通过Feign远程调用服务,无法传递header参数. 解决方式:实现RequestInterceptor接口(对所有的Feign请求进行 ...

  6. Feign 自定义编码器、解码器和客户端,Feign 转发请求头(header参数)、Feign输出Info级别日志

    Feign 的编码器.解码器和客户端都是支持自定义扩展,可以对请求以及结果和发起请求的过程进行自定义实现,Feign 默认支持 JSON 格式的编码器和解码器,如果希望支持其他的或者自定义格式就需要编 ...

  7. Mina源码阅读笔记(七)—Mina的拦截器FilterChain

    Filter我们很熟悉,在Mina中,filter chain的用法也类似于Servlet的filters,这种拦截器的设计思想能够狠轻松的帮助我们实现对资源的统一处理.我们先大致连接下mina中的f ...

  8. 6. ModelDriven拦截器、Preparable 拦截器

    1. 问题 Struts2 的 Action 我们将它定义为一个控制器,但是由于在 Action 中也可以来编写一些业务逻辑,也有人会在 Action 输入业务逻辑层. 但是在企业开发中,我们一般会将 ...

  9. springmvc的拦截器

    什么是拦截器                                                         java里的拦截器是动态拦截action调用的对象.它提供了一种机制可以使 ...

  10. Struts的拦截器

    Struts的拦截器 1.什么是拦截器 Struts的拦截器和Servlet过滤器类似,在执行Action的execute方法之前,Struts会首先执行Struts.xml中引用的拦截器,在执行完所 ...

随机推荐

  1. 【低代码】低代码平台协同&敏捷场景下的并行开发解决方案探索

    低代码开发平台的出现,大大地提高的产品交付效率,但是在协同开发.敏捷迭代的场景下,也暴露出了一些问题. 例如: 多人同时对项目进行修改,相互影响甚至修改内容被互相覆盖: 同一项目下多个需求同步开发,但 ...

  2. Asp .Net Core 集成 FluentValidation 强类型验证规则库

    目录 入门程序 安装 案例:登录 验证器 内置验证器 自定义验证器 编写自定义验证器 可重复使用的属性验证器 本地化 DI 自动验证 官网:https://docs.fluentvalidation. ...

  3. 【昇腾】ModelArts与Atlas 200 DK云端协同开发——行人检测Demo(完整版)

    摘要:本文主要为大家展示如何基于ModelArts与Atlas 200 DK 端云协同开发的行人检测Demo实现过程. 基于开源数据集,使用ModelArts训练行人检测模型,在本地MindStudi ...

  4. 昇腾CANN 7.0 黑科技:大模型训练性能优化之道

    本文分享自华为云社区<昇腾CANN 7.0 黑科技:大模型训练性能优化之道>,作者: 昇腾CANN . 目前,大模型凭借超强的学习能力,已经在搜索.推荐.智能交互.AIGC.生产流程变革. ...

  5. 一文详述DMS资源池队列阻塞告警及原理

    摘要: 本文主要对DMS资源池队列阻塞告警进行介绍,以及对其背后涉及的内核原理进行介绍. 本文分享自华为云社区<DMS资源池队列阻塞告警及原理介绍>,作者: codefulture. 一. ...

  6. 如何在跨平台的环境中创建可以跨平台的后台服务,它就是 Worker Service。

    一.简介 最近,有一个项目要使用 Windows 服务,来做为一个软件项目的载体.我想了想,都已经到了跨平台的时代了,会不会有替换 Windows 服务的技术出现呢?于是,在网络上疯狂的搜索了一番,真 ...

  7. 火山引擎 DataLeap 通过中国信通院测评,数据管理能力获官方认可!

      近日,火山引擎大数据研发治理套件 DataLeap 通过中国信通院第十五批"可信大数据"测评,在数据管理平台基础能力上获得认证.   "可信大数据"产品能力 ...

  8. Markdown 图片居中显示,增加图片说明

    <center> <img src="https://img2023.cnblogs.com/blog/80824/202308/80824-202308081307138 ...

  9. COOIS增强

    一.订单抬头增强 二.结构添加字段 添加ZGCWL字段 三.BADI增强 四.其他界面增强 不同的界面,选择不同的修改结构 抬头 ct_ioheader 组件 ct_ioopcomp 工序 ct_io ...

  10. ME2N增强

    一.ME2N增加字段 二.结构中添加扩展字段 附加结构中添加同名这些字段时会报错,原因是MEREP_OUTTAB_DOWNPAY等结构已存在该字段,导致冲突 三.添加逻辑代码 包含文件LMEREPI0 ...