Feign入门使用

377 阅读2分钟

什么是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(); 
}