13 | OpenFeign 实战:如何实现服务间调用功能?
- 深入了解
- 翻译
- 解释
- 总结
本文详细介绍了如何使用OpenFeign实现跨服务的调用功能。通过定义Feign接口代理的方式,实现了对远程服务的简单调用。文章首先介绍了集成OpenFeign组件的步骤,然后详细讲解了如何改造远程调用过程,以及如何定义Feign接口并使用FeignClient注解来实现对目标服务的调用。通过实际代码示例展示了使用OpenFeign接口进行远程调用的简洁方式,提高了代码的可读性和可维护性。同时,还介绍了配置OpenFeign的加载路径的方式,以及推荐的加载方式。总的来说,本文通过实际案例详细介绍了OpenFeign的使用方法,对于想要了解如何使用OpenFeign实现服务间调用的读者来说,是一篇非常有价值的文章。
《Spring Cloud 微服务项目实战》,新⼈⾸单¥59
全部留言(17)
- 最新
- 精选
- 金灶沐服务提供方提取一层接口出来, 由服务提供方维护请求路径, 服务消费方,直接声明一个接口extends消费方的接口, 加上@FeignClients即可
作者回复: Bingo!同学在extends的时候加上@FeignClients的方式很好,规避了bean override的问题
2022-01-10427 - so long每个服务提供方单独添加一个openfeign的模块,服务调用方添加对应的openfeign模块即可
作者回复: bingo,我也推荐这种做法
2022-01-10215 - 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-108 - ᯤ⁵ᴳ请求异常,多次重试等使用Webclient会比较方便,@FeignClient 如何处理呢
作者回复: feign自带的重试策略比较初级,可以结合openfeign+resilience4j的方式做复杂重试规则,https://resilience4j.readme.io/docs/retry
2022-01-116 - Geek_e93c48关于老师的思考题: 做成将提供方的OpenFeign做成中间件抽离出来。 个人建议:老师是否可以在后边的文章中不仅仅讲技术落地,加入一些使用该技术在生产上的遇到的问题和排查思路,这些才是我们需要的(手动滑稽)
作者回复: 同学这个建议很好,专栏整体偏入门,没有加入太多线上案例分析,后面会分享一些线上的使用场景
2022-01-106 - 欢沁老师你好,微服务的数据库分库后,如果A服务要展示的数据需要和B数据库的表关联,微服务划分后,数据库层面就没法做join操作,企业现在通用的方式是怎么处理的。我目前的解决方法是通过feign来调用其他服务获取数据,再插到A服务的对象中,如果遇到关联的表多,就需要feign调用多次,我不认为这是一个好的解决方法,这样的话代码量会堆积非常多,如果没有划分数据库的话,只要通过join就解决问题了。 所以概括就是,我需要关联到其他服务的数据库的表,没法join,我应该怎么做,谢谢老师。
作者回复: 其实在三高应用中同一个微服务库我们也不推荐使用join这类操作,如果是实时性要求不高的场景,把各个微服务表里的数据做一层数据异构,异构到非结构化数据库里,比如opensearch, ES里面,然后再做查找。 如果是实时性要求很高的数据必须查DB,三高服务我推荐你把join逻辑放到代码层来实现,给到DB的尽可能都走主键索引计划。如果非要用join,一定确保调出sql执行计划确保每一步都走索引并且复杂度尽可能低
2022-02-254 - mars老师,能问下微服务下调用其他服务,其他服务是其他厂商的web接口,只提供过输入输出和请求地址这种,注册中心也不在一个,这种常规的http请求在微服务架构下的最佳调用实践是咋样的呢?还是继续open feign做url吗?
作者回复: 如果是外部对接,其实用feign就没啥好处了,因为feign的服务发现负载均衡都用不上,外部对接直接用最土的resttemplate或者webclient就可以。我们不用考虑它背后的负载均衡,咱调用的应该是对方给提暴露出来的一个vip url,负载均衡都在对向端管理
2022-02-0734 - 梁中华要加自定义的header头怎么办?
作者回复: 方法有很多,RequestMapping里有注解属性可以支持header,也可以使用Headers注解,还可以在Feign的拦截器里加header
2022-02-093 - Geek_a5c816这种原始openFegin的实现消费者调用提供者的时候,无法传递headers中的参数,怎么处理呢?
作者回复: 就像rpc接口调用,其实微服务之间的request大多不需要把业务参数放到header里,但openfeign依然提供了一种定制header的方式,在后面的章节里我们会结合Sentinel了解到
2022-03-182 - 寥若晨星为啥不可以直接在服务实现的接口上加@FeignClient注解呢
作者回复: FeignClient注解的目的是为了不写实现,通过接口完成远程调用,所以底层的动态代理注册流程里有一个Assert断言,限定了是从接口读取 Assert.isTrue(annotationMetadata.isInterface(), "@FeignClient can only be specified on an interface");
2022-03-111