什么是fastDFS
fastDFS是一个底层使用C语言编写并且开源的, 分布式文件系统,
一般由运维人员来弄。我们只需要下载jar包,并安装,和复制配置文件就行。
作用:
可以统一管理存储服务器集群, 统一管理存储读取文件.
fastDFS原理(工作流程)
fastDFS一共分为三部分, client客户端(我们的项目), trackerServer管理端, storageServer存储端
client客户端(我们的项目): 使用fastDFS的jar包中的api来存储文件,调用fastDFStrackerServer管理端:管理storageServer存储端集群的, 管理端如果死掉存储端无法使用, 所以管理端都是
做双机热备, 就是一台主机, 一台备机, 他们之间做心跳检测机制, 平时主机工作, 备机向主机发送ping
命令, 主机接收到后返回pong命令, 如果一段时间内没有返回, 备机会认为主机死掉会替代主机工作.
这样可以保证管理端的高可用. 管理端还有负载均衡的功能, 可以平均分配请求给存储端. 这样就可以承载高并发的存储需求.
storageServer存储端: 它负责具体存储文件, 也是两台为一组, 一台主机一台备机, 之间双机热备, 做心跳检测.
保证存储端的高可用. 存储端做冗余存储, 就是我们向存储端主机存储内容, 主机会向备机发送内容,
主机和备机存储的内容是一样的, 所以主机即使坏掉, 备机也有同样的内容可以使用.这种叫容灾配置.
存储端理论上存储容量是无限的, 因为两台为一组机器可以无限扩展.
流程: 我们项目存储的时候先调用管理端, 管理端会给我们分配一台存储端的IP地址和端口, 我们向存储端机器存储文件, 存储端会给我们返回存储后的地址以及文件名, 文件名会自动被存储端重命名, 防止文件重名
优点:
a) 管理端有负载均衡的功能, 可以承载高并发的存储需求
b) 存储端可以无限扩展, 理论上存储容量是无限的, 扩展性好
c) 存储端和管理端都使用的心跳检测机制, 保证了服务器的高可用
d) 存储端做了冗余存储, 所以即使有机器坏掉也不会丢数据, 容灾性好
缺点:
fastDFS结构复杂, 会使项目中的复杂度变高, 并且搭建fastDFS会使用很多服务器, 比较贵.
图片上传下载的案例:用springBoot做的
1.导入相关jar,下面是核心jar,springBoot相关的jar自己找资料添加
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs-client-java -->
<dependency>
<groupId>net.oschina.zcx7878</groupId>
<artifactId>fastdfs-client-java</artifactId>
<version>1.27.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-io</artifactId>
<version>1.3.2</version>
</dependency>
写相关配置文件:注意,配置文件中不要跟注释
配置文件的名称:fastdfs-client.properties
fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.tracker_servers = 192.168.200.128:22122
注意,192.168.200.128:22122这个是FastDFS的部署地址,主机一定要能连通。不让也不行。需要提前测试
在测试类中写上传和下载的代码:
@SpringBootTest
@RunWith(SpringRunner.class)
public class TestFastDFS {
//上传文件
@Test
public void testUpload(){
try {
//加载fastdfs-client.properties配置文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
//定义,饭店迎宾,用于请求TrackerServer,指定哪个服务员接待
TrackerClient trackerClient = new TrackerClient();
//连接tracker ,把客人交给服务员
TrackerServer trackerServer = trackerClient.getConnection();
//获取Stroage,指派由哪个厨师做菜
StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
//创建stroageClient,服务员和厨师见面。
StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);
//向stroage服务器上传文件,厨师收到菜单,开始去锅里做菜
//本地文件的路径,做好的菜,装哪个盘子
String filePath = "E:/三国志11封面.png";
//上传成功后拿到文件Id,参数1:文件存放路径,参数2:后缀名,参数3:文件备注信息
String fileId = storageClient1.upload_file1(filePath, "png", null);
System.err.println(fileId);
//group1/M00/00/01/wKhlQVuhU3eADb4pAAAawU0ID2Q159.png
} catch (Exception e) {
e.printStackTrace();
}
}
//下载文件
@Test
public void testDownload(){
try {
//加载fastdfs-client.properties配置文件
ClientGlobal.initByProperties("config/fastdfs-client.properties");
//定义TrackerClient,用于请求TrackerServer
TrackerClient trackerClient = new TrackerClient();
//连接tracker
TrackerServer trackerServer = trackerClient.getConnection();
//获取Stroage
StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
//创建stroageClient
StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);
//下载文件
//文件id
String fileId = "group1/M00/00/01/wKjIgF5DtU6AE6iaACdfAWHW_wE928.png";
byte[] bytes = storageClient1.download_file1(fileId);
//使用输出流保存文件
FileOutputStream fileOutputStream = new FileOutputStream(new File("E:/abc/三国志11封面.png"));
fileOutputStream.write(bytes);
} catch (IOException e) {
e.printStackTrace();
} catch (MyException e) {
e.printStackTrace();
}
}
}
最后写启动类:
####测试案例代码结束#######
注意:springmvc.xml 中要配置多媒体解析器。设置上传文件的相关数据
<!-- 配置多媒体解析器 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"></property>
<!-- 设定文件上传的最大值5MB,5*1024*1024 -->
<property name="maxUploadSize" value="5242880"></property>
</bean>
Java中json格式字符串和Java对象互相转换:
将json格式数组字符串转换成List集合: 数据格式例如[{“id”:27,“text”:“网络”},{“id”:32,“text”:“机身内存”}]
Json.ParseArray将json格式数组字符串转换成List集合
将json格式字符串转换成Java实体对象:数据格式例如{“机身内存”:“16G”,“网络”:“联通3G”}
Json.parseObject将json格式字符串转换成Pojo或者Map对象