1、什么是feign
Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API。
Spring Cloud对Feign进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Eureka,从而使得Feign的使用更加方便
2、Ribbon+RestTemplate进行微服务调用的缺点
ResponseEntity<List> responseEntity = restTemplate.getForEntity("http://order-service/order/queryOrdersByUserId/"+userId,List.class);
Ribbon进行调用
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
缺点:我们编码的请求的url比较简单,如果系统很复杂,则需要拼接很多参数,而且代码看起来不是很美观,不利于理解代码的含义,给别人维护造成一定的困扰
3、feign的搭建
1)服务消费方加入feign依赖和提供方的api依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>com.######.fc</groupId>
<artifactId>fc-customer-service-api</artifactId>
<version>1.0.0</version>
</dependency>
2)新建remote.service包,用于微服务调用
新建接口,并继承依赖的api接口(不用再写一遍调用的方法)
增加@FeignClient(value = "fc-process-service")注解
3)主启动类增加注解
4、feign的日志级别
1)、NONE【性能最佳,适用于生产】:不记录任何日志(默认值)
public class MsProviderCustomCfg {
public Logger.Level feignLoggerLevel() {
return Logger.Level.NONE;
}
}
2)、HEADERS:记录BASIC级别的基础上,记录请求和响应的header
public class MsProviderCustomCfg {
public Logger.Level feignLoggerLevel() {
return Logger.Level.HEADERS;
}
}
3)、FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body和元数据
public class MsProviderCustomCfg {
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
4)、BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及执行时间
public class MsProviderCustomCfg {
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.BASIC;
}
}
5、两种定义日志级别的方法
1)配置类
public class MsProviderCustomCfg {
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.BASIC;
}
}
@FeignClient(name = "ms-provider-order-feign-custom",configuration = MsProviderCustomCfg.class,path = "/order")
public interface MsCustomFeignOrderApi {
@RequestLine("GET /queryOrdersByUserId/{userId}")
public List<OrderVo> queryOrdersByUserId(@Param("userId") Integer userId);
}
2)yml文件中配置
feign.client.config.ms-provider-order-feign-custom.loggerLevel=full