feign 全局 与 局部拦截器的区分与使用
拦截器,可以减少方法接口的参数个数,减少手写代码,从而减少出错,提高效率。
全局拦截器:对全部 feign 请求都生效
局部拦截器:仅对指定的拦截器生效,可手动配置指定。
2者主要区别是 ,是否在 拦截器上 加注解@Configuration
feign 如何配置和使用,spring官网介绍
feign 原理 其实就是 模拟了 http client ,发送各种请求。
feign 内部使用了http客户端,可以是 resttemplate 或其他 比如 okHttpclient
局部拦截器:精准1对1配置,不要加 @Configuration
- 写一个拦截器配置了,
不要加 @Configuration
- 将拦截器置为
@FeignClient
类的configuration
属性值 - 局部精准拦截器
import feign.RequestInterceptor; import feign.RequestTemplate; import lombok.extern.slf4j.Slf4j; import java.util.Collection; import java.util.Map; /** * 1对1的拦截器 精准配置 * 千万别加 @Configuration ,只需要在接口 @FeignClient(configuration = 1对1的拦截器类名.class) 即可 * @author stormfeng * @date 2022-05-26 11:15 */ @Slf4j public class FeginHeaderInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { template.header(header, "secret"); //作用 :统一加 Headers : } }
- 将拦截器配对给某
@FeignClient
@FeignClient(name = "auth",configuration = FeginHeaderInterceptor.class) public interface AuthFeignService { /** * 该接口需要传输的http header ,需要每次手动传输header * 比较麻烦,重复代码多 * / @PostMapping("/role/user/isSystemAdmin1") Boolean isSystemAdmin(@RequestBody Map entity,@RequestHeader String secret); /** * 拦截器 FeginHeaderInterceptor 自动配置传输参数 header,无需每次手动传输 * 大大简化接口参数,减少手写冗余代码参数 * / @PostMapping("/role/user/isSystemAdmin2") Boolean isSystemAdmin(@RequestBody Map entity); }
全局拦截器:全局自动强制生效 :+ @Configuration
-
在拦截器配置类上加
@Configuration
,就会对每个 feign 请求都生效。 -
重写其 apply 方法,可以给每个 feign 请求增加 header
-
全局拦截器配置
import feign.RequestInterceptor; import feign.RequestTemplate; import lombok.extern.slf4j.Slf4j; import java.util.Collection; import java.util.Map; /** * 全局拦截器 + @Configuration :所有的 feign 请求都会执行该 拦截器; * @author stormfeng * @date 2022-05-26 11:15 */ @Configuration @Slf4j public class FeginHeaderInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate template) { template.header(header, "secret"); //作用 :统一加 Headers : } }
-
@FeignClient
接口/** * 无需配置 configuration = FeginHeaderInterceptor.class,也会生效 * 全局拦截器,无需配置 configuration 配置,自动强制生效 */ @FeignClient(name = "auth"/*,configuration = FeginHeaderInterceptor.class*/) public interface AuthFeignService { /** * 全局拦截器 FeginHeaderInterceptor 自动配置传输参数 header,无需每次手动传输 * / @PostMapping("/role/user/isSystemAdmin2") Boolean isSystemAdmin(@RequestBody Map entity); }