feign作为springcloud的http交互工具,让我们实现完全傻瓜化的接口调用,关于feign的调用操作,因其太过简单,在此我们不做赘表,让我们直接玩一些高级些的自定义处理:
日志配置
feign的logger.class中源码里对日志的等级分为4钟:
NONE:不输出日志
BASIC:只输出请求方法的url和响应的状态码以及接口执行的时间
HEADERS:将basic信息和请求头信息输出
FULL:输出完整的请求信息
feign的自定义需要创建一个配置类:
在项目启动时通过配置,将配置类链入feignclient属性中:
配置类搞完之后,就需要在feign clien中加入配置:
@FeignClient(
value = "xxx-xxx-xx-service",
configuration = FeignConfiguration. class)
public interface UserRemoteClient {
//todo
}
在配置文件中执行 Client 的日志级别:
格式是“logging.level.client 类地址=级别”
logging.level.com.leizhenzi.feign_demo.remote.UserRemoteClient=DEBUG
认证配置
在实际使用中时,接口间的调用是需要权限控制的,有些场景可以使用参数中传递,但是更多的是在请求头中传递认证相关的信息,让我们来看一下feign如何实现认证配置:
然后将具体的认证逻辑添加在apply方法中即可实现请求进入时完成认证相关的处理;
设置超时
通过 Options 可以配置连接超时时间和读取超时时间(代码如下所示),Options 的第一个参数是连接超时时间(ms),默认值是 10×1000;第二个是取超时时间(ms),默认值是 60×1000;
@Configuration
public class FeignConfiguration {
@Beanpublic
Request.Options options() {
return new Request.Options(5000, 10000);
}
}复制
客户端组建配置
Feign 中默认使用 JDK 原生的 URLConnection 发送 HTTP 请求,我们可以集成别的组件来替换掉 URLConnection,比如 Apache HttpClient,OkHttp。配OkHttp 只需要加入 OkHttp 的依赖,代码如下所示:
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
</dependency>
然后修改配置,将 Feign 的 HttpClient 禁用,启用 OkHttp,配置如下:
#feign 使用 okhttp
feign.httpclient.enabled=false
feign.okhttp.enabled=true
在feign的源码里可以发现我们的配置是如何生效的,即通过@ConditionalClass标识当apachehttpclient.class在当前路径下存在时,如果@ConditionalOnProperty监测到配置文件中feign.httpclient.enabled属性为true时,执行加载该配置,同理我们可以使用同样方式配置okhttp:
用配置方式自定义feign
# 链接超时时间
feign.client.config.feignName.connectTimeout=5000
# 读取超时时间
feign.client.config.feignName.readTimeout=5000
# 日志等级
feign.client.config.feignName.loggerLevel=full
# 重试
feign.client.config.feignName.retryer=com.example.SimpleRetryer
# 拦截器
feign.client.config.feignName.requestInterceptors[0]=com.example.FooRequestInterceptor
feign.client.config.feignName.requestInterceptors[1]=com.example.BarRequestInterceptor
# 编码器
feign.client.config.feignName.encoder=com.example.SimpleEncoder
# 解码器
feign.client.config.feignName.decoder=com.example.SimpleDecoder
# 契约
feign.client.config.feignName.contract=com.example.SimpleContract
结语
今天的分享就到这里,我是雷记,专注于分享关于开发编程相关的技术干货,如果今日的分享对您有帮助的话,还望不吝关注点赞,这对我很重要!如果各位在开发过程中遇到棘手问题,可以扫描下图二维码加入,和雷记与其他小伙伴一起探讨解决,让我们努力让每一个问题都得到解决!