Spring Cloud OpenFeign是Feign的升级版,目前Github上面已经更新到11.6版本了,Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
OpenFeign的使用首先肯定得依赖Spring Cloud,作为Alibaba微服务架构,以下依赖必不可少。
<!-- openfeign服务调用 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在订单服务(dt-order-servic)的启动器上开启Feign的服务调用,以此来调用库存服务端的接口方法。
@EnableFeignClients :开启服务调用
@FeignClient(name = "dt-stock-service",path = "/stock")
public interface StockFeignService {
@GetMapping(value = "/getPort")
String getPort();
}
@FeignClient(name = “dt-stock-service”,path = “/stock”)
dt-stock-service:服务提供者的服务名称,path:服务提供者的统一前缀(即Controller的前缀路径,如果没有就不填)
编写控制器,调用服务暴露接口方法:
在默认情况下,OpenFeign默认的日志是关闭的,在我们开发过程中,需要调试接口,或者看看调用性能,就需要配置OpenFeign的日志,把OpenFeign的调用日志清晰的打印出来,方便我们开发。
Feign日志级别:
NONE,无记录(DEFAULT)。
BASIC,只记录请求方法和URL以及响应状态代码和执行时间。
HEADERS,记录基本信息以及请求和响应标头。
FULL,记录请求和响应的头文件,正文和元数据
OpenFeignConfig.class
/**
* 全局配置:OpenFeign的全局日志配置
* 局部配置:不加@Configuration注释
* @author DT
* @date 2021/8/9 22:00
*/
@Configuration
public class OpenFeignConfig {
@Bean
public Logger.Level feignLoggerLevel(){
// 输出日志级别FULL
return Logger.Level.FULL;
}
}
SpringBoot的日志级别默认为info,大于full,导致feign的日志配置不会输出,所以加以下配置:
#SpringBoot的日志级别默认为info,大于full,导致feign的日志配置不会输出,所以加以下配置
logging:
level:
com.dt.springcloud.openfeign: debug
使用configuration = OpenFeignConfig.class
当然我们也可以通过配置文件的方式来配置.
针对所有服务配置:
# SpringBoot的日志级别默认为info,大于full,导致feign的日志配置不会输出,所以加以下配置
logging:
level:
com.dt.springcloud.openfeign: debug
# feign日志全局配置
feign:
client:
config:
default:
loggerLevel: BASIC
当然你也可以针对某个服务进行配置单独的日志,将调用的微服务名称改成default就配置成全局的了:
# feign针对某个服务配置日志
feign:
client:
config:
#想要调用的微服务名称
dt-stock-service:
loggerLevel: BASIC
OpenFeign拦截器,无非就是和我们SpringMVC中的拦截器一样,每次feign发起http调用之前,会去执行拦截器中的逻辑,比如统一添加header头信息,对body体中的信息做修改或替换。feign提供了 feign.RequestInterceptor 接口,只需实现该接口,实现对应方法,并将实现类通过 @Configuration交给spring容器管理,即可加上我们自己的通用处理逻辑。
@CommonsLog
@Configuration
public class CustomFeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("token","ABC123456");
byte[] body = requestTemplate.body();
String url = requestTemplate.url();
String method = requestTemplate.method();
Map<String, Collection<String>> map = requestTemplate.headers();
log.info("OpenFeign拦截器启动......");
log.info("body->>>"+(body == null ? null : body.length));
log.info("url->>>"+url);
log.info("method->>>"+method);
log.info("header->>>"+map.get("token"));
}
}
查看打印结果:
如果还需要做其他处理,可以对RequestTemplate做相应处理来实现,比如令牌的验证,刷新,鉴权等等。
除了上面的第一种全局配置方式以外,我们也可以在配置文件中,单独针对某个被调用的服务进行配置,和我们上面的日志配置方式一样。
# feign针对某个服务配置
feign:
client:
config:
#想要调用的微服务名称
dt-stock-service:
connectTimeout: 5000 # 连接超时时间
readTimeout: 5000 # 读取超时时间
loggerLevel: BASIC
requestInterceptors: # 配置拦截器,相当于代码配置方式中的RequestInterceptor
- com.dt.springcloud.interceptor.CustomFeignInterceptor
dt-stock-service 想要调用的服务名称。
没有谁的幸运,是凭空而来,只有当你足够努力,你才会足够幸运。这世界不会辜负每一份努力和坚持,时光不会怠慢执着而勇敢的每一个人
本篇文章结束了,后面我们再继续深入研究微服务其他的组件的使用以及原理剖析,创作不易,喜欢的请关注小编CSDN:https://blog.csdn.net/qq_41107231 以及掘金:https://juejin.cn/user/3940246036699848