Feign的服务间文件上传-Finchley

竹智熊猫 2019年12月25日 164次浏览

前提:目前有俩个服务,一个服务为服务提供者,本例中为文件服务,另一个为服务消费者,本例中为上传文件的服务。 在微服务中,可能有这样的场景,一个服务中产生一个文件(例:Excel)需要持久化保存到文件服务器中,那么文件服务器拿到文件就可以,以不同的方式持久化文件,这样的话无需在其他服务中即消费者写关于持久化文件的内容,只需要简单的通用Http这样的简单协议即可。

网络中一直说官方Feign本身并不支持传文件,所以其他文章都是通过添加io.github.openfeign.form包来实现。

但是在实践中可以有俩种方式,一个就是上面说的通过修改form表单来实现,另外一个就简单一些,可以直接传输二进制byte[]

本文环境:

版本
SpringBoot2.0.6.RELEASE
CloudFinchley.SR2

第一种方式 修改form表单

服务提供者(文件服务)

这个只是添加一个Controller,功能为收到文件返回该文件的文件名

@RestController
public class UploadController {
    @PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    public String fileUpload(@RequestPart(value = "file") MultipartFile file) {
        return file.getName();
     }
}

消费者方

添加包依赖

服务提供者不需要这个包依赖,实测添加也没事。

        <dependency>
            <groupId>io.github.openfeign.form</groupId>
            <artifactId>feign-form</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>io.github.openfeign.form</groupId>
            <artifactId>feign-form-spring</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>

添加FeignClient方法

// 这里的value 为 上面的服务提供者的 `spring.application.name` 在Eureka注册的名称,也可以用ip+端口的形式
// 这里 configuration 主要是 覆盖 Feign 默认的Encoder
@FeignClient(value = "upload-server", configuration = UploadService.UserFeignConfig.class)
public interface UserFeignService {
 
    @PostMapping(value = "/uploadFile", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    String fileUpload(@RequestPart(value = "file") MultipartFile file);
 
    @Configuration
    class UserFeignConfig{
        @Bean
        public Encoder feignFormEncoder() {
            return new SpringFormEncoder();
        }
    }
 
}

调用

然后在Controller中调用UserFeignService.fileUpload 即可

// 后面在补充如何将File转为 MultipartFile

注:不要忘记在 启动类 添加注解 @EnableFeignClients

参考: 1 2