Feign作为HTTP客户端调用远程服务

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

前言

在分布式微服务的机构体系下,我们日常开发调用内部微服务的方式通常是Feign调用,grpc、dubbo,大部分的公司后端架构基本是以Spring Cloud 体系下的,所以基本会用到Feign,Feign是 Netflix开发的声明式、模板化的HTTP客户端,具体对Feign的源码分析之前也有写过,Feign远程调用原理分析 - 掘金想了解的小伙伴具体可以参考这篇文章,本文主要介绍Feign作为客户端去调其他微服务的使用,主要是结合我日常开发的场景来做具体分析。

Feign调用远程服务

先说,我目前所在公司微服务调用的情况,也是通过Feign通信,我们知道调Feign接口,需要把被调用服务的jar包引入调用方服务的pom文件中,通过jar包中暴露的api接口进行远程调用,当然也需要在配置中心加入对应的FeignClient配置。

被调用方Feign接口暴露

244A0690-9E44-4A69-ACF3-71400BB8A544.png

Feign客户端注册

F7B96F6B-AE2F-4EAB-8B46-969A556750D0.png

调用方pom文件引入jar

[image:0CBD7317-820B-47C0-BCE9-EF41D8CEDE8D-24040-0000416206F49413/C8CDE418-12CC-4B7B-B381-4E58CB59754F.png]

C8CDE418-12CC-4B7B-B381-4E58CB59754F.png

注册中心FeignClient配置

7D05179F-44B8-4A9F-A0BB-8DBE97A3F3B9.png

以上配置完成就可以通过实现类里面注入feign接口,调用远程服务的接口了。

2330DCEA-A87C-4BC9-BFEA-7FB0BE8371F9.png

Feign通过http的方式远程调用

正常情况下,服务与服务之前可以通过FeignClient进行调用,但是我在开发的过程中遇到个情况,公司项目我是A服务,我需要去调B服务,正常是我将B服务的jar包引入我的项目里,然后通过B服务暴露的Feign接口进行调用,但是出现了一个问题,B服务又引用了common包的一些依赖,而A服务的有一些组件像Mybatis PaginationInterceptor分页拦截器、FeignConfig等一些配置,连类名都与common包的有冲突,所以引入后,项目启动就会报错。

1249EAE8-DA71-440D-9E21-6382E8E8236A.png 所以就不能通过引用jar的方式调用服务,jar包依赖的问题不能在短时间解决,那么只能通过另外一种调用方式了,通过在A服务写FeignClient,通过URL的方式指向B服务。

A服务Feign定义

4726C615-6313-41B8-A1E6-4793EFA88DD7.png

572B8266-2284-41F4-AC0E-5F2205B12A77.png

这里我通过URL,读取配置中心B服务的域名,直接通过http的方式请求B服务,当然B服务也需要通过controller提供接口名

Controller:

3674E186-3563-466B-A00F-51431D3A6C99.png

Service:

20BFE83A-426F-42A6-BB02-17A9BDCA18CB.png

Serviceimpl:

3041ADF1-28EE-473A-BB26-09F6D6287DBD.png

这样就可以通过http的请求调用远程服务,当然也可以通过httpClient的方式去调远程服务,当然这需要写http配置类,由于都是内部服务所以就没有去用这种方式调用。

总结

Feign的调用确实很多方便简洁,可以省去很多代码, 但是项目之前jar包依赖的问题确实我们日常开发中需要主要的一个地方,不然就向我目前公司项目这样,A服务用的是一个开源的服务,里面基本集成东西有,并没有集成内部common包,所以就会出现这种情况,总结一下好好学技术,所遇到的问题总有很多种解决方式,如果不学的话那么就走到了死胡同了~

猜你喜欢

转载自juejin.im/post/7178040651500486714
今日推荐