day52.品优购电商,fastDFS分布式文件系统入门案例,五级联动表,的新增保存操作。(较难)

什么是fastDFS

fastDFS是一个底层使用C语言编写并且开源的, 分布式文件系统,
一般由运维人员来弄。我们只需要下载jar包,并安装,和复制配置文件就行。

作用:
可以统一管理存储服务器集群, 统一管理存储读取文件.
fastDFS原理(工作流程)
fastDFS一共分为三部分, client客户端(我们的项目), trackerServer管理端, storageServer存储端
在这里插入图片描述

client客户端(我们的项目): 使用fastDFS的jar包中的api来存储文件,调用fastDFStrackerServer管理端:管理storageServer存储端集群的, 管理端如果死掉存储端无法使用, 所以管理端都是
做双机热备, 就是一台主机, 一台备机, 他们之间做心跳检测机制, 平时主机工作, 备机向主机发送ping
命令, 主机接收到后返回pong命令, 如果一段时间内没有返回, 备机会认为主机死掉会替代主机工作.
这样可以保证管理端的高可用. 管理端还有负载均衡的功能, 可以平均分配请求给存储端. 这样就可以承载高并发的存储需求.
storageServer存储端: 它负责具体存储文件, 也是两台为一组, 一台主机一台备机, 之间双机热备, 做心跳检测.
保证存储端的高可用. 存储端做冗余存储, 就是我们向存储端主机存储内容, 主机会向备机发送内容,
主机和备机存储的内容是一样的, 所以主机即使坏掉, 备机也有同样的内容可以使用.这种叫容灾配置.
存储端理论上存储容量是无限的, 因为两台为一组机器可以无限扩展.

流程: 我们项目存储的时候先调用管理端, 管理端会给我们分配一台存储端的IP地址和端口, 我们向存储端机器存储文件, 存储端会给我们返回存储后的地址以及文件名, 文件名会自动被存储端重命名, 防止文件重名


优点:
a) 管理端有负载均衡的功能, 可以承载高并发的存储需求
b) 存储端可以无限扩展, 理论上存储容量是无限的, 扩展性好
c) 存储端和管理端都使用的心跳检测机制, 保证了服务器的高可用
d) 存储端做了冗余存储, 所以即使有机器坏掉也不会丢数据, 容灾性好


缺点:
fastDFS结构复杂, 会使项目中的复杂度变高, 并且搭建fastDFS会使用很多服务器, 比较贵.

图片上传下载的案例:用springBoot做的

1.导入相关jar,下面是核心jar,springBoot相关的jar自己找资料添加

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/net.oschina.zcx7878/fastdfs-client-java -->
        <dependency>
            <groupId>net.oschina.zcx7878</groupId>
            <artifactId>fastdfs-client-java</artifactId>
            <version>1.27.0.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-io</artifactId>
            <version>1.3.2</version>
        </dependency>

写相关配置文件:注意,配置文件中不要跟注释
在这里插入图片描述
配置文件的名称:fastdfs-client.properties

fastdfs.connect_timeout_in_seconds = 5
fastdfs.network_timeout_in_seconds = 30
fastdfs.charset = UTF-8
fastdfs.tracker_servers = 192.168.200.128:22122

注意,192.168.200.128:22122这个是FastDFS的部署地址,主机一定要能连通。不让也不行。需要提前测试
在这里插入图片描述
在测试类中写上传和下载的代码:
在这里插入图片描述

@SpringBootTest
@RunWith(SpringRunner.class)
public class TestFastDFS {

    //上传文件
    @Test
    public void testUpload(){

        try {
            //加载fastdfs-client.properties配置文件
            ClientGlobal.initByProperties("config/fastdfs-client.properties");
            //定义,饭店迎宾,用于请求TrackerServer,指定哪个服务员接待
            TrackerClient trackerClient = new TrackerClient();
            //连接tracker ,把客人交给服务员
            TrackerServer trackerServer = trackerClient.getConnection();
            //获取Stroage,指派由哪个厨师做菜
            StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
            //创建stroageClient,服务员和厨师见面。
            StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);
            //向stroage服务器上传文件,厨师收到菜单,开始去锅里做菜
            //本地文件的路径,做好的菜,装哪个盘子
            String filePath = "E:/三国志11封面.png";
            //上传成功后拿到文件Id,参数1:文件存放路径,参数2:后缀名,参数3:文件备注信息
            String fileId = storageClient1.upload_file1(filePath, "png", null);
            System.err.println(fileId);
            //group1/M00/00/01/wKhlQVuhU3eADb4pAAAawU0ID2Q159.png

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

    }


    //下载文件
    @Test
    public void testDownload(){
        try {
            //加载fastdfs-client.properties配置文件
            ClientGlobal.initByProperties("config/fastdfs-client.properties");
            //定义TrackerClient,用于请求TrackerServer
            TrackerClient trackerClient = new TrackerClient();
            //连接tracker
            TrackerServer trackerServer = trackerClient.getConnection();
            //获取Stroage
            StorageServer storeStorage = trackerClient.getStoreStorage(trackerServer);
            //创建stroageClient
            StorageClient1 storageClient1 = new StorageClient1(trackerServer,storeStorage);
            //下载文件
            //文件id
            String fileId = "group1/M00/00/01/wKjIgF5DtU6AE6iaACdfAWHW_wE928.png";
            byte[] bytes = storageClient1.download_file1(fileId);
            //使用输出流保存文件
            FileOutputStream fileOutputStream = new FileOutputStream(new File("E:/abc/三国志11封面.png"));
            fileOutputStream.write(bytes);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (MyException e) {
            e.printStackTrace();
        }
    }
}

最后写启动类:
在这里插入图片描述
####测试案例代码结束#######

注意: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>

Java中json格式字符串和Java对象互相转换:
将json格式数组字符串转换成List集合: 数据格式例如[{“id”:27,“text”:“网络”},{“id”:32,“text”:“机身内存”}]
Json.ParseArray将json格式数组字符串转换成List集合

将json格式字符串转换成Java实体对象:数据格式例如{“机身内存”:“16G”,“网络”:“联通3G”}
Json.parseObject将json格式字符串转换成Pojo或者Map对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值