Springcloud微服务应用之使用FeignClient跨服务上传解决办法

Springcloud微服务应用之使用FeignClient跨服务上传解决办法


Springcloud微服务应用之使用FeignClient跨服务上传解决办法_第1张图片

在使用SpringCloud,各服务间进行调用,假设存在文件服务,即有文件上传的需要,需要跨服务调用。

早期的Spring Cloud中,Feign本身是没有上传文件的能力的(1年之前),要想实现这一点,需要自己去编写Encoder 去实现上传。现在我们幸福了很多。因为Feign官方提供了子项目feign-form ,其中实现了上传所需的 Encoder

注:笔者测试的版本是Edgware.RELEASE。Camden、Dalston同样适应本文所述。

1 pom依赖添加

<dependency>
    <groupId>io.github.openfeign.form</groupId>
    <artifactId>feign-form</artifactId>
	<version>3.0.3</version>
</dependency>
<dependency>
	<groupId>io.github.openfeign.form</groupId>
	<artifactId>feign-form-spring</artifactId>
	<version>3.0.3</version>
</dependency>

2 FeignClient编写

@FeignClient(name = "要调用服务的spring.application.name", configuration = UploadFeignClient.MultipartSupportConfig.class)
public interface UploadFeignClient {
    @RequestMapping(value = "/upload", method = RequestMethod.POST,
            produces = {MediaType.APPLICATION_JSON_UTF8_VALUE},
            consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    @ResponseBody
    String handleFileUpload(@RequestPart(value = "file") MultipartFile file);

    class MultipartSupportConfig {
        @Bean
        public Encoder feignFormEncoder() {
            return new SpringFormEncoder();
        }
    }
}

3 注意

  • produecesconsumes 不能少
  • 接口定义中的注解@RequestPart(value = "file") 不能写成@RequestParam(value = "file")
  • 最好将Hystrix的超时时间设长一点,例如5秒,否则可能文件还没上传完,Hystrix就超时了,从而导致客户端侧的报错。

原文来自

  • http://www.itmuch.com/spring-cloud-sum/spring-cloud-feign-upload/ 使用Spring Cloud Feign上传文件

你可能感兴趣的:(SpringCloud,微服务)