侧边栏壁纸
  • 累计撰写 781 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

fastDFS

Dettan
2021-04-10 / 0 评论 / 0 点赞 / 98 阅读 / 6,797 字
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
什么是FastDFS
FastDFS是用c语言编写的一款开源的分布式文件系统。FastDFS为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。
文件上传流程
文件下载流程
上传文件的文件名
客户端上传文件后存储服务器将文件ID返回给客户端,此文件ID用于以后访问该文件的索引信息。文件索引信息包括:组名,虚拟磁盘路径,数据两级目录,文件名。
http://192.168.198.129/group1/
组名:文件上传后所在的storage组名称,在文件上传成功后有storage服务器返回,需要客户端自行保存。
虚拟磁盘路径:storage配置的虚拟路径,与磁盘选项store_path*对应。如果配置了store_path0则是M00,如果配置了store_path1则是M01,以此类推。
数据两级目录:storage服务器在每个虚拟磁盘路径下创建的两级目录,用于存储数据文件。
文件名:与文件上传时不同。是由存储服务器根据特定信息生成,文件名包含:源存储服务器IP地址、文件创建时间戳、文件大小、随机数和文件拓展名等信息。
FastDFS搭建
可以使用一台虚拟机来模拟,只有一个Tracker、一个Storage服务。

配置nginx访问图片。
搭建步骤
搭建准备:gcc,perl
第一步:把fastDFS都上传到linux系统。
第二步:安装FastDFS之前,先安装libevent工具包。
yum -y install libevent
第三步:安装libfastcommonV1.0.7工具包。
1.
解压缩
2.
./make.sh
3.
./make.sh install
4.
把/usr/lib64/libfastcommon.so文件向/usr/lib/下复制一份
第四步:安装Tracker服务。
1.
解压缩
2.
./make.sh
3.
./make.sh install
安装后在/usr/bin/目录下有以fdfs开头的文件都是编译出来的。配置文件都放到/etc/fdfs文件夹
1.
把/root/FastDFS/conf目录下的所有的配置文件都复制到/etc/fdfs下。
2.
配置tracker服务。修改/etc/fdfs/tracker.conf文件。
3.
不用修改/root/FastDFS/conf/tracker.conf文件。
1.
启动tracker。/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf
重启使用命令:/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart
第五步:安装storage服务。
1.
如果是在不同的服务器安装,第四步的1~4需要重新执行。
2.
配置storage服务。修改/etc/fdfs/,/root/FastDFS/conf/storage.conf文件
1.
启动storage服务。
/usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
第六步:测试服务。
1.
修改配置文件/etc/fdfs/client.conf
1.
测试
/usr/bin/fdfs_test /etc/fdfs/client.conf upload 1.jpg
第七步:搭建nginx提供http服务。
可以使用官方提供的nginx插件。要使用nginx插件需要重新编译。
fastdfs-nginx-module_v1.16.tar.gz
1.
解压插件压缩包
2.
修改/root/fastdfs-nginx-module/src/config文件,把其中的local去掉。

1.
对nginx重新config
./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi \
--add-module=/root/fastdfs-nginx-module/src
1.
make
2.
make install
3.
把/root/fastdfs-nginx-module/src/mod_fastdfs.conf文件复制到/etc/fdfs目录下。编辑:
1.
nginx的配置
在nginx的配置文件中添加一个Server:
server {
listen 80;
server_name 192.168.101.3;
location /group1/M00/{
#root /home/FastDFS/fdfs_storage/data;
ngx_fastdfs_module;
}
}
1.
将libfdfsclient.so拷贝至/usr/lib下
cp /usr/lib64/libfdfsclient.so /usr/lib/
1.
启动nginx. . /nginx -t
参考https://www.cnblogs.com/codingcloud/p/5095066.html
https://www.cnblogs.com/Leo_wl/p/6731647.html
图片服务的使用
官方提供一个jar包
使用方法:
1.
把FastDFS提供的jar包添加到工程中
2.
初始化全局配置。加载一个配置文件。
3.
创建一个TrackerClient对象。
4.
创建一个TrackerServer对象。
5.
声明一个StorageServer对象,null。
6.
获得StorageClient对象。
7.
直接调用StorageClient对象方法上传文件即可。
@Test
	publicvoidtestUpload() throws Exception {
		// 1、把FastDFS提供的jar包添加到工程中
		// 2、初始化全局配置。加载一个配置文件。
		ClientGlobal.init("D:\\workspaces\\xiafei-manager\\xiafei-manager-web\\src\\main\\resources\\properties\\client.conf");
		// 3、创建一个TrackerClient对象。
		TrackerClient trackerClient = new TrackerClient();
		// 4、创建一个TrackerServer对象。
		TrackerServer trackerServer = trackerClient.getConnection();
		// 5、声明一个StorageServer对象,null。
		StorageServer storageServer = null;
		// 6、获得StorageClient对象。
		StorageClient storageClient = new StorageClient(trackerServer, storageServer);
		// 7、直接调用StorageClient对象方法上传文件即可。
		String[] strings = storageClient.upload_file("D:\\Documents\\Pictures\\images\\2f2eb938943d.jpg", "jpg", null);
		for (String string : strings) {
			System.out.println(string);
		}
	}
Client.conf
tracker_server=192.168.198.129:22122
使用工具类上传图片
@Test
publicvoid testFastDfsClient() throws Exception {
	FastDFSClient client = new FastDFSClient("D:\\workspaces\\xiafei-manager\\xiafei-manager-web\\src\\main\\resources\\properties\\client.conf");
	String uploadFile = client.uploadFile("D:\\Documents\\Pictures\\images\\200811281555127886.jpg", "jpg");
	System.out.println(uploadFile);
}
图片上传功能
功能分析
请求的参数:
请求的url:
/pic/upload
参考文档:
http://kindeditor.net/docs/upload.html
添加jar包:
Commons-io、fileupload,两个jar包。
在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>
响应的内容
返回格式(JSON)
//成功时
{
        "error" : 0,
        "url" : "http://www.example.com/path/to/file.ext"
}
//失败时
{
        "error" : 1,
        "message" : "错误信息"
}
需要创建一个pojo描述返回值。
Pojo中有三个属性:error、url、message,可以放到taotao-common工程中。
public class PictureResult {
private int error;
private String url;
private String message;
public int getError() {
	return error;
}
public void setError(int error) {
	this.error = error;
}
public String getUrl() {
	return url;
}
public void setUrl(String url) {
	this.url = url;
}
public String getMessage() {
	return message;
}
public void setMessage(String message) {
	this.message = message;
}

}




Service层

接收图片数据,把图片上传到图片服务器,返回PictureResult 。需要使用FastDFSClient工具类。
参数:MultiPartFile pictureFile
返回值:PictureResult
@Service
public class PictureServiceImpl implements PictureService {
@Override
public PictureResult uploadPic(MultipartFile picFile) {
	PictureResult result = new PictureResult();
	//判断图片是否为空
	if (picFile.isEmpty()) {
		result.setError(1);
		result.setMessage(&quot;图片为空&quot;);
		return result;
	}
	//上传到图片服务器
	try {
		//取图片扩展名
		String originalFilename = picFile.getOriginalFilename();
		//取扩展名不要“.”
		String extName = originalFilename.substring(originalFilename.lastIndexOf(&quot;.&quot;) + 1);
		FastDFSClient client = new FastDFSClient(&quot;classpath:properties/client.conf&quot;);
		String url = client.uploadFile(picFile.getBytes(), extName);
		//把url响应给客户端
		result.setError(0);
		result.setUrl(url);
	} catch (Exception e) {
		e.printStackTrace();
		result.setError(1);
		result.setMessage(&quot;图片上传失败&quot;);
	}
	return result;
}

}



IMAGE_SERVER_BASE_URL=192.168.198.129
Controller
接收上传的图片信息,调用Service把图片上传到图片服务器。返回json数据。需要使用@ResponseBody
@Controller
public class PictureController {
@Autowired
private PictureService pictureService;

@RequestMapping(&quot;/pic/upload&quot;)
@ResponseBody
public PictureResult uploadFile(MultipartFile uploadFile) {
	PictureResult result = pictureService.uploadPic(uploadFile);
	return result;
}

}




加载属性文件

1.
创建一个属性文件
2.
使用spring容器扫描属性文件。
3.
@Value注解取属性的值。
解决浏览器兼容性问题
要求返回的数据是一个文本类型,要求content-type 为text/plan
父子容器

Spring容器(父容器)
Mapper代理对象
Service对象

Springmvc(前端控制器)(子容器)
Controller对象

子容器可以访问父容器的对象,父容器不能访问子容器中的对象。
Nginx的反向代理
什么是反向代理
连接分发服务器
反向代理服务器是引用在服务端。决定哪台服务器提供服务。
反向代理的模拟
反向代理
应该有一个nginx服务器有多个应用服务器(可以是tomcat)
可以使用一台虚拟机,安装一个nginx,多个tomcat,来模拟。
Nginx的配置文件:
upstream tomcats{
	server 192.168.25.148:8080;
	server 192.168.25.148:8081;
}

server {
listen 80;
server_name tomcat.xiafei.com;

#charset koi8-r;

#access_log  logs/host.access.log  main;

location / {
    proxy_pass   http://tomcats;
    index  index.html index.htm;
}

}




负载均衡

只需要在upstream的server后面添加一个weight即可代表权重。权重越高,分配请求的数量就越多。默认权重是1
0

评论区