1. 序言

从2022年1月份梳理《MYSQL常用函数(2)——正则相关》至今,已是半年左右的时间,在这段时间里,其实,需要记录的挺多的,因为2月份之后的几个月,着实挺忙的,忙的时候,也就把本该记录的给落下了。既然落下了,要补起来是不可能的,就把记得的给记录下来吧。下面进入正题,前段时间,因为项目需要,梳理了go-fastDFS分布式文件系统搭建(实现梳理),就把其顺带记录下来。

2. 资源下载安装

go-fastdfs服务器和go-fastdfs-web监控工具的下载地址参考如下官网地址:

go-fastdfs (go语言版本的FastDFS)
项目地址:https://github.com/sjqzhang/go-fastdfs
编译版本下载地址:https://github.com/sjqzhang/go-fastdfs/releases

go-fastdfs-web 监控工具
项目地址:https://github.com/perfree/go-fastdfs-web
各打包版本下载地址:https://github.com/perfree/go-fastdfs-web/releases

3. 服务器目录级别的约定

现假设已完成了go-fastdfs的下载和运行,那么,下一步需要做的,就是如何使用go-fastdfs进行文件的存储。对于文件服务器来说,需要指定不同的场景,比如:存储合同管理里面的合同信息对应一个场景;存储通知公告里面的附件,对应一个场景,等。

4. Java流式版本调用go-fastDFS的几种方式

在介绍Java流式版本调用go-fastDFS的几种方式之前,先简单介绍一下Java本地调用的方式。依赖(这里使用了hutool工具包,更简便)

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.4.3</version>
</dependency>

上传代码

public static void main(String[] args) {//文件地址File file = new File("D:\\git\\2.jpg");//声明参数集合HashMap<String, Object> paramMap = new HashMap<>();//文件paramMap.put("file", file);//输出paramMap.put("output","json");//自定义路径paramMap.put("path","image");//场景paramMap.put("scene","image");//上传String result= HttpUtil.post("http://xxxxx:xxxx/group1/upload", paramMap);//输出json结果System.out.println(result);
}

(1)hutool的HttpUtil方式

java版本流式上传
Hutool-http、HttpClient、OkHttp3多种方式流式文件上传 由于有不少人问到上面的问题,现在本人总结了一个常用的几种http客户端文件流式上传的方式,相当于给自己做下记录,同时也给有这方面疑问的朋友一个借鉴。废话不多说,直接上代码吧。代码是基于springboot的maven工程。

Hutool-http方式 先在pom中添加hutool的依赖

 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>4.5.1</version></dependency>

接着在Controller中代码示例

@RequestMapping("/upload")public String  upload(MultipartFile file) {String result = "";try {InputStreamResource isr = new InputStreamResource(file.getInputStream(),file.getOriginalFilename());Map<String, Object> params = new HashMap<>();params.put("file", isr);params.put("path", "86501729");params.put("output", "json");String resp = HttpUtil.post(UPLOAD_PATH, params);Console.log("resp: {}", resp);result = resp;} catch (IOException e) {e.printStackTrace();}return result;}

(2)HttpClient方式

HttpClient方式 pom依赖

<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId>
</dependency>
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpmime</artifactId>
</dependency>

接着在Controller中代码示例

 @RequestMapping("/upload1")public String upload1(MultipartFile file) {String result = "";try {CloseableHttpClient httpClient = HttpClientBuilder.create().build();CloseableHttpResponse httpResponse = null;RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(200000).setSocketTimeout(2000000).build();HttpPost httpPost = new HttpPost(UPLOAD_PATH);httpPost.setConfig(requestConfig);MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create().setMode(HttpMultipartMode.BROWSER_COMPATIBLE).setCharset(Charset.forName("UTF-8")).addTextBody("output", "json").addBinaryBody("file", file.getInputStream(),ContentType.DEFAULT_BINARY, file.getOriginalFilename());httpPost.setEntity(multipartEntityBuilder.build());httpResponse = httpClient.execute(httpPost);if (httpResponse.getStatusLine().getStatusCode() == 200) {String respStr = EntityUtils.toString(httpResponse.getEntity());System.out.println(respStr);result = respStr;}httpClient.close();httpResponse.close();} catch (Exception e) {e.printStackTrace();}return result;}

(3)OKHttp3方式

OkHttp3上传示例 pom文件依赖

 <dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.9.1</version></dependency>

接着在Controller中代码示例

@RequestMapping("/upload2")public String upload2(MultipartFile file) {String result = "";try {OkHttpClient httpClient = new OkHttpClient();MultipartBody multipartBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("file", file.getOriginalFilename(),RequestBody.create(MediaType.parse("multipart/form-data;charset=utf-8"),file.getBytes())).addFormDataPart("output", "json").build();Request request = new Request.Builder().url(UPLOAD_PATH).post(multipartBody).build();Response response = httpClient.newCall(request).execute();if (response.isSuccessful()) {ResponseBody body = response.body();if (body != null) {result = body.string();System.out.println(result);}}} catch (Exception e) {e.printStackTrace();}return result;}

5. 实施中注意事项

上面给出了几个示例,是不是都挺简单的?通过这种方式,就可以在Controller中做中转了,还是挺方便的。顺便提一下,上面几种方式中,我个人觉得Hutool的是最简单的,最方便的,对于HttpClient而言,概念比较多,显得相对复杂,OkHttp也一样,不过比HttpClient显得优雅点。针对一般的并发量,个人觉得hutool的Http已经够用了,底层是基于jdk的HttpUrlConnection实现的。如果对性能有特殊要求的,可以考虑httpclient或者OKHttp,后两者相对而言,更推荐使用OkHttp。

综上,在系统中上传文件的时候,选择hutool的Http;如果考虑高并发量及更好的性能,选择OKHttp。
(1)UPLOAD_PATH为配置在yml文件中,go-fastDFS上传的文件路径。需要注意的是,本地环境中,该路径直接为go-fasdDFS的路径,在生产环境中,为nginx反向代理后的路径,同时,nginx的反向代理,设置的负载均衡策略,应该为基于ip_hash类型的,不能为轮询的方式。
(2)scene或者为UPLOAD_SCENE为配置在yml文件中,定义好的一个文件存储场景。
(3)path或者UPLOAD_PATH或者为空,或者根据日期时间自动生成的一个路径,推荐为空,或者参考go-fastDFS的源码,在JAVA中写一个类似的路径生成函数。
(4)数据库中,需要存储文件返回的路径。即下文中的path,注意不要存储url,当发生迁移的时候,对应的IP地址可能会发生变化(同时,可以考虑存储md5、size,等信息)。

请求示例如下所示:

{"data": {"domain": "http://172.22.2.97:9900","md5": "007a3d5690ba8b9f848e538c8b06eb91","mtime": 1648468521,"path": "/group1/scenes001/20220328/19/55/0/通知公告.png","retcode": 0,"retmsg": "","scene": "scenes001","scenes": "scenes001","size": 884282,"src": "/group1/scenes001/20220328/19/55/0/通知公告.png","url": "http://172.22.2.97:9900/group1/scenes001/20220328/19/55/0/通知公告.png?name=%E9%80%9A%E7%9F%A5%E5%85%AC%E5%91%8A.png&download=1"},"message": "","status": "ok"
}{"data": {"domain": "http://172.22.2.97:9900","md5": "790be675f161c8db8ab6eecda7753a4c","mtime": 1648535006,"path": "/group1/scenes001/20220329/14/23/0/fd92c4bbf158a0c4fafac5f6469d165d.png","retcode": 0,"retmsg": "","scene": "scenes001","scenes": "scenes001","size": 1470184,"src": "/group1/scenes001/20220329/14/23/0/fd92c4bbf158a0c4fafac5f6469d165d.png","url": "http://172.22.2.97:9900/group1/scenes001/20220329/14/23/0/fd92c4bbf158a0c4fafac5f6469d165d.png?name=fd92c4bbf158a0c4fafac5f6469d165d.png&download=1"},"message": "","status": "ok"
}

关于上传下载更多的内容,请参考官方文档

6. 结语

截至2022年7月1日,毕业后已经工作十年了,这期间,走的弯路太多。如下图所示:

然而,却无法避免。当然,也加深了对社会和自己的认识。毕竟,作为普通人,路都是靠自己一步一个脚印走出来的。正如罗曼罗兰所说的,“世界上只有一种英雄主义,就是看清生活的真相之后,依然热爱生活。”未来所希望的是,少一点弯路,多一点进步。

对于新知识的渴求,不在于知识本身,而在于新知识能够解决复杂的问题,也在于新知识能够让曾经无序的思维变得有序,在于新知识能够让工作变得高效,让遇到的问题都能够找到好的对应的解决方案。
(好记性不如烂笔头。对抗遗忘的最好方式是:在解决问题的时候,记录下遇到的问题和解决的方式,后续遇到相同的问题,只需要翻翻笔记即可。)

go-fastDFS 分布式文件系统搭建(实现梳理)相关推荐

  1. 搭建自己的云存储空间|FastDFS分布式文件系统考虑一下?

    一. 前言 最近有很多小伙伴问壹哥,大规模的文件存储该怎么做? 这个感觉很难实现呢.其实这个需求,并没有大家想的那么难以实现.今天壹哥就带着各位,用10分钟的时间来搞定这个需求.不信?那你就跟着壹哥一 ...

  2. FastDFS分布式文件系统(详细入门级介绍)

    分布式文件系统 (Distributed File System) 是一个软件/软件服务器: 这个软件可以用来管理文件: 但这个软件所管理的文件通常不是在一个服务器节点上,而是在多个服务器节点上,这些 ...

  3. 大量文件不知道 怎么管理,快试试FastDFS(分布式文件系统)

    FastDFS(分布式文件系统)入门到精通 GitHub:个人GitHub Blog: 个人博客 1 什么是FastDFS 1.1 简介 FastDFS是用c语言编写的一款开源的分布式文件系统,它是由 ...

  4. FastDFS 分布式文件系统详解

    FastDFS 分布式文件系统详解 什么是文件系统 文件系统是操作系统用于在磁盘或分区上组织文件的方法和数据结构.磁盘空间是什么样的我们并不清楚,但文件系统可以给我们呈现一个非常清晰的表象,我们可以创 ...

  5. FastDFS分布式文件系统使用手册

    FastDFS分布式文件系统使用手册 1.概述 1.1.FastDFS简介 FastDFS是由国人余庆所开发,其项目地址:https://github.com/happyfish100,FastDFS ...

  6. FastDFS分布式文件系统详解

    FastDFS 简介 FastDFS 是基于 C 语言开发的,是一个轻量级开源的高性能分布式文件系统.主要功能有:文件存储.文件同步.文件访问(文件上传/下载),解决了大容量的文件存储和高并发访问的问 ...

  7. Spark环境搭建(一)-----------HDFS分布式文件系统搭建

    下载的压缩文件放在~/software/    解压安装在~/app/ 一:分布式文件系统搭建HDFS 1,下载Hadoop HDFS环境搭建    使用版本:hadoop-2.6.0-cdh5.7. ...

  8. Fastdfs分布式文件系统的应用

    2019独角兽企业重金招聘Python工程师标准>>> 26 MARCH 2016 on fastdfs, 分布式文件系统 我们在实际项目中常常遇到这样的应用场景,用户需要上传图片, ...

  9. Docker安装FastDFS分布式文件系统

    Docker安装FastDFS分布式文件系统: 1.首先下载FastDFS文件系统的docker镜像 2.拉取镜像 3.查看镜像 4.使用docker镜像构建tracker容器(跟踪服务器,起到调度的 ...

  10. Linux - 搭建FastDFS分布式文件系统

    1. FastDFS简介 说明:FastDFS简介部分的理论知识全部来自于博主bojiangzhou的 <用FastDFS一步步搭建文件管理系统>,在此感谢博主的无私分享.当然最最要感谢的 ...

最新文章

  1. 帆软填报增加记录提交成功后没有_大病医疗填报图解
  2. BiLSTM+CRF的损失由发射矩阵和转移矩阵计算而得 BiLSTM+CRF命名实体识别:达观杯败走记(下篇
  3. vs2015 单元测试 linux,VS2015做单元测试
  4. Android之二维码生成和识别
  5. gsm模块网站服务器,gsm模块是什么_gsm模块工作原理_gsm模块的应用
  6. JAVA本地文本读取---解决中文乱码
  7. jquery刷新iframe页面的方法
  8. 内插函数恢复模拟信号
  9. idea切换工作空间_IDEA在一个工作空间中管理多个项目的详细步骤
  10. Python爬虫 9-Scrapy框架初探
  11. 查询学过“叶平”老师所教的所有课的同学的学号、姓名
  12. java贪吃蛇课程设计知乎_Java课程设计---贪吃蛇大作战
  13. Springboot+mybatis
  14. 磁力搜索网站+下载神器放送2019-03-05
  15. 用了python之后笔记本卡了_用chrome运行的Jupyter笔记本在服务器res上卡住了
  16. 2021全球游戏市场规模及消费者主要分布情况:预计2024年全球游戏市场规模达到2187亿美元[图]
  17. setfocus属性
  18. 程序员是不是“后浪”?
  19. Draemon 360开源的基于Promtheus的升级版本告警系统
  20. 抖音只能上下滑动吗_iOS仿抖音—上下滑动播放视频

热门文章

  1. linux未找到命令rpm,RPM命令执行失败:bash: rpm: 未找到命令...
  2. 为了冰箱贴的一次渗透测试
  3. netlogo-入门-学习记录
  4. 什么是java框架结构_Java框架概述
  5. note2 android4.3,三星N7100/note2官方4.3原版线刷版N7100ZCUENB1
  6. ideaIU-2017安装破解及汉化全包
  7. 【Matlab绘图进阶第2弹】Matlab绘制论文柱状图
  8. Vrep基础部分(二)
  9. 纪广华老师:谈谈学习数论的参考书
  10. 微信小程序布局理解——flex、block、inline