Spring Cloud 微服务项目实战
姚秋辰(姚半仙)
PayPal 研发经理
15862 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 38 讲
结束语 (1讲)
Spring Cloud 微服务项目实战
15
15
1.0x
00:00/00:00
登录|注册

12 | OpenFeign:服务间调用组件 OpenFeign 是怎么“隔空取物”的?

你好,我是姚秋辰。
在前面的课程中,我们借助 Nacos 的服务发现能力,使用 WebClient 实现了服务间调用。从功能层面上来讲,我们已经完美地实现了微服务架构下的远程服务调用,但是从易用性的角度来看,这种实现方式似乎对开发人员并不怎么友好。
我们来回顾一下,在前面的实战项目中,我是怎样使用 WebClient 发起远程调用的。
webClientBuilder.build()
// 声明这是一个POST方法
.post()
// 声明服务名称和访问路径
.uri("http://coupon-calculation-serv/calculator/simulate")
// 传递请求参数的封装
.bodyValue(order)
.retrieve()
// 声明请求返回值的封装类型
.bodyToMono(SimulationResponse.class)
// 使用阻塞模式来获取结果
.block()
从上面的代码我们可以看出,为了发起一个服务请求,我把整个服务调用的所有信息都写在了代码中,从请求类型、请求路径、再到封装的参数和返回类型。编程体验相当麻烦不说,更关键的是这些代码没有很好地践行职责隔离的原则。
在业务层中我们应该关注具体的业务实现,而 WebClient 的远程调用引入了很多与业务无关的概念,比如请求地址、请求类型等等。从职责分离的角度来说,我们应该尽量把这些业务无关的逻辑从业务代码中剥离出去
那么,Spring Cloud 中有没有一个组件,在实现远程服务调用的同时,既能满足简单易用的接入要求,又能很好地将业务无关的代码与业务代码隔离开呢?
这个可以有,今天我就来带你了解 Spring Cloud 中的一个叫做 OpenFeign 的组件,看看它是如何简化远程服务调用的,除此之外,我还会为你详细讲解这背后的底层原理。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

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-29
    27
  • 卡特
    金丝雀发布在微服务之间的通过openfeign流量转发规则咋定义和实现?

    作者回复: 之前使用的方式对使用webclient发起的调用可以这么使用,换成openfeign也要相应的换个姿势。我提一个研究方向,同学可以沿着这个方向看一下,根据前面我讲的Feign组件底层类结构和顺腾摸瓜的方法(debug),找到那个负责做负载均衡的client(比如从FeignLoadBalancerAutoConfiguration下去找线索),然后看一下底层注入的那个标准的spring cloud loadbalancer类是什么,然后在spring上下文中构造一个@Primary的默认主类就可以。

    2022-01-17
    8
  • Nico
    老师,OpenFeign是自动集成了Loadbalancer了吗?以前OpenFeign是集成的ribbon,为啥现在又改为Loadbalancer?这个是出于什么考虑

    作者回复: 因为Ribbon已经被spring cloud的去Netflix化大方向给剔除掉了,现在官方组件的新版本里已经找不到Ribbon的依赖项了,所以新版本用loadbalancer是唯一的选项。但有一说一,我觉得loadbalancer的功能相比Ribbon来说还有点距离,从内置负载均衡策略上就比ribbon差了很多。没辙,spring官方社区不能容忍“断更”的组件

    2022-01-08
    4
  • 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-07
    4
  • so long
    这个是不是和mybatis创建数据访问接口的代理类的过程差不多

    作者回复: 万变不离其宗,一个典型的现象就是不写实现通过接口声明就能实现业务逻辑的,底层基本都是用了动态代理做proxy

    2022-01-07
    2
    2
  • 与路同飞
    如果公司用的是api网关去代理请求的。是不是就没有必要用openFeign了。没有服务名并且path也不一样

    作者回复: 如果是api网关代理请求,那么本质上就不是基于服务发现技术构建的,因为请求必须绕网关,不是从服务注册表里直连目标服务

    2022-01-20
    1
  • 西门吹牛
    老师,关于 OpenFeign 这样基于 HTTP 的远程调用,和 dubbo 这样基于 TCP 的远程调用,使用时候有什么选型建议吗?感觉 dubbo 的性能要好很多

    作者回复: 国内环境下dubbo使用居多,包括我自己也是dubbo和hsf用的更多一些,从体感上来说RPC确实更方便一些。如果在国外公司任职的话,dubbo就销声匿迹了,主要还是看自己公司的技术栈

    2022-05-12
  • 逝影落枫
    类似的还有retrofit 和forest吧
    2022-01-07
    1
  • seker
    OpenFeign的动态代理流程图中,LocalService是指代前文的HelloWorldService吗?还是说LocalService是OpenFeign源码中真实存在的一个interface?
    2023-07-15归属地:广东
  • 第一装甲集群司令克莱斯特
    源码之下,了无秘密㊙️
    2022-01-07
收起评论
显示
设置
留言
10
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部