weblog/doc/9、用户服务搭建与开发/9.4 引入 OpenFeign 组件:实现服务间调用.md
2025-02-17 11:57:55 +08:00

7.5 KiB
Raw Blame History

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 服务。观察对象存储服务的控制台日志,如下图所示,成功打印了接口出入参日志,说明调用成功了:

本小节源码下载

https://t.zsxq.com/ONGpj