本博客日IP超过2000,PV 3000 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog2,之前的微信号好友位已满,备注:返现
受密码保护的文章请关注“业余草”公众号,回复关键字“0”获得密码
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
腾讯云】1核2G5M轻量应用服务器50元首年,高性价比,助您轻松上云
Feign 并不简单,只是封装的好,我们用着简单。在上一章中我们在服务调用中用到了 Feign,但是 Feign 还有很多高级用法,我们没有使用到,这一章我们来一个简单的补充。
我们先来说一说 Feign 的默认配置。在 xttblog-cloud-consumer 实例中,我们用到了 @FeignClient 注解。该注解就用到了 Feign 的一些默认配置。
Spring Cloud 对 Feign 的封装中一个核心的概念就是客户端要有一个名字。每一个客户端随时可以向远程服务发起请求,并且每个服务都可以像使用 @FeignClient 注解一样指定一个名字。Spring Cloud 会将所有的 @FeignClient 组合在一起创建一个新的 ApplicationContext, 并使用 FeignClientsConfiguration 对 Clients 进行配置。配置中包括编码器、解码器和一个 feign.Contract。
Spring Cloud 允许我们通过 @FeignClient 的 configuration 属性完全控制 Feign 的配置信息,这些配置比默认的 FeignClientsConfiguration 优先级要高。
@Configuration public class XttblogFeignConfiguration { @Bean public Contract feignContract() { return new feign.Contract.Default(); } @Bean public BasicAuthRequestInterceptor basicAuthRequestInterceptor() { return new BasicAuthRequestInterceptor("user", "password"); } }
然后,在 @FeignClient 中指定到具体的类即可。
@FeignClient(name = "stores", configuration = XttblogFeignConfiguration.class) public interface XttblogFeignClient { //.. }
如果 XttblogFeignConfiguration 类中的配置属性,FeignClientsConfiguration 中也有,则会对 FeignClientsConfiguration 中的属性进行覆盖。
另外 XttblogFeignConfiguration 类如果被主上下文(ApplicationContext)扫描到,则该类中的配置信息就会被应用于所有的 @FeignClient 客户端。不要将 XttblogFeignConfiguration 写在 FeignApplication 同级目录或子目录就不会被默认的扫描到,我的例子中是创建在其它目录中,具体可以查看文章末尾我的项目源码。
Spring Cloud Netflix 为 Feign 提供了以下默认的配置Bean:(下面最左侧是 Bean 的类型,中间是 Bean 的 name, 右侧是类名)
- Decoder,feignDecoder: ResponseEntityDecoder(这是对SpringDecoder的封装)
- Encoder,feignEncoder: SpringEncoder
- Logger,feignLogger: Slf4jLogger
- Contract,feignContract: SpringMvcContract
- Feign.Builder,feignBuilder: HystrixFeign.Builder
下列这些 Bean 默认情况下 Spring Cloud Netflix 并没有提供,但是在应用启动时依然会从上下文中查找这些 Bean 来构造客户端对象:
- Logger.Level
- Retryer
- ErrorDecoder
- Request.Options
- Collection<RequestInterceptor>
Feign 对继承的支持
Feign 对继承的支持也可以很好的理解。主要就是接口对接口的继承。看下面的代码,你就明白了!
public interface XttblogService { @RequestMapping(method = RequestMethod.GET, value ="/page/{id}") List<String> getPage(@PathVariable("id") long id); }
@FeignClient("test") public interface XttblogClient extends XttblogService { }
Feign 对 http 压缩的支持
很多开源项目都没对 HTTP Rest 请求的数据进行压缩配置。但是实际上 Feign 提供了对请求/响应数据进行 Gzip 压缩支持。我们只需要做一下配置即可做到压缩支持:
feign.compression.request.enabled=true feign.compression.response.enabled=true
还有一些更详细的配置,可以具体的查看 Feign 提供的对应属性配置类。比如下面的配置:
feign.compression.request.enabled=true feign.compression.request.mime-types=text/xml,application/xml,application/json feign.compression.request.min-request-size=2048
Feign 的日志配置
Feign 的日志可以做的很灵活。每一个 @FeignClient 都会创建一个 Logger, Logger 的名字就是接口的完整包名加类名。Feign 的日志配置参数仅支持 DEBUG,例如下面的 application.yml:
logging: level: com.xttblog.service.XttblogClient: DEBUG
除了 Debug 外,还支持下面的这些值:
- NONE, 不记录任何信息,默认值。
- BASIC, 记录请求方法、请求URL、状态码和用时。
- HEADERS, 在BASIC的基础上再记录一些常用信息。
- FULL,记录请求和响应报文的全部内容。
具体可以参考下面的代码来设定:
@Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; }
本文案例相关源码已上传到:https://github.com/xmt1139057136/xttblog-cloud/tree/master/xttblog-cloud-feign
最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加作者微信号:xttblog2。备注:“1”,添加博主微信拉你进微信群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作也可添加作者微信进行联系!
本文原文出处:业余草: » Spring Cloud 教程第六章 Fegin 的默认配置、继承、压缩、日志等高级用法教程