上传图片服务优化和FastDFS(分布式文件系统)
绕过网关缓存
默认情况下,所有的请求都经过Zuul网关代理,默认会通过SpringMVC预先请求进行处理,缓存。普通请求并不会有什么影响,但是对于文件上传,就会造成不必要的网络负担。在高并发时,可能导致网络阻塞,Zuul网关不可用。这样我们的整个系统就瘫痪了。
所以,我们上传文件的请求需要绕过请求的缓存,直接通过路由来到达目标微服务。
Zuul is implemented as a Servlet. For the general cases, Zuul is
embedded into the Spring Dispatch mechanism. This lets Spring MVC be
in control of the routing. In this case, Zuul buffers requests. if
there is a need to go through Zull without buffering requests(for
example,for large file uploads), the Servlet is also installed outside
of the Spring Dispatcher. By default, the servlet has an address of
/zuul .This path can be changed with the zull.servlet.path porperty.
现在,查看页面的请求路径:
我们需要修改以/zuul为前缀,可以通过nginx的rewrite指令实现这一需求:
Nginx 提供 rewrite 指令,用于对地址进行重写,语法规则:
rewrite “用来匹配路径的正则” 重写后的路径 【指令】;
实例:
server {
listen 80;
server_name api.intell.com;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 匹配以 / 开头 ,()代表分组 ,. 代表任意,*代表个数,匹配/后面的所有
# $1 取正则表达式的第一组
# 重写成 /zuul /api/upload
location /api/upload{
rewrite "^/(.*)$" /zuul/$1;
}
location / {
proxy_pass http://188.188.3.20:10011; #转发
proxy_connect_timeout 600;
proxy_read_timeout 600;
}
}
FastDFS(分布式文件系统)
引入原因: 存在本地会导致文件越来越多,其次一台机宕机,导致文件无法读取,FastDFS适合小文件存储,HDFS 适合大文件
原理:
Client(客户端): 上传,下载发起终端
Tracker cluster(追踪者):存储者的信息都会注册到这里,要集群,至少三台以上
- 上传时,客户端请求,追踪者分配机器
- 下载时,,客户会通过文件id请求获取文件,返回存储者的ip
Storage cluster(存储者):返回文件ID,每台机器做备份,相同备份的成为一个组,下载时会随机使用组里面的一台机器
使用容器安装fastDFS
- 拉取镜像
docker pull delron/fastdfs
- 启动tracker服务:
docker run -dti --network=host --name tracker -v /var/fdfs/tracker:/var/fdfs delron/fastdfs tracker
我们将fastDFS tracker运行目录映射到本机的 /var/fdfs/tracker目录中。
执行如下命令查看tracker是否运行起来
docker container ls
如果想停止tracker服务,可以执行如下命令
docker container stop tracker
停止后,重新运行tracker,可以执行如下命令
docker container start tracker
- 运行storage
执行如下命令开启storage服务
docker run -dti --network=host --name storage -e TRACKER_SERVER=xx.xx.xxx.xx:22122 -v /var/fdfs/storage:/var/fdfs delron/fastdfs storage
TRACKER_SERVER=本机的ip地址:22122 本机ip地址不要使用127.0.0.1
我们将fastDFS storage运行目录映射到本机的/var/fdfs/storage目录中
执行如下命令查看storage是否运行起来
docker container ls
如果想停止storage服务,可以执行如下命令
docker container stop storage
停止后,重新运行storage,可以执行如下命令
docker container start storage
测试:
- 进入tracker
docker exec -it tracker /bin/bash
- 修改配置文件
/etc/fdfs/client.conf
tracker_server=192.168.0.197:22122 改成前面的xx.xx.xxx.xx:22122
- 上传文件到fastdfs集群:
执行命令:
/usr/bin/fdfs_upload_file /etc/fdfs/client.conf /anaconda-post.log
返回
group1/M00/00/00/vLwDE186G5uAHoQFAAAuyAYKcJ4725.log
group1: 组信息
M00:对应的store_path0
/00/00:磁盘路径
访问地址:
http://188.188.3.19:8888/group1/M00/00/00/vLwDE186G5uAHoQFAAAuyAYKcJ4725.log
注意:如果无法重新运行,可以删除/var/fdfs/storage/data目录下的fdfs_storaged.pid 文件,然后重新运行storage。
配置负载均衡:
#设置负载均衡的服务器列表
upstream mysvr{
#weight 参数标识权值,权值越高被分配到的几率越大
server 188.188.3.19:8888 weight=1;
}
#第一个虚拟服务器
server{
listen 80;
server_name image.intell.com;
#后缀进行负载均衡请求
location / {
#请求转向mysvr 定义的服务器列表
proxy_pass http://mysvr;
}
}
配置文件路径 /etc/fdfs/
mv tracker.conf.sample tracker.conf
修改 base_path=日志文件路径
配置文件路径 /etc/fdfs/
mv storage.conf.sample storage.conf
修改
base_path=日志文件路径
store_path0=文件路径
tracker_server=storage 文件的存放路径
tracker_server=188.188.3.19:22122 # tracker的地址
本文地址:https://blog.csdn.net/lrqforest/article/details/109627243