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

13 | OpenFeign 实战:如何实现服务间调用功能?

你好,我是姚秋辰。
在上一讲中,我带你了解了 OpenFeign 组件的设计目标和要解决的问题。今天我们来学习如何使用 OpenFeign 实现跨服务的调用,通过这节课的学习,你可以对实战项目中的 WebClient 请求做大幅度的简化,让跨服务请求就像调用本地方法一样简单。
今天我要带你改造的项目是 coupon-customer-serv 服务,因为它内部需要调用 template 和 calculation 两个服务完成自己的业务逻辑,非常适合用 Feign 来做跨服务调用的改造。
在集成 OpenFeign 组件之前,我们需要把它的依赖项 spring-cloud-starter-OpenFeign 添加到 coupon-customer-impl 子模块内的 pom.xml 文件中。
<!-- OpenFeign组件 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
在上面的代码中,你并不需要指定组件的版本号,因为我们在顶层项目中定义的 spring-cloud-dependencies 依赖项中已经定义了各个 Spring Cloud 的版本号,它们会随着 Maven 项目的继承关系传递到子模块中。
添加好依赖项之后,我们就可以进行大刀阔斧的 OpenFeign 改造了。在 coupon-customer-impl 子模块下的 CouponCustomerServiceImpl 类中,我们通过 WebClient 分别调用了 template 和 calculation 的服务。这节课我先来带你对 template 的远程调用过程进行改造,将其替换为 OpenFeign 风格的调用。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文详细介绍了如何使用OpenFeign实现跨服务的调用功能。通过定义Feign接口代理的方式,实现了对远程服务的简单调用。文章首先介绍了集成OpenFeign组件的步骤,然后详细讲解了如何改造远程调用过程,以及如何定义Feign接口并使用FeignClient注解来实现对目标服务的调用。通过实际代码示例展示了使用OpenFeign接口进行远程调用的简洁方式,提高了代码的可读性和可维护性。同时,还介绍了配置OpenFeign的加载路径的方式,以及推荐的加载方式。总的来说,本文通过实际案例详细介绍了OpenFeign的使用方法,对于想要了解如何使用OpenFeign实现服务间调用的读者来说,是一篇非常有价值的文章。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Spring Cloud 微服务项目实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(17)

  • 最新
  • 精选
  • 金灶沐
    服务提供方提取一层接口出来, 由服务提供方维护请求路径, 服务消费方,直接声明一个接口extends消费方的接口, 加上@FeignClients即可

    作者回复: Bingo!同学在extends的时候加上@FeignClients的方式很好,规避了bean override的问题

    2022-01-10
    4
    27
  • so long
    每个服务提供方单独添加一个openfeign的模块,服务调用方添加对应的openfeign模块即可

    作者回复: bingo,我也推荐这种做法

    2022-01-10
    2
    15
  • so long
    老师,我用spring cloud alibaba搭建了公司的一个项目,服务启动后,接口的首次请求需要2-3秒钟,后续请求都在100ms左右,请问有哪些优化措施可以提高首次接口请求速度?之前使用ribbon可是设置为饿汉式加载,但是spring cloud loadbalancer好像没有饿汉式加载的配置。

    作者回复: 讲真loadbalancer的功能相比ribbon是差一截的,奈何spring cloud不愿意带ribbon玩了,也没辙。ribbon规避懒加载的原因是RibbonClient在调用期才进行初始化,不过ribbon在这个过程花费的时间并不多,只会在网络环境不好的情况下超时概率有所增加。对于loadbalancer来说,实际场景下大多数公司的做法是设置connection timeout + retry的方式来解决。如果对于一致性要求高的接口,底层要注意实现幂等性以防多次调用

    2022-01-10
    8
  • ᯤ⁵ᴳ
    请求异常,多次重试等使用Webclient会比较方便,@FeignClient 如何处理呢

    作者回复: feign自带的重试策略比较初级,可以结合openfeign+resilience4j的方式做复杂重试规则,https://resilience4j.readme.io/docs/retry

    2022-01-11
    6
  • Geek_e93c48
    关于老师的思考题: 做成将提供方的OpenFeign做成中间件抽离出来。 个人建议:老师是否可以在后边的文章中不仅仅讲技术落地,加入一些使用该技术在生产上的遇到的问题和排查思路,这些才是我们需要的(手动滑稽)

    作者回复: 同学这个建议很好,专栏整体偏入门,没有加入太多线上案例分析,后面会分享一些线上的使用场景

    2022-01-10
    6
  • 欢沁
    老师你好,微服务的数据库分库后,如果A服务要展示的数据需要和B数据库的表关联,微服务划分后,数据库层面就没法做join操作,企业现在通用的方式是怎么处理的。我目前的解决方法是通过feign来调用其他服务获取数据,再插到A服务的对象中,如果遇到关联的表多,就需要feign调用多次,我不认为这是一个好的解决方法,这样的话代码量会堆积非常多,如果没有划分数据库的话,只要通过join就解决问题了。 所以概括就是,我需要关联到其他服务的数据库的表,没法join,我应该怎么做,谢谢老师。

    作者回复: 其实在三高应用中同一个微服务库我们也不推荐使用join这类操作,如果是实时性要求不高的场景,把各个微服务表里的数据做一层数据异构,异构到非结构化数据库里,比如opensearch, ES里面,然后再做查找。 如果是实时性要求很高的数据必须查DB,三高服务我推荐你把join逻辑放到代码层来实现,给到DB的尽可能都走主键索引计划。如果非要用join,一定确保调出sql执行计划确保每一步都走索引并且复杂度尽可能低

    2022-02-25
    4
  • mars
    老师,能问下微服务下调用其他服务,其他服务是其他厂商的web接口,只提供过输入输出和请求地址这种,注册中心也不在一个,这种常规的http请求在微服务架构下的最佳调用实践是咋样的呢?还是继续open feign做url吗?

    作者回复: 如果是外部对接,其实用feign就没啥好处了,因为feign的服务发现负载均衡都用不上,外部对接直接用最土的resttemplate或者webclient就可以。我们不用考虑它背后的负载均衡,咱调用的应该是对方给提暴露出来的一个vip url,负载均衡都在对向端管理

    2022-02-07
    3
    4
  • 梁中华
    要加自定义的header头怎么办?

    作者回复: 方法有很多,RequestMapping里有注解属性可以支持header,也可以使用Headers注解,还可以在Feign的拦截器里加header

    2022-02-09
    3
  • Geek_a5c816
    这种原始openFegin的实现消费者调用提供者的时候,无法传递headers中的参数,怎么处理呢?

    作者回复: 就像rpc接口调用,其实微服务之间的request大多不需要把业务参数放到header里,但openfeign依然提供了一种定制header的方式,在后面的章节里我们会结合Sentinel了解到

    2022-03-18
    2
  • 寥若晨星
    为啥不可以直接在服务实现的接口上加@FeignClient注解呢

    作者回复: FeignClient注解的目的是为了不写实现,通过接口完成远程调用,所以底层的动态代理注册流程里有一个Assert断言,限定了是从接口读取 Assert.isTrue(annotationMetadata.isInterface(), "@FeignClient can only be specified on an interface");

    2022-03-11
    1
收起评论
显示
设置
留言
17
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部