微服务SpringCloud之OpenFeign远程调用整合使用与问题解决记录-幽络源原创

微服务SpringCloud之OpenFeign远程调用整合使用与问题解决记录-幽络源原创

背景

公司的一个项目中,有一块功能需要查询数据表,看着平台上其他地方有现成的接口准备拿来就用,但是现成的接口在另一个服务中,因此想到使用OpenFeign来实现不同服务的接口远程调用,况且OpenFeign本身的作用就是提高微服务开发的效率。

分析并整合OpenFeign

如图,我需要远程调用的接口在 core 服务中,调用方为 archive 服务,以下将archive称为服务消费者,core称为服务提供者

ad33f6b9-6987-4181-9b78-8f352bf8aa9d

由于要使用OpenFeign,因此幽络源站长这里需先查看服务消费者archive是否包含了OpenFeign依赖,当然如果项目有公共模块的话,建议将依赖添加到公共模块,在上图可以看到本项目是具备公共模块的 common,因此我将OpenFeign加入到该模块中,代码与图如下

<!--远程调用-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

eaa11cac-8b83-452c-913d-2f8894e5709a

在common加入了新的依赖后,由于服务消费者archive是引入了common的,需要更新依赖,因此先对common进行clean再install,再对archive进行clean再package。

最后,在服务消费者archive的入口main函数上加上注解@EnableFeignClients来开启OpenFein,如图

c86ff6e0-66d8-4049-a0ba-cc76cb6d0a13

分析并使用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接口,若还不明白,看下图对比

09a1aff3-6247-477a-9565-52829cef5e75

步骤三:迁移相关数据对象

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

1f40525c-d61f-446e-a192-e766f6a769fa

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

fe6f1004-b9cc-404c-a973-f7682ec5f769

步骤四:使用OpenFeign远程调用接口

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

8b7e875c-0b03-4e7d-b9db-f812b4a428e3

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

84b45a0b-6e1f-4bd1-adf3-dc589e483be1

至此,服务消费者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

如图

ac82218e-0be8-4191-9798-cf2dc5f978a5

结语

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

THE END
喜欢就支持一下吧
分享