一.FastDFS简介
1、FastDFS两个主要的角色:Tracker Server 和 Storage Server 。
Tracker:跟踪服务器,管理集群,tracker也可以实现集群。每个tracker节点地位平等。收集Storage集群的状态。
Storage:存储服务器,实际保存文件,分为多个组,每个组之间保存的文件是不同的。每个组内部可以有多个成员,组成员内部 保存的内容是一样的,组成员的地位是一致的,没有主从的概念。
2、上传和下载流程
-
Client通过Tracker server查找可用的Storage server。
-
Tracker server向Client返回一台可用的Storage server的IP地址和端口号。
-
Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。
-
上传完成,Storage server返回Client一个文件ID(卷、目录),文件上传结束。
- Client通过Tracker server查找要下载文件所在的的Storage server。
- Tracker server向Client返回包含指定文件的某个Storage server的IP地址和端口号。
- Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并指定要下载文件。
- 下载文件成功。
二、安装FastDFS
具体资源可以自行寻找,需要以上几个资源文件
1、安装c语言环境
yum -y install gcc
2、安装c函数库
unzip libfastcommon-master.zip
cd libfastcommon-master
./make.sh
./make.sh install
3、安装FastDFS
tar -zxvf FastDFS_v5.08.tar.gz
cd FastDFS
./make.sh
./make.sh install
4、配置并启动tracker服务
配置:
cp /etc/fdfs/tracker.conf.sample /etc/fdfs/tracker.conf
vim /etc/fdfs/tracker.conf:
base_path=/powershop/tracker
mkdir -p /powershop/tracker
启动:
service fdfs_trackerd start
chkconfig fdfs_trackerd on
5、配置并启动storage服务
配置:
cp /etc/fdfs/storage.conf.sample /etc/fdfs/storage.conf
vim /etc/fdfs/storage.conf:
base_path=/powershop/storage
store_path0=/powershop/storage
tracker_server=192.168.116.133:22122
mkdir -p /powershop/storage
启动:
service fdfs_storaged start
chkconfig fdfs_storaged on
三、安装fastdfs-nginx-module插件
1、解压
tar -zxvf fastdfs-nginx-module_v1.16.tar.gz
2、修改config
cd fastdfs-nginx-module/src/
vim config:
:%s+/usr/local/+/usr/+g
3、配置fastdfs-nginx-module与FastDFS关联
cp /usr/upload/fastdfs-nginx-module/src/mod_fastdfs.conf /etc/fdfs/
vim /etc/fdfs/mod_fastdfs.conf:
connect_timeout=10
tracker_server=192.168.204.158:22122
url_have_group_name=true
store_path0=/powershop/storage
cd /usr/upload/FastDFS/conf/
cp http.conf mime.types /etc/fdfs/
四、安装nginx
1、安装nginx
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
tar -zxvf nginx-1.10.0.tar.gz
cd nginx-1.10.0
./configure --prefix=/usr/local/nginx --add-module=/usr/upload/fastdfs-nginx-module/src
make && make install
2、配置动静分离
vim /usr/local/nginx/conf/nginx.conf:
server{
listen 80;
server_name localhost;
location ~/group([0-9])/{
ngx_fastdfs_module;
}
}
3、配置nginx开机自启动
vim /lib/systemd/system/nginx.service:
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
systemctl daemon-reload #重新加载服务配置
systemctl start nginx.service #启动服务
[Install]
WantedBy=multi-user.target
systemctl daemon-reload #重新加载服务配置
systemctl start nginx.service #启动服务
systemctl enable nginx.service #设置为开机启动
五、测试
1.引入依赖
在父工程中,添加管理依赖,版本为:
<fastDFS-client-version>1.26.2</fastDFS-client-version>
<!--fastdfs-->
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
<version>${fastDFS-client-version}</version>
</dependency>
因此,这里我们直接在power_shop_item工程的pom.xml中引入坐标即可:
<dependency>
<groupId>com.github.tobato</groupId>
<artifactId>fastdfs-client</artifactId>
</dependency>
2.引入配置类
纯java配置:
@Configuration
//只需要一行注解 @Import(FdfsClientConfig.class)就可以拥有带有连接池的FastDFS Java客户端了
@Import(FdfsClientConfig.class)
public class FastClientImporter {
}
3.编写FastDFS属性
在application.yml配置文件中追加如下内容:
fdfs:
so-timeout: 1501 # 超时时间
connect-timeout: 601 # 连接超时时间
thumb-image: # 缩略图
width: 60
height: 60
tracker-list: # tracker地址:你的虚拟机服务器地址+端口(默认是22122)
- 192.168.204.130:22122
4.配置hosts
将来通过域名:image.powershop.com这个域名访问fastDFS服务器上的图片资源。所以,需要代理到虚拟机地址:http://image.powershop.com/group1/M00/00/00/wKjMhV7Du3WATIbZAABIvlHWjnY123.png
- 配置hosts文件,使image.powershop.com可以访问fastDFS服务器
#测试环境
192.168.204.158 image.powershop.com
5.测试
创建测试类:
import com.github.tobato.fastdfs.domain.StorePath;
import com.github.tobato.fastdfs.domain.ThumbImageConfig;
import com.github.tobato.fastdfs.service.FastFileStorageClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.junit4.SpringRunner;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes={PowerShopItemApp.class})
public class FastDFSTest {
@Autowired
private FastFileStorageClient storageClient;
@Autowired
private ThumbImageConfig thumbImageConfig;
@Test
public void testUpload() throws FileNotFoundException {
// 要上传的文件
File file = new File("D:/images/1.jpg");
// 上传并保存图片,参数:1-上传的文件流 2-文件的大小 3-文件的后缀 4-可以不管他
StorePath storePath = this.storageClient.uploadFile(
new FileInputStream(file), file.length(), "jpg", null);
// 带分组的路径
System.out.println(storePath.getFullPath());
// 不带分组的路径
System.out.println(storePath.getPath());
}
@Test
public void testUploadAndCreateThumb() throws FileNotFoundException {
File file = new File("D:/images/1.jpg");
// 上传并且生成缩略图
StorePath storePath = this.storageClient.uploadImageAndCrtThumbImage(
new FileInputStream(file), file.length(), "png", null);
// 带分组的路径
System.out.println(storePath.getFullPath());
// 不带分组的路径
System.out.println(storePath.getPath());
// 获取缩略图路径
String path = thumbImageConfig.getThumbImagePath(storePath.getFullPath());
System.out.println(path);
}
}
结果:
group1:卷名
/M00:store_path0 目录
00/00:两层256个文件夹
group1/M00/00/00/wKg4ZVsWl5eAdLNZAABAhya2V0c424.jpg
M00/00/00/wKg4ZVsWl5eAdLNZAABAhya2V0c424.jpg
group1/M00/00/00/wKjpgV6XBT2Abi8rAACaMWefTPs531.png
M00/00/00/wKjpgV6XBT2Abi8rAACaMWefTPs531.png
group1/M00/00/00/wKjpgV6XBT2Abi8rAACaMWefTPs531_60x60.png