12 | OpenFeign:服务间调用组件 OpenFeign 是怎么“隔空取物”的?
- 深入了解
- 翻译
- 解释
- 总结
OpenFeign是一个用于服务间调用的组件,通过声明式的远程调用接口大幅简化了远程调用的编程体验。相比于使用WebClient发起远程调用,OpenFeign的接入更加简单易用,同时能很好地将业务无关的代码与业务代码隔离开。OpenFeign的底层原理是使用了一种“动态代理”技术来封装远程服务调用的过程,实现了调用逻辑和业务逻辑之间的职责分离。文章详细介绍了OpenFeign动态代理的创建过程,包括项目加载、扫包、解析FeignClient注解、构建动态代理对象等关键步骤。此外,文章还提到了OpenFeign组件中的Contract协议解析功能,以及对RequestMapping注解的解析过程。总结来说,OpenFeign通过动态代理机制将接口调用转化为远程服务调用,为简化远程服务调用提供了一种高效的解决方案。
《Spring Cloud 微服务项目实战》,新⼈⾸单¥59
全部留言(10)
- 最新
- 精选
- ~置顶这节课好早就学完了,但是后面的思考题一直没有时间搞清楚,今天闲下来后 debug 一遍后,大概明白具体流程了。 我觉得 OpenFeign 的远程调用分为两步 1. 首先是生成动态代理类,然后将代理类作为 bean 注入到 Spring 容器中 2. 然后是在调用过程中,代理类通过进行网络请求,向调用方做请求。 动态代理的原理其实 duckduckgo 一下就能找到无数篇文章,就不多说了,这里 OpenFeign 其实底层调用的是 Feign 的方法,生成了代理类,使用的是 JDK 的动态代理,然后 bean 注入。 调用过程,就是代理类作为客户端向被调用方发送请求,接收相应的过程。其中,feign 自行封装了 JDK java.net 相关的网络请求方法,可以重点关注一下 Client 类。我之前没有了解过,以为是直接用的 netty 或者其他的网络中间件;请求过程中还有 Loadbalancer 进行负载均衡;收到响应后,还需要对响应类进行解析,才能真正取出正确的响应信息。 最后:这些天还在忙其他东西,尽管老师更一篇看一篇,但是有些还要深入了解的,就要等到把所有文章的思考题摸清楚后再一步步填坑了。比如 OpenFeign 用的自行封装的 jdk 网络组件,是否可以使用其他中间件(例如 netty)实现呢?在请求过程中实现的负载均衡 loadbalancer 是怎么工作的? 以及我在 debug 过程中发现的问题:一旦发起调用时间过长,就会报错 「stream is closed」,io 没学好的我这方面之后也得稍微努力一下;在使用 debug 启动过程中,就出现过对 feign 的动态代理类调用 hashcode 代理方法的情况,应该是 spring 某个组件调用的(我在是数据库相关),但具体是谁我也不清楚。 以上就是大体的总结和我自己记录的问题,希望以后有时间把挖的坑慢慢填上,如果有什么问题或者不对的地方,欢迎大家批评指出~
作者回复: 这么认真分析的同学,绝对是个潜力股!同学你用的女生头像,是妹子吗?还缺男朋友不,我这大把可以跟你一块debug的精壮小伙排队求介绍
2022-01-2927 - 卡特金丝雀发布在微服务之间的通过openfeign流量转发规则咋定义和实现?
作者回复: 之前使用的方式对使用webclient发起的调用可以这么使用,换成openfeign也要相应的换个姿势。我提一个研究方向,同学可以沿着这个方向看一下,根据前面我讲的Feign组件底层类结构和顺腾摸瓜的方法(debug),找到那个负责做负载均衡的client(比如从FeignLoadBalancerAutoConfiguration下去找线索),然后看一下底层注入的那个标准的spring cloud loadbalancer类是什么,然后在spring上下文中构造一个@Primary的默认主类就可以。
2022-01-178 - Nico老师,OpenFeign是自动集成了Loadbalancer了吗?以前OpenFeign是集成的ribbon,为啥现在又改为Loadbalancer?这个是出于什么考虑
作者回复: 因为Ribbon已经被spring cloud的去Netflix化大方向给剔除掉了,现在官方组件的新版本里已经找不到Ribbon的依赖项了,所以新版本用loadbalancer是唯一的选项。但有一说一,我觉得loadbalancer的功能相比Ribbon来说还有点距离,从内置负载均衡策略上就比ribbon差了很多。没辙,spring官方社区不能容忍“断更”的组件
2022-01-084 - peter老师您好,我有4个问题,请指教:Q1:“构造请求路径、降级方法”,这句话中的“降级”是不是笔误? Q2:openfeign是否可以认为是webclient的一个升级版本? Q3:netflix体系中,feign是对ribbon的封装,feign的底层用的是ribbon,那么,openfeign的底层也是用webclient吗? Q4: webclient只是webflux的一个很小的部分,而且不是webflux的主要功能,对吗?
作者回复: Q:降级不是笔误,当调用请求失败了,转而去执行一段“降级”逻辑,其实把它叫做异常处理逻辑也可以。 Q2: openfeign不是webclient的升级版本,你可以把它理解为另一套技术选型,是实现同一个目的的两种不同的手段。 Q3: openfeign背后的技术非常底层,如果追根溯源其实是使用了java.net包下的原生HttpURLConnection,同学可以打开Client类看一下convertAndSend的源码 Q4: 没错webclient是webflux的冰山一角 Q3
2022-01-074 - so long这个是不是和mybatis创建数据访问接口的代理类的过程差不多
作者回复: 万变不离其宗,一个典型的现象就是不写实现通过接口声明就能实现业务逻辑的,底层基本都是用了动态代理做proxy
2022-01-0722 - 与路同飞如果公司用的是api网关去代理请求的。是不是就没有必要用openFeign了。没有服务名并且path也不一样
作者回复: 如果是api网关代理请求,那么本质上就不是基于服务发现技术构建的,因为请求必须绕网关,不是从服务注册表里直连目标服务
2022-01-201 - 西门吹牛老师,关于 OpenFeign 这样基于 HTTP 的远程调用,和 dubbo 这样基于 TCP 的远程调用,使用时候有什么选型建议吗?感觉 dubbo 的性能要好很多
作者回复: 国内环境下dubbo使用居多,包括我自己也是dubbo和hsf用的更多一些,从体感上来说RPC确实更方便一些。如果在国外公司任职的话,dubbo就销声匿迹了,主要还是看自己公司的技术栈
2022-05-12 - 逝影落枫类似的还有retrofit 和forest吧2022-01-071
- sekerOpenFeign的动态代理流程图中,LocalService是指代前文的HelloWorldService吗?还是说LocalService是OpenFeign源码中真实存在的一个interface?2023-07-15归属地:广东
- 第一装甲集群司令克莱斯特源码之下,了无秘密㊙️2022-01-07