背景
公司的一个项目中,有一块功能需要查询数据表,看着平台上其他地方有现成的接口准备拿来就用,但是现成的接口在另一个服务中,因此想到使用OpenFeign来实现不同服务的接口远程调用,况且OpenFeign本身的作用就是提高微服务开发的效率。
分析并整合OpenFeign
如图,我需要远程调用的接口在 core 服务中,调用方为 archive 服务,以下将archive称为服务消费者,core称为服务提供者

由于要使用OpenFeign,因此幽络源站长这里需先查看服务消费者archive是否包含了OpenFeign依赖,当然如果项目有公共模块的话,建议将依赖添加到公共模块,在上图可以看到本项目是具备公共模块的 common,因此我将OpenFeign加入到该模块中,代码与图如下
<!--远程调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

在common加入了新的依赖后,由于服务消费者archive是引入了common的,需要更新依赖,因此先对common进行clean再install,再对archive进行clean再package。
最后,在服务消费者archive的入口main函数上加上注解@EnableFeignClients来开启OpenFein,如图

分析并使用OpenFeign
步骤一:知晓需要远程调用的接口
这里需要远程调用的接口为 服务提供者core 中的 getPhotoList,代码如下
@Api(tags = "质量管理")
@RestController
@RequestMapping("/qm/qltyInsp")
public class QmQltyInspController extends BaseController {
@ResponseBody
@RequestMapping(value = "/getPhotoList", method = RequestMethod.POST)
@ApiOperation(value = "获取照片列表", notes = "获取照片列表")
public ResponseResult<List<QmPhotoVO>> getPhotoList(@RequestBody QmPhotoDTO phtooDTO) {
if (StringUtils.isBlank(phtooDTO.getTaskId())) {
return ResponseResult.error("任务ID不能为空!");
}
if (StringUtils.isBlank(phtooDTO.getTowerId())) {
return ResponseResult.error("杆塔ID不能为空!");
}
return inspectionService.getPhotoList(phtooDTO, this.getUserInfo());
}
}
且 服务消费者core的yaml配置代码为如下
# 服务器配置
server:
port: 9010
servlet:
context-path: /sguav-cloud-core # 项目前缀
# 数据库配置
spring:
application:
name: sguav-cloud-core-service #服务名称
由上面的 接口 和yaml配置中的 上下文路径 context-path 与 服务名 name 可知
在 服务消费者archive 中需要远程调用的接口路径为
http://192.168.8.200:9010/sguav-cloud-core/qm/qltyInsp/getPhotoList
当然,由于这个项目中使用了注册中心eureka,因此也可以通过如下路径远程调用(并且这种方式是最推荐的,注册中心幽络源推荐使用nacos,而不是eureka)
http://sguav-cloud-core-service/sguav-cloud-core/qm/qltyInsp/getPhotoList
步骤二:创建OpenFeign客户端接口
在 服务消费者archive 项目下创建一个空的包,命名为 feign,专门用于存放feign接口。
然后在feign包下 创建 OpenFeign客户端接口interface,因为要远程调用的服务为core中的接口,这里命名为 SguavCloudCoreServiceFeign,当然,这不是强制的,可以任意命名。
在步骤一种由core接口getPhotoList和core的yaml可知:
core的服务名为 sguav-cloud-core-service
core的上下文路径为 /sguav-cloud-core
要调用的接口路径 为 /qm/qltyInsp/getPhotoList
因此SguavCloudCoreServiceFeign 中的代码为如下
@FeignClient(
name = "sguav-cloud-core-service",
path = "/sguav-cloud-core"
)
public interface SguavCloudCoreServiceFeign {
@RequestMapping(value = "/qm/qltyInsp/getPhotoList",method = RequestMethod.POST)
ResponseResult<List<QmPhotoVO>> getPhotoList(@RequestBody QmPhotoDTO phtooDTO);
}
其中,@FeignClient注解主要标识core的服务名和上下文路径,具体接口主要对应core中的getPhotoList接口,若还不明白,看下图对比

步骤三:迁移相关数据对象
由core中的接口可知,这里有两个数据对象,分别为QmPhotoVO,QmPhotoDTO,需要将其在archive中也复制一份供使用(如果你的接口没用自定义的数据对象可以跳过这步)

我这里在archive服务下的feign包下创建了一个名为feignDTO的包,将数据对象统一放到这里,如图

步骤四:使用OpenFeign远程调用接口
以上所有工作完成后,最后便是使用,使用就比较简单了,直接注入调用即可,如下我在需要使用的类中将其注入

然后在该类中需要使用的地方中通过注入的feign接口调用函数即可,如图在gene03方法中进行远程调用接口

至此,服务消费者archive中的gene03方法将能够 通过OpenFegin 来远程调用 服务提供者core 中的getPhotoList接口了。
一些问题解决记录
如果你是在本地环境做以上操作,会畅通无阻,但如果是 两台不同的 服务器上做 OpenFeign,你需要开启 服务提供者所在服务器的端口,否则会访问失败。
本文中服务提供者core通过yaml可知是启动于9010端口的,因此若要在两台不同的 服务器上正常使用,还需开启9010端口。开启方式如下:
# CentOS
sudo firewall-cmd --list-ports #检查放行的端口
sudo firewall-cmd --add-port=9010/tcp --permanent #放行9010端口
sudo firewall-cmd --reload #重新加载防火墙
# Ubuntu
sudo ufw allow 9010/tcp
如图

结语
以上是幽络源原创文章的 微服务SpringCloud之OpenFeign远程调用整合使用与问题解决记录,如有不懂之处,或对java感兴趣想交流技术的小伙伴,可以加入我们的官方QQ群307531422。

