乐优—— 图片上传 使用fastDFS

创建一个model

在这里插入图片描述

2 pom需要的依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <!--fastDFS-->
    <dependency>
        <groupId>com.github.tobato</groupId>
        <artifactId>fastdfs-client</artifactId>
    </dependency>

</dependencies>

3 编写application.yml 连接eureka

在这里插入图片描述

4 启动类

在这里插入图片描述

5解决跨域问题

	@Configuration
	public class GlobalCorsConfig {
	    @Bean
	    public CorsFilter corsFilter() {
	//1.添加CORS配置信息
	        CorsConfiguration config = new CorsConfiguration();
	//1) 允许的域,不要写*,否则cookie就无法使用了
	        config.addAllowedOrigin("http://manage.leyou.com");
	//2) 是否发送Cookie信息
	        config.setAllowCredentials(false);
	//3) 允许的请求方式
	        config.addAllowedMethod("OPTIONS");
	        config.addAllowedMethod("POST");
	        config.addAllowedHeader("*");
	//2.添加映射路径,我们拦截一切请求
	        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
	        configSource.registerCorsConfiguration("/**", config);
	//3.返回新的CorsFilter.
	        return new CorsFilter(configSource);
	    }
	}

6 解决 springboot bean冲突的问题

在这里插入图片描述

7 由于这个是demo级别的 所有 没有service

@RestController
@RequestMapping("/api")
public class UploadController {

@Autowired
FastFileStorageClient client;
@Autowired
ThumbImageConfig thumbImageConfig;

    @PostMapping("/upload/image")
    public String uploadImage(MultipartFile file) {
        String path = "";
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().indexOf(".") + 1);
        //找tracker对象要storage对象地址 端口
        try {
            StorePath storePath = client.uploadFile(file.getInputStream(), file.getSize(), suffix, null);
            //存储的地址对象:StorePath [group=group1 ,path=**********************.png]
            path = "http://192.168.25.133/" + storePath.getGroup() + "/" + storePath.getPath();

        } catch (IOException e) {
            e.printStackTrace();
        }


        return path;
    }

}

8 绕过网关

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

9 Zuul的路由过滤

Zuul中提供了一个ignored-patterns属性,用来忽略不希望路由的URL路径,示例: zuul.ignored-patterns: /upload/**
路径过滤会对一切微服务进行判定。 Zuul还提供了ignored-services属性,进行服务过滤: zuul.ignored-services: upload-servie

这里采用直接忽略服务的方法:

在这里插入图片描述

10 Nginx 修改配置

此时,上传功能还是有问题的,因为前端页面所有的请求路径都是走的网关http://api.leyou.com,而且原则上不能把除了网关以为的服务对外暴露,所以需要对nginx的配置进行修改。让上传图片功能假装经过网关(因为请求地址为http://api.leyou.com/api/upload/image),但是在nginx中进行过滤,把这个请求直接代理到上传微服务端口,而不经过网关端口(商品管理微服务先经过网关,然后网关再去调用相应的微服务)。

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

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190425201309354.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNTk1NjQ3,size_16,color_FFFFFF,t_70

11 什么是FastDFS

FastDFS是由淘宝的余庆先生所开发的一个轻量级、高性能的开源分布式文件系统。用纯C语言开发,功能丰富:

文件存储

文件同步

文件访问(上传、下载)

存取负载均衡

在线扩容

适合有大容量存储需求的应用或系统。同类的分布式文件系统有谷歌的GFS、HDFS(Hadoop)、TFS(淘宝)等。

11.1 FastDFS的架构

11.2 架构图

在这里插入图片描述
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组成。

12 上传

在这里插入图片描述
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,文件上传结束。

13 下载

在这里插入图片描述

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

    
    Tracker server向Client返回包含指定文件的某个Storage server的IP地址和端口号。
    
    Client直接通过Tracker server返回的IP地址和端口与其中一台Storage server建立连接并指定要下载文件。
    
    下载文件成功。

猜你喜欢

转载自blog.csdn.net/qq_43595647/article/details/89525064