day9 FastDFS
FastDFS是由淘宝的余庆先生所开发的一个轻量级、高性能的开源分布式文件系统。用纯C语言开发,功能丰富:
文件存储
文件同步
文件访问(上传、下载)
存取负载均衡
在线扩容
架构图
上传和下载流程
安装流程:
1.实现图片上传
1.1.搭建项目(重新搭建ly-upload微服务)
1.1.1.创建module
1.1.2.依赖
我们需要EurekaClient和web依赖:
1.1.3.编写配置
1.1.4.启动类
1.2.编写上传功能
1.2.1.controller
编写controller需要知道4个内容:
请求方式:上传肯定是POST
请求路径:/upload/image
请求参数:文件,参数名是file,SpringMVC会封装为一个接口:MultipleFile
返回结果:上传成功后得到的文件的url路径
1.2.2.service
在上传文件过程中,我们需要对上传的内容进行校验:
校验文件大小
校验文件的媒体类型
校验文件的内容
文件大小在Spring的配置文件中设置,因此已经会被校验,我们不用管。
这里有一个问题:为什么图片地址需要使用另外的url?、
图片不能保存在服务器内部,这样会对服务器产生额外的加载负担
一般静态资源都应该使用独立域名,这样访问静态资源时不会携带一些不必要的cookie,减小请求的数据量
1.2.3.测试上传
1.2.4.绕过网关
图片上传是文件的传输,如果也经过Zuul网关的代理,文件就会经过多次网路传输,造成不必要的网络负担。在高并发时,可能导致网络阻塞,Zuul网关不可用。这样我们的整个系统就瘫痪了。
所以,我们上传文件的请求就不经过网关来处理了。
1.2.4.1.Zuul的路由过滤
Zuul中提供了一个ignored-patterns属性,用来忽略不希望路由的URL路径,示例:
1.2.4.2.Nginx的rewrite指令
1.2.5.跨域问题
不过庆幸的是,这个错误已经不是第一次见了,跨域问题。
我们在upload-service中添加一个CorsFilter即可:
1.2.6.之前上传的缺陷
先思考一下,之前上传的功能,有没有什么问题?
上传本身没有任何问题,问题出在保存文件的方式,我们是保存在服务器机器,就会有下面的问题:
单机器存储,存储能力有限
无法进行水平扩展,因为多台机器的文件无法共享,会出现访问不到的情况
数据没有备份,有单点故障风险
并发能力差
这个时候,最好使用分布式文件存储来代替本地文件存储。