ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
在前面的章节主要为大家介绍了RestTemplate、Ribbon、Feign与OpenFeign。其中OpenFeign是实现远程接口调用目前的最佳实践方法。其接口定义如下: ~~~ @FeignClient("ASERVICE-SMS") public interface SmsService { @PostMapping(value = "/sms/send") AjaxResponse send(@RequestParam("phoneNo") String phoneNo, @RequestParam("content") String content); } ~~~ 那么,OpenFeign是如何将这样一个接口定义,转化为HTTP请求发送出去,又如何正确的解析远程服务的响应结果呢?那我们就需要为大家介绍一下OpenFeign的核心设计原理。 ## 一、请求响应流程处理 ![](https://img.kancloud.cn/ab/af/abaf8c8de80f5d5a5fb6a56d5c6b790a_619x625.png) * 解析接口定义:并将解析的结果反射为方法。比如:通过注解定义post请求,反射结果就应该是RestTemplate的Post方法,而不应该是GET方法。 * 根据Contract去解析接口定义:通过前面章节的讲解,目前一共有两种服务接口定义规范。一种是Default的feign的实现,一种是基于SpringMVC注解的SpringMvcContract。两种定义方式,导致的解析过程肯定是不一样的。 * 报文编码/解码:比如:发送请求将参数转化为JSON,接受响应将JSON结果转化为返回值Bean。 * 拦截器:为了方便网络传输,通常将http协议内容压缩。在发送的时候压缩,在响应的时候解压缩 * 日志增强:Feign还为我们提供了日志的增强功能,方便我们查看请求内容及响应结果信息。 ## 二、根据Contract解析接口定义 ![](https://img.kancloud.cn/e7/4d/e74d2cf92d52e20e1a13925b8af16c7f_1135x405.png) 在上一节中已经为大家介绍了书写Feign接口定义的两种方式,其中我们最常用的还是Spring MVC注解的方式。 ![](https://img.kancloud.cn/18/7b/187b5830561a22ebfd9371aa27ea40b7_873x342.png) * org.springframework.cloud.openfeign.support.SpringMvcContract用来将Spring MVC的注解解析为MethodMetadata。 * feign.Contract.Default用来将Feign的注解(上图注释的部分)解析为MethodMetadata。 MethodMetadata代表了该调用那个方法、采用哪个HTTP方法、请求头信息是什么等等信息。 ## 三、HTTP内容格式编解码 ![](https://img.kancloud.cn/7a/fc/7afcec6040e0b8e00a876bd755752b6c_1183x748.png) 需要注意的是在Encoder/ Decoder 实现实现类中,有一类叫做SpringDecoder和SpringEncoder。来看一下它的代码,从代码中我们已经可以明确的看到支持使用HttpMessageConverter进行请求响应内容的格式处理转换。 ![](https://img.kancloud.cn/ec/86/ec860c3be0e558baab7494bd5959949a_810x253.png) 也就是说,我们在Spring MVC注解中常用的JSON、XML等数据格式,在接口定义中都可以被支持。 ## 四、拦截器 此外Feign还为我们定义了拦截器,帮助我们实现请求响应内容的gzip压缩与解压缩。注意这些拦截器不是Spring的拦截器,而是feign.RequestInterceptor。 ![](https://img.kancloud.cn/49/1d/491d2f05ac3873647d5dd35de2f21bb0_497x129.png) ## 五、日志增强 因为我们的微服务调用,都是在服务之间进行的。不是我们传统意义上的,从浏览器请求服务,所以当服务请求出现异常的时候,我们需要查看服务的HTTP详细调用信息。为此Feign为我们提供了日志增强接口。 提供了四种日志级别: ![](https://img.kancloud.cn/76/5b/765b6519e121f746383155895ee0f4f9_1281x580.png) | 级别 | 说明 | | --- | --- | | NONE | 不输出任何日志 | | BASIC | 只输出Http 方法名称、请求URL、返回状态码和执行时间 | | HEADERS | 输出Http 方法名称、请求URL、返回状态码和执行时间 和 Header 信息 | | FULL | 记录Request 和Response的Header,Body和一些请求元数据 | 在理解了上面的这些Feign的请求相应流程及设计原理之后,我们做关于OpenFeign的各种配置才能更加的游刃有余。下一节就为大家介绍OpenFeign的相关配置。