Spring Cloud Ribbon 和 Spring Cloud Hystrix 在微服务架构中分别有着实现客户端负载均衡的服务调用以及通过断路器来保护微服务应用的作用。这两者将被作为基础工具类框架广泛地应用在各个微服务的实现中,不仅包括我们自身的业务类微服务,也包括一些基础设施类微服务(比如网关)。
此外,在实践过程中,会发现对这两个框架的使用几乎是同时出现的。 既然如此,那么是否有更高层次的封装来整合这两个基础工具以简化开发呢?Spring Cloud Feign [feɪn] 就是这样一个工具。它基于 Netflix Feign 实现,整合了 Spring Cloud Ribbon 与 Spring Cloud Hystrix,除了提供这两者的强大功能之外,它还提供了一种声明式的 Web 服务客户端定义方式。我们在使用 Spring Cloud Ribbon 时,通常都会利用它对 RestTemplate 的请求拦截来实现对依赖服务的接口调用,而 RestTemplate 已经实现了对 HTTP 请求的封装处理,形成了一套模板化的调用方法。
在实际开发中,由于对服务依赖的调用可能不止于一处,往往一个接口会被多处调用, 所以我们通常都会针对各个微服务自行封装一些客户端类来包装这些依赖服务的调用。 这个时候会发现,由于 RestTemplate 的封装,几乎每一个调用都是简单的模板化内容。
综合上述这些情况,Spring Cloud Feign 在此基础上做了进一步封装,由它来定义和实现依赖服务接口。在 Spring Cloud Feign 的实现下,只需创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口绑定, 简化了在使用 Spring Cloud Ribbon 时自行封装服务调用客户端的开发量。Spring Cloud Feign 具备可插拔的注解支持, 包括 Feign 注解和 JAX-RS 注解。同时,为了适应 Spring 的广大用户,它在 Netflix Feign 的基础上扩展了对 Spring MVC 的注解支待。另外,对于 Feign 自身的一些主要组件,比如编码器和解码器等,它也以可插拔的方式提供,在有需求的时候我们可以方便地扩展和替换它们。
请求压缩
Spring Cloud Feign 支持对请求与响应进行 GZIP 压缩,以减少通信过程中的性能损耗。还能对请求压缩做一些更细致的设置, 如指定压缩的请求数据类型,设置了请求压缩的大小下限,只有超过这个大小的请求才会对其进行压缩等。
参考:
《Spring Cloud 微服务实战》翟永超 著