大数据: http://hadoop.apache.org/
MFS: https://moosefs.com/
fastdfs:https://github.com/happyfish100/fastdfs

1.介绍fastdfs及原理

FastDFS是一款轻量级的开源分布式文件系统,它用纯C语言实现,支持Linux、FreeBSD、AIX等UNIX系统。只能通过 专有API对文件进行存取访问,不支持POSIX接口方式,不能mount使用。

原理介绍:

服务分为两大部件Tracker server和Storage server Tracker server负责调度 计算最适合的存储服务器 Storage server负责存储数组 Storage server被分为

运行过程:

1.Client询问Tracker server ,Tracker server通过负载算法 返回一台存储 的Storage server
2.Tracker server 返回的数据为该Storage server的IP地址和端口
3.Client直接和该Storage server建立连接,进行文件上传,Storage server返回新生成的文件ID,文件上传结束

在这里插入图片描述

Client客户端

Tracker服务器

1.判断有哪些存储服务器(注册中心)eureka
2.判断哪个存储服务器空间比较大
3.判断资源所在的存储服务器(路由)zuul

Storage服务器

每台Storage服务器都有一个备份Storage服务器

推荐

高可用,不会造成服务器奔溃

编辑模式

文件在文件系统存储的格式

gruop组名 如果有几台stroage服务器是相同的组名表示这些服务器是互为主从(备份)

文件格式

M数字/数字/文件
group1/M00/00/00/wKiuglwGsX-Aa62AAACf_PEcWVI803.png

关闭linux和centos防火墙

linux防火墙:systemctl disable|enable firewalld
搜索:find / -name selinuxfind / -name selinux
编辑:vi /etc/sysconfig/selinux
修改属性:

在这里插入图片描述

2.fastdfs的部署

下载fastdfs镜像:docker pull season/fastdfs
 创建trakcer容器:docker run -ti -d --name trakcer -v ~/tracker_data:/fastdfs/tracker/data --net=host season/fastdfs tracker
 注意:默认端口:22122,容器是关闭状态请设置一下防火墙。
 创建storage容器:docker run -tid --name storage -v ~/storage_data:/fastdfs/storage/data -v ~/store_path:/fastdfs/store_path --net=host -e TRACKER_SERVER:192.168.153.133:22122 season/fastdfs storage
 查看可用storage服务器在trakcer容器的
 进入:docker exec -it trakcer bash  查看:ls
 进入:cd fdfs_conf/	查看ls
 查看可用的storage服务器:fdfs_monitor storage.conf

在这里插入图片描述

将storag服务器ip注册到trakcer服务器里

进入storag容器:docker exec -it storage bash 查看ls
进入cd fsfs_conf 查看ls
查看ip地址有没有改:more storage.conf
将storage.conf文件拷贝到跟目录:docker cp storage:/fdfs_conf/storage.conf ~/
编辑: vi storage.conf修改为linux的Ip

在这里插入图片描述

修改完成后再拷贝回去:docker cp ~/storage.conf storage:/fdfs_conf/
关闭容器:docker stop storage在开启容器:**docker start storage
再次进入storag容器的storage.conf所在目录查看:fdfs_monitor storage.conf

**在这里插入图片描述**

查看22122端口是否可用

是否被占用:netstat -ano | grep 22122
是否能通:telnet localhost 22122 出现以下说明可用

在这里插入图片描述

演示上传文件

此容器只能操作文件:docker run -ti --name fdfs_sh --net=host season/fastdfs sh
将storage.conf拷贝到fdfs_sh:/fdfs_conf/目录下:docker cp ~/storage.conf fdfs_sh:/fdfs_conf/
创建一个a.txt文件:echo hello>a.txt
进入cd: fdfs_conf 上传文件:fdfs_upload_file storage.conf /a.txt 出现以下上传成功
group1/M00/00/00/wKiZhVwGlJOAYEPIAAAABncc3SA782.txt
在linux根目录
cd store_path
cd data
cd 00
cd 00
more wKiZhVwGlJOAYEPIAAAABncc3SA782.txt  结果:
hello

3.Windos上传文件与下载文件

1. 创建FASTDFS子模块项目,父模块管理版jar版本
在这里插入图片描述

2. pom.xml配置

<!-- 配置sonatype私服仓库仅本项目使用 -->
	<repositories>
		<repository>
			<id>sn</id>
			<name>sn</name>
			<url>https://oss.sonatype.org/content/repositories/releases/</url>
		</repository>
	</repositories>
	
	<dependencies>
		<!-- 引入SpringMvc -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		
		<!-- 引入mysql驱动 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<!-- 引入数据源 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-jpa</artifactId>
		</dependency>
		
		<!-- 引入fastdfs  maven库里没有所以配置了sonatype仓库 -->
		<dependency>
			<groupId>com.luhuiguo</groupId>
			<artifactId>fastdfs-spring-boot-starter</artifactId>
			<version>0.2.0</version>
		</dependency>
		
	</dependencies>

3. application.yml配置

server:
  #设置端口号
  port: 9999
fdfs:
 #访问时间秒为单位
 connect-timeout: 1000
 #响应时间秒为单位
 so-timeout: 3000
 #linux上Tracker的端口
 tracker-list:
  - 192.168.153.133:22122
spring:
  http:
   multipart:
    #设置上传文件的大小
    max-file-size: 1073741824
  #数据源连接数据库
  datasource:
    url: jdbc:mysql://localhost/unit02
    username: root
    password: ps123456
    driver-class-name: com.mysql.jdbc.Driver

4. 程序入口BootFastdfs

package cn.ps;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class BootFastdfs {
	public static void main(String[] args) {
		SpringApplication.run(BootFastdfs.class);
	}
}

5. UploadController测试

package cn.ps;

import java.io.IOException;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.ColumnMapRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import com.luhuiguo.fastdfs.domain.StorePath;
import com.luhuiguo.fastdfs.service.FastFileStorageClient;

@RestController
public class UploadController {
	
	/**
	 * 用于操作linux上的文件与下载
	 */
	@Autowired
	private FastFileStorageClient storageClient;
	
	/**
	 * 用于操作sql语句
	 */
	@Autowired
	private JdbcTemplate jt;
	
	/**
	 * MultipartFile接收上传的文件
	 * 变量名要跟浏览器传过来的文件名一致myFile
	 * FilenameUtils用来操作文件比如:截取文件后缀名
	 * @param multipartFile
	 * @return 
	 * @throws IOException 
	 */
	@PostMapping("/fupload")
	public String upload(@RequestParam("myFile") MultipartFile myFile) throws IOException {
		//获取文件后缀名
		String extension = FilenameUtils.getExtension(myFile.getOriginalFilename());
		//将文件上传到linux上
		StorePath uploadFile = storageClient.uploadFile("group1", myFile.getInputStream(), myFile.getSize(), extension);
		//sql语句将文件信息插入mysql
		String sql = "insert into myfile (fileName,groupName,filePath) values (?,?,?)";
		/**
		 * 参数一:sql语句
		 * 参数二:文件名称
		 * 参数三:组名
		 * 参数四:存文件路径
		 */
		jt.update(sql, myFile.getOriginalFilename(),uploadFile.getGroup(),uploadFile.getPath());
		//整体数据:组名+存文件路径
		return uploadFile.getFullPath();
	}
	
	@GetMapping("/fdownload/{fileId}")
	public void doload(@PathVariable String fileId,HttpServletResponse response) throws IOException, InterruptedException {
		//查询下载的信息
		List<Map<String, Object>> list = jt.query("select * from myfile where fileId="+fileId, new ColumnMapRowMapper());
		//拿出第一条数据
		Map map =(Map)list.get(0);
		//取出文件名称
		String fileName = map.get("fileName").toString();
		//取出组名
		String groupName = map.get("groupName").toString();
		//取出存文件路径
		String filePath = map.get("filePath").toString();
		//告诉浏览器下载的文件名
		response.setHeader("Content-Disposition", "attachment; filename="+fileName);
		//去linux上下载对应的图片或文件
		byte[] downloadFile = storageClient.downloadFile(groupName, filePath);
		//将下载的图片或文件打印在浏览器
		response.getOutputStream().write(downloadFile);
	}
	
}

6. upload.html文件上传

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="fupload" method="post" enctype="multipart/form-data">
		文件 <input type="file" name="myFile">
		<input type="submit" value="上传">
	</form>
</body>
</html>

在这里插入图片描述

7. 选择好文件后点击上传:注意文件上传不要过大10MB以内,上传成功展示以下

group1/M00/00/00/wKiZhVwGuaiAWUyYADB-zNEmC5k188.mp3

8. 数据库新增成功
在这里插入图片描述

9. download.html下载

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<a href="fdownload/2">下载</a>
</body>
</html>

在这里插入图片描述

10. 默认下载id2的文件信息这是会直接去数据库里拿对应信息:点击下载即可 在浏览器左下角弹出以下表示下载成功
在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐