7.5 KiB
title, url, publishedTime
| title | url | publishedTime |
|---|---|---|
| 引入 OpenFeign 组件:实现服务间调用 - 犬小哈专栏 | https://www.quanxiaoha.com/column/10312.html | null |
在上小节 中,我们已经完成了用户信息修改接口的大致逻辑,但是,调用对象存储服务上传图片这块的代码还没写。本小节中,就将引入 OpenFeign 组件,先解决服务间调用问题。
什么是 OpenFeign ?
OpenFeign 是一个声明式的 HTTP 客户端,它使得我们可以非常方便地调用 HTTP 接口。OpenFeign 是 Netflix 开源的 Feign 项目的扩展,旨在与 Spring Cloud 紧密集成。它通过注解来定义接口,类似于 Spring MVC 的控制器,使得开发者可以专注于业务逻辑,而不需要关注 HTTP 请求的具体实现。
提供一个测试接口
接下来,我们就来实际感受一下 OpenFeign 的魅力。在 xiaohashu-oss 对象存储服务,为其添加一个测试接口,用于等会测试使用。首先,在 xiaohashu-oss-biz 模块的 pom.xml 文件中,添加接口日志组件,用于等会打印接口调用日志,以便观察:
<!-- 业务接口日志组件 -->
<dependency>
<groupId>com.quanxiaoha</groupId>
<artifactId>xiaoha-spring-boot-starter-biz-operationlog</artifactId>
</dependency>
<!-- Jackson 组件 -->
<dependency>
<groupId>com.quanxiaoha</groupId>
<artifactId>xiaoha-spring-boot-starter-jackson</artifactId>
</dependency>
在 /controller 包下新建 TestFeignController 测试控制器,添加一个 /file/test 接口:
代码如下:
package com.quanxiaoha.xiaohashu.oss.biz.controller;
import com.quanxiaoha.framework.biz.operationlog.aspect.ApiOperationLog;
import com.quanxiaoha.framework.common.response.Response;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author: 犬小哈
* @date: 2024/4/4 13:22
* @version: v1.0.0
* @description: Feign 测试接口
**/
@RestController
@RequestMapping("/file")
@Slf4j
public class TestFeignController {
@PostMapping(value = "/test")
@ApiOperationLog(description = "Feign 测试接口")
public Response<?> test() {
return Response.success();
}
}
添加 OpenFeign 相关依赖
测试接口添加完毕后,编辑 xiaohashu-oss-api 模块的 pom.xml 文件,添加 OpenFeign 相关依赖,如下:
<!-- OpenFeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 负载均衡 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
Tip
:
OpenFeign通常和loadbalancer接口负载均衡组件搭配使用。
声明 FeignClient 客户端接口
在 xiaohashu-oss-api 模块中,新建 /api 包,专门用于放置 FeignClient 客户端接口,代码如下:
package com.quanxiaoha.xiaohashu.oss.api;
import com.quanxiaoha.framework.common.response.Response;
import com.quanxiaoha.xiaohashu.oss.constant.ApiConstants;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
/**
* @author: 犬小哈
* @date: 2024/4/13 22:56
* @version: v1.0.0
* @description: TODO
**/
@FeignClient(name = ApiConstants.SERVICE_NAME)
public interface FileFeignApi {
String PREFIX = "/file";
@PostMapping(value = PREFIX + "/test")
Response<?> test();
}
@FeignClient是用来标记这个接口是一个 Feign 客户端的注解。
name = ApiConstants.SERVICE_NAME指定了这个 Feign 客户端所调用的服务名称。这个名称通常是在注册中心(如 Eureka 或 Nacos)中注册的服务名称。String PREFIX = "/file";: 定义了一个前缀常量,用于接口中 URI 的路径前缀。@PostMapping注解标记这个方法将执行一个 HTTP POST 请求。
value = PREFIX + "/test"指定了这个 POST 请求的路径,这里是"/file/test"。
再新建一个 /constant 常量包,创建 ApiConstants 常量类,定义一个服务名称常量,即本身注册到 Nacos 中的服务名称:
package com.quanxiaoha.xiaohashu.oss.constant;
/**
* @author: 犬小哈
* @date: 2024/4/13 23:23
* @version: v1.0.0
* @description: TODO
**/
public interface ApiConstants {
/**
* 服务名称
*/
String SERVICE_NAME = "xiaohashu-oss";
}
到这里,对象存储服务就将 /file/test 接口的 Feign 客户端,封装到 api 模块中了,有其他服务想要调用对象存储服务的 /file/test 接口,只需引入 xiaohashu-oss-api 模块即可。
统一管理
编辑小哈书最外层的 pom.xml 文件,将 xiaohashu-oss-api模块统一管理管理起来:
<dependency>
<groupId>com.quanxiaoha</groupId>
<artifactId>xiaohashu-oss-api</artifactId>
<version>${revision}</version>
</dependency>
然后,在需要调用对象存储服务的 xiaohashu-user-biz 模块的 pom.xml 文件中,引入该依赖:
<dependency>
<groupId>com.quanxiaoha</groupId>
<artifactId>xiaohashu-oss-api</artifactId>
</dependency>
依赖引入后,记得刷新 Maven 依赖。
启用 Feign 客户端
编辑 XiaohashuUserBizApplication 启动类,添加 @EnableFeignClients 注解,以启用引入的 xiaohashu-oss-api 模块中定义好的 Feign 客户端:
代码如下:
package com.quanxiaoha.xiaohashu.user.biz;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
// 省略...
@EnableFeignClients(basePackages = "com.quanxiaoha.xiaohashu")
public class XiaohashuUserBizApplication {
// 省略...
}
服务间调用
以上工作完成后,就可以在用户服务中,注入 FileFeignApi 客户端,来调用对象存储服务的 /file/test 接口了:
在更新用户信息逻辑方法中,添加代码如下:
// 省略...
@Resource
private FileFeignApi fileFeignApi;
// 省略...
if (Objects.nonNull(avatarFile)) {
// todo: 调用对象存储服务上传文件
fileFeignApi.test();
}
// 省略...
测试一波
重启用户服务和对象存储服务,通过 Apipost 工具调用一下用户信息修改接口,看看用户服务是否能够调用的通 oss 服务。观察对象存储服务的控制台日志,如下图所示,成功打印了接口出入参日志,说明调用成功了: