Feign微服务间通过@RequestBody进行文件传输

在多数时候,我们都会遇见两个系统间传递文件的需求,对于这种文件传输,在之前单体应用/部署在同一台机子的时候比较好处理。

但是如今在微服务的时代,不同业务拆分成不同的模块系统,同时有可能部署在不同的服务器上,这时候要进行两个服务间传输文件就会相对困难,但并不是没有解决方案:

  • 1、采用oss存储作为唯一媒介,将文件上传到oss上,然后再进行获取
  • 2、使用feign的直接传输,但是必须得引入 feign-form 来进行传输
  • 3、就是写一个Encoder解析器

上面介绍的这几种相对来说比较复杂,但都是可以解决微服务系统间文件传输的问题。而今天我们要介绍的另外一种方案就是直接将文件转为byte,通过普通的@RequestBody形式(即json格式)进行文件传输,该方案可能不太适用于更复杂的场景,但也是笔者在写代码时候发现的另一种方法。

二、具体实现

1、本文将介绍使用feign从spring-feign-demo1 以 json形式传递文件到spring-feign-demo2的关键性代码

在spring-cloud-demo2中编写用于接收文件的DTO和Controller。

1、Controller层

@Controller
public class FeignController {

    /**
     * 接收文件
     */
    @RequestMapping(value = "/feign/send/file", method = {RequestMethod.POST})
    @ResponseBody
    public String performController(@RequestBody FeignRequestDTO requestDTO) {
        try {
            // 将demo1的文件流保存到该服务器的指定目录下
            // 注意:文件名和格式可以通过请求参数定义一个字段传输,这里不做演示
            File file = new File("D:\\demo2\\新demo1的文件.xlsx");
            FileUtils.writeByteArrayToFile(file,requestDTO.getFile());
            System.out.println("成功接收来自demo1的文件");
            // todo 读取demo2服务器的文件继续业务处理即可
        } catch (IOException e) {
            e.printStackTrace();
        }
        return "true";
    }

2、demo2的RequestDTO请求对象如下

public class FeignRequestDTO {

    /**
     * 用户编号
     */
    private String userId;

    public String getUserId() {return userId;}

    public void setUserId(String userId) { this.userId = userId;}

    /**
     * 用户名
     */
    private String userName;

    public String getUserName() { return userName;}

    public void setUserName(String userName) {this.userName = userName;}

    /**
     * 文件流(关键字段)
     */
    private byte[] file;

    public byte[] getFile() {return file;}

    public void setFile(byte[] file) {this.file = file;}
}

在spring-cloud-demo1中编写调用Demo2的Feign接口并调用。

1、Feign接口

@Component
@FeignClient(name = "spring-cloud-demo2")
public interface FeignDemo2Interface {

  /**
   * feign的对外接口请求方法
   *
   * @param requestDTO
   * @return
   */
  @RequestMapping(value = "/feign/send/file", method = {RequestMethod.POST})
  @ResponseBody
  String performController(@RequestBody FeignRequestDTO requestDTO);

}

2、demo1中的发送文件到的demo2的Controller

@Controller
public class FeignDemo1Controller {


    @Autowired
    private FeignDemo2Interface feignDemo2Interface;

    /**
     * 处理请求
     */
    @RequestMapping(value = "/feign/demo1/test", method = {RequestMethod.GET})
    @ResponseBody
    public void performController() {
        try {
            // 读取该服务器本地的文件并转换为byte
          byte[] bytes = FileUtils.readFileToByteArray(new File("D:\\demo1\\demo1的文件.xlsx"));
          // 引用demo2的对象将读取的文件进行封装,并调用demo2的方法
            FeignRequestDTO requestDTO = new FeignRequestDTO();
            requestDTO.setUserId("10000");
            requestDTO.setUserName("张三");
            requestDTO.setFile(bytes);
          String s = feignDemo2Interface.performController(requestDTO);
          System.out.println("发送文件成功");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

三、结果

1、调用demo1的controller后,即可将文件通过feign发送给demo2。
![image.png](https://upload-images.jianshu.io/upload_images/5134062-851c6c314199bfa4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240

推荐阅读:

Spring Security系列教程

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容

  • 夜里总有可恶的大灯亮着 告诉明知道又睡不着的人,这里是夜 我的拖鞋爬进小壁虎 我的脚掌接触它时 它咯咯的回头 我咯...
    锄风少年阅读 214评论 0 0
  • 看着手机屏幕显示现在是二零一八年一月一日的下午两点四十五分,李妞妞还在早班岗位上坚持着,看来又得坚持到三点半最少。...
    不安分的你阅读 616评论 0 1
  • 奥尔罕·帕莫克对待文化的态度要理性许多:不要作传统的奴隶,也别做传统的敌人。 对于今天的中国来说,很多人沉浸在自我...
    寒烟无色阅读 453评论 0 0
  • 涩 你是荒木从中的沙 对我的身体出入自由 你渴望那天池的圣水 汇入你 是否能凝固些什么 我是岩缝中的喘息 饥渴 你...
    LeaveLON阅读 268评论 0 1
  • 梁同学说,小时候他知道人要吸氧气才行,于是他很担心万一氧气一直吸被吸没了怎么办。 梁同学说,小时候奶奶告诉他,曾经...
    舒舒大人阅读 141评论 0 0