什么是Feign
Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API。
Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不需要通过常规的 Http Client 构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布式环境开发。
快速整合Feign
依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
编写Feign接口
@FeignClient(value = "putaway-cloud-user")
public interface UserAuthFeignClient {
@GetMapping(value ="/feign/findToken")
R<String> findToken(@RequestParam("tenantId") Long tenantId, @RequestParam("type") Integer type);
}
调用端在启动类上添加@EnableFeignClients注解
@SpringBootApplication
@EnableFeignClients
public class UserApplication {
public static void main(String[] args) {
SpringApplication.run(UserApplication.class,args);
}
}
发起调用
@Resource
private UserAuthFeignClient userAuthFeignClient;
Feign拓展
日志配置
@Configuration
public class FeignLogConfig {
/**
* 日志级别
* @return
*/
public Logger.Level feignLoggerLevel(){
return Logger.Level.NONE;
}
}
一共有四种级别:
- NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。
- BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间。
- HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
- FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据。
在yml配置文件中配置 Client 的日志级别才能正常输出日志,格式是"logging.level.feign接口包路 径=debug
拦截器配置
通常我们调用的接口都是有权限控制的,很多时候可能认证的值是通过参数去传递的,还有就是通过请求头去传递认证信息,比如 Basic 认证方式
@Configuration
public class FeignConfig {
@Bean
public BasicAuthRequestInterceptor basicAuthRequestInterceptor() {
return new BasicAuthRequestInterceptor("admin", "admin");
}
}
自定义拦截器
public class FeignAuthRequestInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
template.header("token","123");
}
}
@Configuration
public class FeignConfig {
@Bean
public FeignAuthRequestInterceptor basicAuthRequestInterceptor() {
return new FeignAuthRequestInterceptor();
}
}
编码器解码器配置
@Bean
public Decoder decoder() {
return new JacksonDecoder();
}
@Bean
public Encoder encoder() {
return new JacksonEncoder();
}