Feign简介
Feign是一个http请求调用的轻量级框架,可以以Java接口注解的方式调用Http请求,帮助我们更加便捷、优雅地调用HTTP API。Feign其灵感来自Retrofit、JAXRS-2.0以及WebSocket。通过处理注解,将请求模板化,底层实际还是Ribbon,只是通过动态代理做了一次封装。
Ribbon与Feign的区别
Ribbon和Feign都是用于调用其他服务的,不过方式不同。
1.启动类使用的注解不同,Ribbon用的是@RibbonClient,Feign用的是@EnableFeignClients。
2.服务的指定位置不同,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。
3.调用方式不同,Ribbon需要自己构建http请求,模拟http请求然后使用RestTemplate发送给其他服务,步骤相当繁琐。Feign则是在Ribbon的基础上进行了一次改进,采用接口的方式,将需要调用的其他服务的方法定义成抽象方法即可,不需要自己构建http请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法完全一致。
Feign入门
<!--1. 配置pom文件,引入在引入spring-cloud-starter-openfeign包 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!- 2. 编写调用接口 备注:name指定微服务的名称, path是指定服务消费者的调用前缀 -> @FeignClient(name = "ms-provider-order", path = "/order") public interface MsCustomFeignOrderApi { @RequestMapping("/queryOrdersByUserId/{userId}") List<OrderVo> queryOrdersByUserId(@PathVariable("userId") String userId); @RequestMapping("/getRegisterInfo") String getRegisterInfo(); } <!- 3. 在主启动类上加入注解@EnableFeignClients注解 --> @SpringBootApplication @EnableFeignClients public class FeignApplication { public static void main(String[] args) { SpringApplication.run(FeignApplication.class, args); } }
备注:如果没有加入@EnableFeignClients,在调用过程中会报Class has no fields的错误;
Feign 的日志级别
Feign有四种日志级别,适应不通的环境:
1、NONE:不记录任何日志(默认值),性能最佳,适用于生产。
2、HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
3、FULL:记录请求和响应的header、body和元数据。适用于开发及测试环境定位问题。
4、BASIC:仅记录请求方法、URL、响应状态代码以及执行时间。适用于生产环境追踪问题。
属于文件配置: feign.client.config.服务名(FeignClient的Name属性).loggerLevel=full 通过代码配置: public class FeignConfig { @Bean public Logger.Level feignLoggerLevel() { return Logger.Level.BASIC; } }
备注:FeignConfig类,建议不要添加@Configuration注解,否则该配置将会被所有Feign Client共享,无法实现细粒度配置。如果一定要加@Configuration注解,就不要让主应用程序上下文@ComponentScan扫描到。