博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Feign的工作原理
阅读量:2444 次
发布时间:2019-05-10

本文共 1282 字,大约阅读时间需要 4 分钟。

Feign的工作原理

Feign是一个伪Java Http 客户端,Feign 不做任何的请求处理。Feign 通过处理注解生成Request模板,从而简化了Http API 的开发。开发人员可以使用注解的方式定制Request API模板。

在发送Http Request请求之前,Feign通过处理注解的方式替换掉Request模板中的参数,生成真正的Request,并交给Java Http客户端去处理。利用这种方式,开发者只需要关注Feign注解模板的开发,而不用关注Http请求本身,简化了Http请求的过程,使得Http请求变得简单和容易理解。

Feign通过包扫描注入FeignClient的Bean,该源码在FeignClientsRegistrar 类中。首先在程序启动时,会检查是否有@EnableFeignClients注解,如果有该注解,则开启包扫描,扫描被@FeignClient注解的接口。代码如下:

在这里插入图片描述
当程序的启动类上有@EnableFeignClients注解。在程序启动后,程序会通过包扫描将有@FeignClient注解修饰的接口连同接口名和注解的信息一起取出, 赋给BeanDefinitionBuilder,然后根据BeanDefinitionBuilder得到BeanDefinition,最后将BeanDefinition注入IoC容器中,源码如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注入BeanDefinition之后,通过JDK的代理,当调用Feign Cliet接口里面的方法时,该方法会被拦截,源码在ReflectiveFeign类:
在这里插入图片描述
在SynchronousMethodHandler类进行拦截粗粒,会根据参数生成RequestTemplate对象,该对象是Http请求的模板:
在这里插入图片描述
在上述代码中,有一个executeAndDecode()方法,该方法通过RequestTemplate生成Request请求对象,然后通过Http Client获取Response,即通过Http Client进行Http请求来获取响应:

总结

总的来说,Feign 的源码实现过程如下。

  1. 首先通过@EnableFeignClients注解开启FeignClient 的功能。只有这个注解存在,才会在程序启动时开启对@FeignClient注解的包扫描。
  2. 根据Feign的规则实现接口,并在接口上面加上@FeignClient注解。
  3. 程序启动后,会进行包扫描,扫描所有的@ FeignClient 的注解的类,并将这些信息注入IoC容器中。
  4. 当接口的方法被调用时,通过JDK的代理来生成具体的RequestTemplate模板对象。
  5. 根据RequestTemplate再生成Http请求的Request对象。
  6. Request 对象交给Client去处理,其中Client的网络请求框架可以是HtpURLConnection、HttpClient和OkHttp。
  7. 最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。

转载地址:http://eapqb.baihongyu.com/

你可能感兴趣的文章
polymer ajax_使用Polymer创建自定义音频播放器元素
查看>>
angularjs css_使用AngularJS和NgHref动态获取CSS
查看>>
使用Bootstrap和AngularJS构建类似Chrome的标签页
查看>>
angular 克隆_使用Angular和Stamplay构建Etsy克隆(第3部分)
查看>>
萨斯病毒感染情况_审美萨斯1:建筑与风格组织
查看>>
angular删除节点_节点和Angular To-Do应用程序:控制器和服务
查看>>
angular 克隆_使用Angular和Stamplay构建Etsy克隆(第2部分)
查看>>
视屏剪辑背景音乐_文本背景和带有背景剪辑的渐变
查看>>
使用Mongoose轻松开发Node.js和MongoDB应用
查看>>
做无用之事读无用之书_如何从现有的基础上创建一个无用的基础框
查看>>
ionic4创建应用命令_使用AngularJS和Ionic创建您的第一个移动应用
查看>>
emmet :_使用Emmet快速编写HTML Crazy Fast:交互式指南
查看>>
flux react_使用React.js和Flux创建一个简单的购物车
查看>>
idea 创建todo_创建具有节点和角度的单页Todo应用
查看>>
angularjs路由_具有AngularJS路由和模板的单页应用
查看>>
轻松的节点身份验证:将所有帐户链接在一起
查看>>
js复选框和单选按钮_以角形式处理复选框和单选按钮
查看>>
node.js react_使用Node和React.js构建实时Twitter流
查看>>
ppt 代码语法突出显示_为您的网站代码获取漂亮的语法突出显示
查看>>
ngrepeat数组_使用NgRepeat和NgForm构建动态角度形式
查看>>