Spring Boot总结(二):Spring Boot中使用数据库
Spring Boot总结(三):Spring Boot界面设计
Spring Boot总结(六):Spring Boot SSO
问题描述:
传统的用户上传文件和上传图片一般会保存在Web服务器所在机器中,但是随着业务的发展,上传的文件会越来越多,单独一台机器往往会不堪重负,对于大型的分布式系统来讲,这种情况越来越明显,而且再加上一些负载均衡的配置和服务,如果还将上传文件保存在Web服务的机器中,会显得越来越不合理,更不用说单台机器的容量和性能的问题;
在诸多的分布式文件系统中,FastDFS是比较优秀的分布式文件系统。完全开源,性能也非常优秀,存储容量和访问性能可按照需求进行线性横向的扩展,即可以通过增加社费的方式实现动态的扩容;
FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载)等,解决了大容量存储和负载均衡的问题。特别适合以文件为载体的在线服务,如相册网站、视频网站等等。
FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
7.1 FastDFS安装
FastDFS分为服务端和客户端API两部分,
FastDFS服务端有两个角色:跟踪器(tracker)和存储节点(storage)。跟踪器主要做调度工作,在访问上起负载均衡的作用。存储节点主要复制文件的存储、读取和同步的功能。客户端API提供了文件上传、下载和删除等操作方法;
典型的FastDFS服务器的网络拓扑结构就是,客户端连接跟踪器服务器集群,跟踪器管理存储节点集群,为客户端提供可用的存储节点;
为了支持大容量,存储节点(服务器)采用了分卷(或分组)的组织方式。存储系统由一个或多个卷组成,卷与卷之间的文件是相互独立的,所有卷的文件容量累加就是整个存储系统中的文件容量。一个卷可以由一台或多台存储服务器组成,一个卷下的存储服务器中的文件都是相同的,卷中的多台存储服务器起到了冗余备份和负载均衡的作用。
在卷中增加服务器时,同步已有的文件由系统自动完成,同步完成后,系统自动将新增服务器切换到线上提供服务。
当存储空间不足或即将耗尽时,可以动态添加卷。只需要增加一台或多台服务器,并将它们配置为一个新的卷,这样就扩大了存储系统的容量。
FastDFS中的文件标识分为两个部分:卷名和文件名,二者缺一不可。
1. 下载安装包
- 下载FastDFS:
#wget http://jaist.dl.sourceforge.net
- 下载Nginx
#wget http://nginx.org/download/nginx-1.7.0.tar.gz
- 下载fastdfs-nginx-module_v1.16
#wget http://jaist.dl.sourceforge.net/project/fastdfs
2. 安装服务
如果要安装安装命令,系统中必须具有编译命令,如果系统中还没有编译环境,可以使用下列指令增加编译环境;
#yum -y install gcc gcc+ gcc -c++ openssl -devel pcre -deve
- 创建系统用户
#useradd fastdfs -M -s /sbin/nologin
#useradd nginx -M -s /sbin/nologin
- 安装FastFDS
# tar xf FastDFS_v5.tar.gz
#cd FastDFS
#./make .sh
#./make.sh install
- 安装nginx
#cd ..
#tar xf fastdfs -nginx-module_v1.16.tar.gz
#tar xf nginx-1.7.0.tar.gz
#cd nginx-1.7.0
#./configure --user=nginx --group=nginx --prefix=/usr/local/nginx --add-moudle=../fastdfs-nginx-module/src
#make
#make install
3. Tracker Server配置
4. Storage Server配置
5. 启动服务
6. 客户端测试
7.2 FastFDS客户端
FastFDS有Java的客户端API,可以实现文件上传、下载和删除的操作。
或者使用FastFDS_Client组件,它组件是由tobato专门为Spring Boot 提供的FastFDS客户端应用。
源代码地址:
https://github.com/tobato/FastDFS_Client
1. 客户端配置
使用maven添加依赖:
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>1.25.4-RELEASE</version>
</dependency>
在配置文件application.yml中添加fdfs的配置:
fdfs:
soTimeout:1501
connectTimeout:601
thumbImage:
trackerList:
2. 客户端服务类
7.3 使用定制方式上传图片
1. 实体建模
2. 上传图片
7.4 使用富文本编辑器上传图片
在实际的应用中,常常需要使用富文本编辑器来编辑一些比较复杂的内容,例如在实例中,对商品的描述可能既有文字说明,又有图片展示。在富文本编辑器中上传图片,具体取决于编辑器本身的设计。当然,一般富文本编辑器的设计都有一些可供配置的选项,例如:Ueditor就是一个完全开源的可以定制的富文本编辑器;
http://ueditor.baidu.com/website/
1. 实现富文本编辑器
使用Ueditor的页面,必须加入一些JS的引用和配置
2. 实现文件上传
7.5 使用本地文件库
1. 本地文件库建模
2. 文件保存方法
使用后台线程的方式来执行保存文件的方法,将会在不影响界面上操作的情况下,从后台中保存文件;
AsyncThreadPool.getInstance().execute(new Runnable(){
@Override
public void run(){
try{
//自定义保存文件的方法,可以将文件保存到数据库中
savePic(upfile,filename,shopid);
}catch(Exception e){
e.printStackTrace();
}
}
});
3. 文件库管理
对于已经上传的图片,。可以创建一个文件库来管理,这样不但可以重复的利用图片,还可以编辑,如果不再需要了,可以执行删除操作 ;
- 本地文件库建模
- 文件库管理实现效果:保存图片信息之后,可以取出已经上传的图片列表,按需选择可用的图片,不需要的图片,也可以删除,需要注意一点就是:删除图片的时候,不但需要删除文件库中的文件信息,而且需要删除FasFDS上的文件库;
7.7 小结
要提高一个大型分布式文件系统的图片文件访问性能和设计一个可以动态扩容的文件系统,使用分布式文件系统是一个最佳的选择;
使用分布式文件系统,可以提升服务系统在存取文件方面的性能,但是对于提高整个服务体系的性能来讲,这还远远不够,可以结合云应用开发工具,开发高可用的微服务,以提升服务系统的整体性能;
源代码:
https://github.com/chenfromsz/spring-boot-files
检出工程之后,需要在webapp模块的配置文件application.yml中按照各种服务器的安装情况配置连接Neo4j数据库的URL、用户名和密码,配置连接FastDFS分布式系统的Tracker Server的trackerList列表地址和端口,配置file.path.head的Tracker Server浏览器地址和端口