Spring Cloud 教程第六章 Fegin 的默认配置、继承、压缩、日志等高级用法教程

JAVA herman 50浏览 0评论

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)!可加QQ1群:135430763,QQ2群:454796847,QQ3群:187424846。QQ群进群密码:xttblog,想加微信群的朋友,可以微信搜索:xmtxtt,备注:“xttblog”,添加助理微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » Spring Cloud 教程第六章 Fegin 的默认配置、继承、压缩、日志等高级用法教程