org.springframework.cloud
spring-cloud-starter-openfeign
对应服务提供者的controller的代码。
package com.tulingxueyuan.order.feign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name = "stock-nacos",path = "/stock")
public interface StockService {
@RequestMapping("/getStock")
String getStock();
}
package com.tulingxueyuan.order;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class OrderFeignApplication {
public static void main(String[] args) {
SpringApplication.run(OrderFeignApplication.class, args);
}
}
package com.tulingxueyuan.order.controller;
import com.tulingxueyuan.order.feign.StockService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private StockService stockService ;
@RequestMapping("/getStock")
public String getStock(){
return stockService.getStock();
}
}
有时候我们遇到 Bug,比如接口调用失败、参数没收到等问题,或者想看看调用性能,就需要 配置 Feign 的日志了,以此让 Feign 把请求信息输出来。
1)定义一个配置类,指定日志级别
通过源码可以看到日志等级有 4 种,分别是:
NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。
BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及 执行时间。
HEADERS:记录BASIC级别的基础上,记录请求和响应的header。
FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body 和元数据。
package com.tulingxueyuan.order.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
// 注意: 此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不能配置
public class FeignConfig {
@Bean
public Logger.Level feignLoggerLevel(){
return Logger.Level.FULL ;
}
}
2) 局部配置,让调用的微服务生效,在@FeignClient 注解中指定使用的配置类
局部配置要将第一步的配置类中的@Configuration注解去掉
package com.tulingxueyuan.order.feign;
import com.tulingxueyuan.order.config.FeignConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
@FeignClient(name = "stock-nacos",path = "/stock"
,configuration = FeignConfig.class)
public interface StockService {
@RequestMapping("/getStock")
String getStock();
}
3) 在yml配置文件中执行 Client 的日志级别才能正常输出日志,格式是"logging.level.feign接口包路径 =debug" 因为springboot中的默认日志级别是info,而feign的默认日志级别是debug
logging:
level:
com.tulingxueyuan.order: debug
ps:补充:局部配置可以在yml中配置 对应属性配置类:
feign:
client:
config:
stock-nacos:
loggerLevel: FULL
这样,可以使用feign原生的@RequestLine和@Param这些注解了(契约基本不会用到)
主要配置connectTimeout(网络请求连接最大等待时间)和readTimeout(读取数据最大等待时间)
1)在核心配置文件中加入
requestInterceptors[0]: com.tulingxueyuan.order.intercepter.feign.MyInterceptor
或者也可以使用全局的配置方法:
在配置类中加入一下代码
@Bean public MyInterceptor myInterceptor(){ return new MyInterceptor(); }
2)实现RequestInterceptor 接口,重写apply方法
package com.tulingxueyuan.order.intercepter.feign;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyInterceptor implements RequestInterceptor {
private Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("cafe","babe");
logger.debug("hello {0} RequestInterceptor","malimalih");
}
}
服务提供方可以通过 @RequestHeader获取请求参数。