微服务项目之电商--16.本地实现图片上传及FastDFS架构的介绍安装

目录

一、实现图片上传

1、创建项目

 2、引入依赖

 3、配置文件

 4、创建启动类

 编写uploadservice

 404错误信息

 绕过网关

Nginx的rewrite指令

二、FastDFS

1、FastDFS的架构

1.上传和下载流程

 

2、安装的准备工作

1)创建用户

2)将文件上传到linux下的/home/leyou/fdfs目录:  

3)安装相关依赖

2、安装FastDFS

1 编译安装

2 启动tracker

3 启动storage

4、安装Nginx及FastDFS模块

 1 FastDFS的Nginx模块

2 安装Nginx


一、实现图片上传

刚才的新增实现中,我们并没有上传图片,接下来我们一起完成图片上传逻辑。

文件的上传并不只是在品牌管理中有需求,以后的其它服务也可能需要,因此我们创建一个独立的微服务,专门处理各种上传。

1、创建项目

 

 2、引入依赖

 3、配置文件

 4、创建启动类

 5、编写业务逻辑

 

 

编写controller需要知道4个内容:

  • 请求方式:上传肯定是POST

  • 请求路径:/upload/image

  • 请求参数:文件,参数名是file,SpringMVC会封装为一个接口:MultipleFile

  • 返回结果:上传成功后得到的文件的url路径

代码如下:

 springMvc通过MultipleFile将上传的文件封装起来

 编写uploadservice

文件校验类型

文件校验内容

测试 

 404错误信息

 添加路由

 绕过网关

图片上传是文件的传输,如果也经过Zuul网关的代理,文件就会经过多次网路传输,造成不必要的网络负担。在高并发时,可能导致网络阻塞,Zuul网关不可用。这样我们的整个系统就瘫痪了。

所以,我们上传文件的请求就不经过网关来处理了。

Zuul中提供了一个ignored-patterns属性,用来忽略不希望路由的URL路径,示例:

zuul.ignored-patterns: /upload/**

 

路径过滤会对一切微服务进行判定。

Zuul还提供了ignored-services属性,进行服务过滤:

zuul.ignored-services: upload-servie

我们这里采用忽略服务:

zuul:
  ignored-services:
    - upload-service # 忽略upload-service服务

 上面的配置采用了集合语法,代表可以配置多个

Nginx的rewrite指令

查看页面的请求路径:

可以看到这个地址不对,依然是去找Zuul网关,因为我们的系统全局配置了URL地址。怎么办?

有同学会想:修改页面请求地址不就好了。

注意:原则上,我们是不能把除了网关以外的服务对外暴露的,不安全。

既然不能修改页面请求,那么就只能在Nginx反向代理上做文章了。

我们修改nginx配置,将以/api/upload开头的请求拦截下来,转交到真实的服务地址:

Nginx提供了rewrite指令,用于对地址进行重写,语法规则:

rewrite "用来匹配路径的正则" 重写后的路径 [指令];

 

server {
        listen       80;
        server_name  api.leyou.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;

    	# 上传路径的映射
		location /api/upload {	
			rewrite "^/api/(.*)$" /zuul/$1 break; 
        }
		
        location / {
			proxy_pass http://192.168.58.2:10010;
			proxy_connect_timeout 600;
			proxy_read_timeout 600;
        }
    }

修改完成,输入nginx -s reload命令重新加载配置。然后再次上传试试。

二、FastDFS

分布式文件系统(Distributed File System)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。

通俗来讲:

  • 传统文件系统管理的文件就存储在本机。

  • 分布式文件系统管理的文件存储在很多机器,这些机器通过网络连接,要被统一管理。无论是上传或者访问文件,都需要通过管理中心来访问

1、FastDFS的架构

 

FastDFS两个主要的角色:Tracker Server 和 Storage Server 。

  • Tracker Server:跟踪服务器,主要负责调度storage节点与client通信,在访问上起负载均衡的作用,和记录storage节点的运行状态,是连接client和storage节点的枢纽。

  • Storage Server:存储服务器,保存文件和文件的meta data(元数据),每个storage server会启动一个单独的线程主动向Tracker cluster中每个tracker server报告其状态信息,包括磁盘使用情况,文件同步情况及文件上传下载次数统计等信息

  • Group:文件组,多台Storage Server的集群。上传一个文件到同组内的一台机器上后,FastDFS会将该文件即时同步到同组内的其它所有机器上,起到备份的作用。不同组的服务器,保存的数据不同,而且相互独立,不进行通信。

  • Tracker Cluster:跟踪服务器的集群,有一组Tracker Server(跟踪服务器)组成。

  • Storage Cluster :存储集群,有多个Group组成。

1.上传和下载流程

 

  1. Client通过Tracker server查找可用的Storage server。

  2. Tracker server向Client返回一台可用的Storage server的IP地址和端口号。

  3. Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并进行文件上传。

  4. 上传完成,Storage server返回Client一个文件ID,文件上传结束。

下载

  1. Client通过Tracker server查找要下载文件所在的的Storage server。

  2. Tracker server向Client返回包含指定文件的某个Storage server的IP地址和端口号。

  3. Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并指定要下载文件。

  4. 下载文件成功。

 

2、安装的准备工作

1)创建用户

2)将文件上传到linux下的/home/leyou/fdfs目录:  

3)安装相关依赖

 安装GCC依赖

sudo yum -y install gcc

安装unzip工具

unzip工具可以帮我们对压缩包进行解压

sudo yum install -y unzip zip

安装libevent

sudo yum -y install libevent

安装Nginx所需依赖

sudo yum -y install pcre pcre-devel zlib zlib-devel openssl openssl-devel

安装libfastcommon-master

这个没有yum包,只能通过编译安装:

解压刚刚上传的libfastcommon-master.zip

tar -xvf libfastcommon-master.zip

进入解压完成的目录:

cd libfastcommon-master

编译并且安装:

sudo ./make.sh 
sudo ./makesh install

到这里为止,所有依赖都已经安装完毕,接下来我们安装FastDFS:

2、安装FastDFS

1 编译安装

这里我们也采用编译安装,步骤与刚才的编译安装方式一样:

tar -xvf FastDFS_v5.08.tar.gz

进入目录

cd FastDFS

编译并安装

sudo ./make.sh 
sudo ./make.sh install

校验安装结果

1)安装完成,我们应该能在/etc/init.d/目录,通过命令ll /etc/init.d/ | grep fdfs看到FastDFS提供的启动脚本:

其中:

  • fdfs_trackerd 是tracker启动脚本

  • fdfs_storaged 是storage启动脚本

2)我们可以在 /etc/fdfs目录,通过命令查看到以下配置文件模板:  

其中:

  • tarcker.conf.sample 是tracker的配置文件模板

  • storage.conf.sample 是storage的配置文件模板

  • client.conf.sample 是客户端的配置文件模板

2 启动tracker

 FastDFS的tracker和storage在刚刚的安装过程中,都已经被安装了,因此我们安装这两种角色的方式是一样的。不同的是,两种需要不同的配置文件。

我们要启动tracker,就修改刚刚看到的tarcker.conf,并且启动fdfs_trackerd脚本即可。

编辑tracker配置

首先我们将模板文件进行赋值和重命名:

sudo cp tracker.conf.sample tracker.conf
sudo vim tracker.conf

打开tracker.conf,修改base_path配置:

base_path=/leyou/fdfs/tracker # tracker的数据和日志存放目录

创建目录  

刚刚配置的目录可能不存在,我们创建出来

sudo mkdir -p /leyou/fdfs/tracker

启动tracker

我们可以使用 sh /etc/init.d/fdfs_trackerd 启动,不过安装过程中,fdfs已经被设置为系统服务,我们可以采用熟悉的服务启动方式:

 

sudo service fdfs_trackerd start # 启动fdfs_trackerd服务,停止用stop

另外,我们可以通过以下命令,设置tracker开机启动:

sudo chkconfig fdfs_trackerd on

3 启动storage

我们要启动tracker,就修改刚刚看到的tarcker.conf,并且启动fdfs_trackerd脚本即可。

  • 编辑storage配置

首先我们将模板文件进行赋值和重命名:

 

sudo cp storage.conf.sample storage.conf
sudo vim storage.conf

打开storage.conf,修改base_path配置:

base_path=/leyou/fdfs/storage # storage的数据和日志存放目录
store_path0=/leyou/fdfs/storage # storage的上传文件存放路径
tracker_server=192.168.56.101:22122 # tracker的地址
  • 创建目录

刚刚配置的目录可能不存在,我们创建出来

sudo mkdir -p /leyou/fdfs/storage

启动storage

我们可以使用 sh /etc/init.d/fdfs_storaged 启动,同样我们可以用服务启动方式:

sudo service fdfs_storaged start  # 启动fdfs_storaged服务,停止用stop

 另外,我们可以通过以下命令,设置tracker开机启动:

sudo chkconfig fdfs_storaged on

sudo systemctrl  enable fdfs_storaged 

最后,通过ps -ef | grep fdfs 查看进程:  

4、安装Nginx及FastDFS模块

 1 FastDFS的Nginx模块

解压

tar -xvf fastdfs-nginx-module_v1.16.tar.gz

配置config文件

# 进入配置目录
cd /home/leyou/fdfs/fastdfs-nginx-module/src/
# 修改配置
vim config
# 执行下面命令(将配置中的/usr/local改为/usr):
:%s+/usr/local/+/usr/+g

配置mod_fastdfs.conf

# 将src目录下的mod_fastdfs.conf复制到 /etc/fdfs目录:
sudo cp mod_fastdfs.conf /etc/fdfs/
# 编辑该文件
sudo vim /etc/fdfs/mod_fastdfs.cof

修改一下配置:

connect_timeout=10                  		# 客户端访问文件连接超时时长(单位:秒)
tracker_server=192.168.56.101:22122  	# tracker服务IP和端口
url_have_group_name=true            		# 访问链接前缀加上组名
store_path0=/leyou/fdfs/storage        		# 文件存储路径

复制 FastDFS的部分配置文件到/etc/fdfs目录

cd /home/leyou/fdfs/FastDFS/conf/
cp http.conf mime.types /etc/fdfs/

2 安装Nginx

解压

tar -xvf nginx-1.10.0.tar.gz

配置

sudo ./configure --prefix=/opt/nginx --sbin-path=/usr/bin/nginx --add-module=/home/leyou/fdfs/fastdfs-nginx-module/src

编译安装

sudo make && sudo make install

配置nginx整合fastdfs-module模块

我们需要修改nginx配置文件,在/opt/nginx/config/nginx.conf文件中:

sudo vim  /opt/nginx/conf/nginx.conf

将文件中,原来的server 80{ ...} 部分代码替换为如下代码:

 server {
        listen       80;
        server_name  image.taotao.com;

    	# 监听域名中带有group的,交给FastDFS模块处理
        location ~/group([0-9])/ {
            ngx_fastdfs_module;
        }

        location / {
            root   html;
            index  index.html index.htm;
        }

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
        
    }

启动

nginx # 启动
nginx -s stop # 停止
nginx -s reload # 重新加载配置

设置nginx开机启动

创建一个开机启动的脚本:

vim /etc/init.d/nginx

添加以下内容:

#!/bin/sh
#
# nginx - this script starts and stops the nginx daemon
#
# chkconfig:   - 85 15
# description:  NGINX is an HTTP(S) server, HTTP(S) reverse \
#               proxy and IMAP/POP3 proxy server
# processname: nginx
# config:      /etc/nginx/nginx.conf
# config:      /etc/sysconfig/nginx
# pidfile:     /var/run/nginx.pid

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ "$NETWORKING" = "no" ] && exit 0

nginx="/usr/bin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"

[ -f /etc/sysconfig/nginx ] && . /etc/sysconfig/nginx

lockfile=/var/lock/subsys/nginx

make_dirs() {
   # make required directories
   user=`$nginx -V 2>&1 | grep "configure arguments:.*--user=" | sed 's/[^*]*--user=\([^ ]*\).*/\1/g' -`
   if [ -n "$user" ]; then
      if [ -z "`grep $user /etc/passwd`" ]; then
         useradd -M -s /bin/nologin $user
      fi
      options=`$nginx -V 2>&1 | grep 'configure arguments:'`
      for opt in $options; do
          if [ `echo $opt | grep '.*-temp-path'` ]; then
              value=`echo $opt | cut -d "=" -f 2`
              if [ ! -d "$value" ]; then
                  # echo "creating" $value
                  mkdir -p $value && chown -R $user $value
              fi
          fi
       done
    fi
}

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    make_dirs
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    sleep 1
    start
}

reload() {
    configtest || return $?
    echo -n $"Reloading $prog: "
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
  $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
    start)
        rh_status_q && exit 0
        $1
        ;;
    stop)
        rh_status_q || exit 0
        $1
        ;;
    restart|configtest)
        $1
        ;;
    reload)
        rh_status_q || exit 7
        $1
        ;;
    force-reload)
        force_reload
        ;;
    status)
        rh_status
        ;;
    condrestart|try-restart)
        rh_status_q || exit 0
            ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
        exit 2
esac

修改文件权限,并加入服务列表

# 修改权限
chmod 777 /etc/init.d/nginx 
# 添加到服务列表
chkconfig --add /etc/init.d/nginx 

设置开机启动

chkconfig nginx on

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值