使用Docker搭建图片服务器并连接使用
一. 安装Docker
二. 安装Fastdfs文件服务器+Nginx
2.1 Fastdfs
- FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
- FastDFS 架构包括 Tracker server 和 Storage server。客户端请求 Tracker server 进行文 件上传、下载,通过 Tracker server 调度最终由 Storage server 完成文件上传和下载。
- Tracker server 作用是负载均衡和调度,通过 Tracker server 在文件上传时可以根据一些 策略找到 Storage server 提供文件上传服务。可以将 tracker 称为追踪服务器或调度服务器。
- Storage server 作用是文件存储,客户端上传的文件最终存储在 Storage 服务器上, Storageserver 没有实现自己的文件系统而是利用操作系统 的文件系统来管理文件。可以将 storage 称为存储服务器
- 服务端两个角色:
- Tracker: 管理集群,tracker 也可以实现集群。每个 tracker 节点地位平等。收集 Storage 集群的状态。
- Storage: 实际保存文件, Storage 分为多个组,每个组之间保存的文件是不同的。每 个组内部可以有多个成员,组成员内部保存的内容是一样的,组成员的地位是一致的,没有 主从的概念。
2.2 Fastdfs安装步骤
- 输入命令:
docker run -d --restart=always --privileged=true --net=host --name=fastdfs -e IP=47.95.234.255 -e WEB_PORT=80 -v ${ HOME}/fastdfs:/var/local/fdfs registry.cn-beijing.aliyuncs.com/tianzuo/fastdfs
将 47.95.234.255 切换为你自己的ip,并开放 8098、22122、23000端口号
- 测试:
docker exec -it fastdfs /bin/bash echo "Hello FastDFS!">index.html fdfs_test /etc/fdfs/client.conf upload index.html
此处是创建一个文件内容为Hello FastDFS! 的新建文件: index.html,然后上传至fastdfs服务器,
- 返回结果如图:
- 浏览器中访问,若出现如下内容则说明配置成功:
如果有问题可以看一下是否占用80端口或是否开启22122 23000端口
三. Java中配置项目并连接
3.1 实战步骤
-
在pom.xml中引入fastdfs的相关依赖:
<dependency> <groupId>com.github.tobato</groupId> <artifactId>fastdfs-client</artifactId> <version>1.26.7</version> </dependency>
-
在application.yml中配置fastdfs的相关配置:
# 分布式文件系统fastdfs配置 fdfs: # socket连接超时时长 soTimeout: 1500 # 连接tracker服务器超时时长 connectTimeout: 600 pool: # 从池中借出的对象的最大数目 max-total: 153 # 获取连接时的最大等待毫秒数100 max-wait-millis: 102 # 缩略图生成参数,可选 thumbImage: width: 150 height: 150 # 跟踪服务器tracker_server请求地址,支持多个,这里只有一个,如果有多个在下方加- x.x.x.x:port trackerList: - 你的fastdfs的ip地址:22122 # 如 :- 42.192.25.33:22122 # 存储服务器storage_server访问地址 web-server-url: http://你的fastdfs的ip地址/ spring: http: multipart: max-file-size: 100MB # 最大支持文件大小 max-request-size: 100MB # 最大支持请求大小
-
测试代码
// CSDN-暗余 public class FdfsTest { @Autowired private FastFileStorageClient storageClient; @Test public void testUpload() throws FileNotFoundException { File file = new File("G:\\img.png"); // 上传并且生成缩略图 StorePath storePath = this.storageClient.uploadFile( new FileInputStream(file), file.length(), "png", null); // 带分组的路径 System.out.println(storePath.getFullPath()); // 不带分组的路径 System.out.println(storePath.getPath()); } @Test public void testUploadAndCreateThumb() throws FileNotFoundException { File file = new File("G:\\img.png"); // 上传并且生成缩略图 StorePath storePath = this.storageClient.uploadFile( new FileInputStream(file), file.length(), "png", null); // 带分组的路径 System.out.println(storePath.getFullPath()); // 不带分组的路径 System.out.println(storePath.getPath()); } }
-
一般上传文件的方法如图:
import com.github.tobato.fastdfs.service.FastFileStorageClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; import org.springframework.web.multipart.MultipartFile; @Service public class FdfsServiceImpl { @Autowired private FastFileStorageClient storageClient; /** * 上传文件 CSDN-暗余 * @param file 上传的文件 * @return url 可访问的url路径 */ public String upload(MultipartFile file) { String originalFilename = file.getOriginalFilename(); if (!ObjectUtils.isEmpty(originalFilename)) { String[] split = originalFilename.split("\\."); try { return "http://42.192.25.33/" + storageClient.uploadFile(file.getInputStream(), file.getSize(), split.length > 0 ? split[split.length - 1] : "", null) .getFullPath(); }catch (Exception e){ e.printStackTrace(); } } // 为空或者异常,直接返回空字符串 return ""; } }
步骤4代码为核心实现,省略了Controller层,看明白的可复制稍微改动即可在此基础上复用。