Feign提供了很多的扩展机制,让用户 可以更加灵活的使用
日志配置
遇到bug,比如 接口调用失败,参数没收到等问题,或者想看看调用性能,就需要配置Feign的日志了,以此让Feign把请求信息输出来。
1、定义一个配置类,指定日志级别
/*
* 全局配置 加上@Configuration,则会将配置作用所有的服务中心
* 局部配置 如果只想作用于某一个服务,则不加@Configuration 则为局部配置
* */
@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLoggingLevel(){
return Logger.Level.FULL;
}
}
日志等级有四种,分别是:
NONE :【性能最佳,适用于生产】不记录任何日志(默认值)
BASIC:【适用于生产环境追踪问题】 仅记录请求方法、URL、响应状态代码以及执行时间
HEADERS:记录BASIC 级别的基础上,记录请求和相应的header
FULL:【比较适用于开发以及测试环境定位问题】记录请求和相应的header、body和元数据
2、局部配置,让调用的微服务生效,在@FeignClient注释中指定使用的配置类
@FeignClient(name = "stock-nacos",path = "/stock/")
public interface FeignStockService {
@RequestMapping("add")
String add();
}
需要注意的是:如若调用的微服务的参数注解是@PathVariable 则在消费者中需要@PathVariable("参数名")这种写法
调用的微服务的接口:
@RestController
@RequestMapping("/stock/")
public class StockController {
@Value("${server.port}")
String port;
@GetMapping("add/{id}")
public String add(@PathVariable String id){
System.out.println("库存减少");
return "库存减少:"+port+"参数是:"+id;
}
}
消费者的写法:
@FeignClient(name = "stock-product",path = "/stock/")
public interface FeignProductService {
@RequestMapping("add/{id}")
String add(@PathVariable("id") String id);
}
3、在yml配置文件中执行Client的日志级别才能正常输出日志,格式是“logging.level.feign接口路径=debug”
#springboot默认级别是info ,feign的debug日志级别就不会输入
logging:
level:
com.wxx.order.feign: debug
补充:局部配置的方式
1)注解的方式:
- 在配置文件FeignConfig的配置中将@Configuration去掉
//@Configuration
public class FeignConfig {
@Bean
public Logger.Level feignLoggingLevel(){
return Logger.Level.FULL;
}
}
- 在需要显示日志的service中的@FeignClient中添加configuration属性
@FeignClient(name = "stock-product",path = "/stock/",configuration = FeignConfig.class)
public interface FeignProductService {
@RequestMapping("add2/{id}")
String add2(@PathVariable("id") String id);
}
2)在yml中配置
对应属性配置类:org.springframework.cloud.openfeign.feignClientProperties.FeignClientConfiguration
#Feign局部日志配置
feign:
client:
config:
stock-product: #对应微服务名称
loggerlevel: FUll
契约配置
springcloud在Feign的基础上做了扩展,使用springmvc的注解来完成Feign的功能,原生的Feign是不支持springmvc注解的,如果想在springmvc中使用原生的注解方式来定义客户端也是可以的,通过配置契约来改变这个配置,Spring cloud中默认使用的是SpringMvcContract
spriongcloud1 早期版本就是用的feign 随着netflex的停更替换成了Open Feign
比如:原来的springcloud项目 想要更新版本的替换成OpenFeign的时候 会遇到需要修改大量的代码改成openFeign的语法,对开发人员造成极大的不方便,所以会使用到契约配置
1、修改配置文件的方式
- 修改契约配置,支持Feign原生的注解
public class FeignConfig {
@Bean
public Contract feignContract(){
return new Contract.Default();
}
}
注意:修改契约配置后,FeignProductService不在支持springmvc的注解,需要使用Feign原生的注解
- FeignProductService中配置使用Feign原生的注解
@FeignClient(name = "stock-product",path = "/stock/",configuration = FeignConfig.class)
public interface FeignProductService {
@RequestLine("GET add2/{id}")
String add2(@Param("id") String id);
}
2、通过yml的方式配置契约
feign:
client:
config:
stock-product: #对应微服务名称
loggerlevel: FUll
contract: feign.Contract.Default #设置默认契约 还原成原生注解
设置超时时间
通过Options可以配置连接超时时间和读取超时时间,Options的第一个参数是连接的超时时间(ms),默认2s,第二个是请求处理的超时时间(ms),默认值是5s
全局配置
@Configuration
public class FeignConfig {
@Bean
public Request.Options options(){
return new Request.Options(5000,10000);
}
}
yml配置
feign:
client:
config:
stock-product: #对应微服务名称
#请求连接超时时间默认2s
connectTimeOut: 5000
#请求处理超时时间,默认5s
readTimeout: 10000
补充说明:Feign的底层使用的是Ribbon,但超时时间可以Feign配置为准