文件服务器FastDFS 消息队列中间件RabbitMQ

新标签页 (chinaunix.net)

FastDFS - Browse Files at SourceForge.net

 一、FastDFS

         Tracker和Storage:

                tracker用来管理所有的storage,只是管理服务器,负责负载均衡。

                storage是存储服务器,每一个storage服务器都是一个单独的个体,storage服务器之间没有交互关系。

        在FastDFS中根目录包含256个一级目录、每个一级目录中包含256个二级子目录,在二级子目录中存储图片。存储图片时服务器会返回相应的group和remote,访问文件时通过这两个键值对获取图片。

        



     ①、在虚拟机中使用docker安装FastDFS

docker load -i fastdfs.tar  //在docker中加载镜像源文件mkdir -p /opt/fdfs/tracker  docker run -d --network=host --name tracker -v /opt/fdfs/tracker:/var/fdfs delron/fastdfs tracker  mkdir -p /opt/fdfs/storagedocker run -d --network=host --name storage -e TRACKER_SERVER=192.168.222.128:22122 -v /opt/fdfs/storage:/var/fdfs -e GROUP_NAME=group1 delron/fastdfs storage//重启服务器需要删除文件。
rm -rf /opt/fdfs/tracker/data/*.pid 
rm -rf /opt/fdfs/storage/data/*.pid//更改服务器的磁盘限制
docker exec -it tracker bash
cd /etc/fdfs
vi /etc/fdfs/tracker.conf
reserved_storage_space = 10K //磁盘剩余多少空间时关闭上传文件功能

   



    ②、java代码使用FastDFS

                1)首先编写FastDFS配置信息fdfs.properties

fastdfs.connect_timeout_in_seconds=10
fastdfs.network_timeout_in_seconds=30
fastdfs.charset=UTF-8
# tracker????????????????
fastdfs.tracker_servers=192.168.222.128:22122
# tracker????????tracker.conf??http??????????
fastdfs.http_tracker_http_port=8080

             2)FastDFS 操作工具类

                                封装了加载配置文件fdfs.properties的静态代码块,还有上传和下载的方法。

package com.xja.util;import org.csource.common.NameValuePair;
import org.csource.fastdfs.*;import java.io.InputStream;
import java.util.Properties;/*** FastDFS Java客户端工具*/
public final class FastDFSUtils {/*** 定义静态属性,Properties和StorageClient*/private final static Properties PROPERTIES;private final static StorageClient STORAGE_CLIENT;/*** 静态初始化代码块,初始化静态属性* 静态初始化代码块有异常如何处理?* 处理的时候,try。。catch。。 抛出一个Error,终止虚拟机。*/static{try {PROPERTIES = new Properties();// 读取配置文件PROPERTIES.load(FastDFSUtils.class.getClassLoader().getResourceAsStream("fdfs.properties"));// 使用ClientGlobal初始化FastDFS客户端配置ClientGlobal.initByProperties(PROPERTIES);// 创建Tracker客户端对象TrackerClient trackerClient = new TrackerClient();// 基于Tracker客户端对象,获取Tracker服务器对象TrackerServer trackerServer = trackerClient.getConnection();// 基于Tracker服务器和客户端对象,获取Storage服务器对象StorageServer storageServer = trackerClient.getStoreStorage(trackerServer);// 创建Storage客户端对象STORAGE_CLIENT = new StorageClient(trackerServer, storageServer);}catch (Exception e){throw new ExceptionInInitializerError(e);}}/*** 删除文件* int delete_file(String 卷名, String 路径及文件名);* 返回值: 0代表成功,其他数字代表错误编码*/public static int remote(String group, String remote){try {return STORAGE_CLIENT.delete_file(group, remote);}catch (Exception e){e.printStackTrace();return -1;}}/*** 查询某文件的元数据* @param group 卷名* @param remote 路径及文件名* @return 返回文件的元数据数组。发生错误返回null*/public static NameValuePair[] getMetaData(String group, String remote){try{return STORAGE_CLIENT.get_metadata(group, remote);}catch (Exception e){e.printStackTrace();return null;}}/*** 下载文件工具方法*  下载方法*  byte[] download_file(String 卷名, String 路径及文件名)*  返回要下载的文件内容* @param group 卷名* @param remote 路径及文件名* @return 返回下载的文件内容,发生错误返回null*/public static byte[] download(String group, String remote){try {return STORAGE_CLIENT.download_file(group, remote);}catch (Exception e){e.printStackTrace();return null;}}/*** 上传文件的工具方法* 一定保存文件到FastDFS,一定保存至少一个元数据(文件原始名称)* @param inputStream 要上传的文件的输入流* @param fileName 上传文件的原始名称* @param metaProperties 上传文件的元数据,成对提供,如: 名,值,名,值* @return*/public static String[] uploadFile(InputStream inputStream, String fileName, String... metaProperties){try {int length = inputStream.available();byte[] datas = new byte[length];inputStream.read(datas, 0, length);// 处理元数据NameValuePair[] nameValuePairs = null;if (metaProperties.length % 2 == 0) {// 参数数量满足要求,开始处理nameValuePairs = new NameValuePair[metaProperties.length / 2 + 1];for (int i = 0; i < nameValuePairs.length; i = i + 2) {nameValuePairs[i / 2] = new NameValuePair(metaProperties[i], metaProperties[i + 1]);}} else {nameValuePairs = new NameValuePair[1];}nameValuePairs[nameValuePairs.length - 1] = new NameValuePair("fileName", fileName);// 获取文件后缀String extName = getExtName(fileName);// 上传文件到FastDFSString[] result = STORAGE_CLIENT.upload_file(datas, extName, nameValuePairs);for (String s : result) {System.out.println("s = " + s);//s = group1//s = M00/00/00/wKjegGbqfoKACfLIAAAnJ2OoZs8411.txt}System.out.println("============= " + nameValuePairs[0]+ "/n"+ nameValuePairs[1]);//============= org.csource.common.NameValuePair@4ae28001/norg.csource.common.NameValuePair@3e472f5dreturn result;}catch (Exception e){// 发生任何异常,上传文件失败。返回nulle.printStackTrace();return null;}}/*** 截取文件后缀* @param fileName* @return*/private static String getExtName(String fileName){if(fileName.lastIndexOf(".") > -1){// 文件名称中包含字符 .return fileName.substring(fileName.lastIndexOf(".") + 1);}else{// 文件名称中不包含字符 .return "";}}/*** 提供获取Storage客户端对象的工具方法*/public static StorageClient getStorageClient(){return STORAGE_CLIENT;}private FastDFSUtils(){}
}

                3)编写上传和下载路由

                           下载路由中需要加上内容类型和响应头,否则可能出现访问下载却出现在线预览图片

@Controller
public class LoginController {@RequestMapping("/index")public String uploadPage(){return "index";}@RequestMapping("/upload")public String upload(MultipartFile file, HttpSession session) throws IOException {InputStream inputStream = file.getInputStream();String originalFilename = file.getOriginalFilename();String[] strings = FastDFSUtils.uploadFile(inputStream, originalFilename, "s", "");System.out.println(strings);return "a";}@RequestMapping("/download")public void download(String group,String remote,HttpServletResponse response) throws IOException {byte[] datas = FastDFSUtils.download(group, remote);response.setContentType("application/octet-stream");// 设置下载文件的附件名称NameValuePair[] metaData = FastDFSUtils.getMetaData(group, remote);String fileName = "";for (NameValuePair metaDatum : metaData) {if ("fileName".equals(metaDatum.getName()))fileName = metaDatum.getValue();}response.setHeader("content-disposition","attachment;filename="+fileName.toString());// 输出要下载的文件内容到客户端
//        byte[] datas = (byte[]) result.get("datas");response.getOutputStream().write(datas, 0, datas.length);response.getOutputStream().flush();}}

                4)上传一张图片,在浏览器中访问图片 

                           这里的端口号为8888,fastdfs中内置有nginx服务器,请求从nginx服务器转发到storage服务器.

 

二、RabbitMQ

        publisher项目使用RabbitMQ软件将消息推送至交换机,交换机根据路由键将消息推送至相应队列中。Consumer项目中的监听器时刻监听提前设置好的监听队列,如果有消息进入队列中,会调用单元方法将消息中的数据取出消费,消费成功后返回信息在队列中删除消息

        如果消息在Consumer项目中拿取数据或者消费过程中出现错误,这个时候不会被删除,而是会多次尝试再次获取 消息 消费。达到一定次数,停止尝试。

        1)虚拟机使用docker安装RabbitMQ

             0、docker命令:

docker pull rabbitmq:managementdocker run -d --name rabbitmq -p 15672:15672 -p 5672:5672 --restart=always -e DEFAULT_USER=wollo -e DEFAULT_PASS=wollo rabbitmq:management

            ①、 访问 http:192.168.222.128:15672:   //Docker宿主机IP:15672

                        这个是RabbitMQ提供的可视化界面,类似于Navicat。

        ②、使用可视化界面操作RabbitMQ: 

                         创建交换机、创建队列、将交换机和队列绑定并设置路由键

   

                       

        



    2)使用java代码连接操作RabbitMQ

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1543744.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Cilium + ebpf 系列文章-什么是ebpf?(一)

前言&#xff1a; 这篇非常非常干&#xff0c;很有可能读不懂。 这里非常非常推荐&#xff0c;建议使用Cilium官网的lab来辅助学习&#xff01;&#xff01;&#xff01;Resources Library - IsovalentExplore Isovalents Resource Library, your one-stop destination for ins…

828华为云征文|华为云Flexus云服务器X实例部署Xnote笔记应用

828华为云征文&#xff5c;华为云Flexus云服务器X实例部署Xnote笔记应用 前言一、Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点1.3 Flexus云服务器X实例使用场景 二、Note Mark 介绍2.1 Xnote简介2.2 Xnote特点2.3 主要使用场景 三、本次实…

浅谈剩余电流动作保护装置的功能和应用

【摘要】介绍了剩余电流动作保护装置的组成、类型及功能&#xff0c;并针对设计中存在的问题&#xff0c;提出了在工程应用中需要注意的事项&#xff0c;进而结合相应的规范、标准和应用实际&#xff0c;分析了剩余电流动作保护装置在不同应用场所、不同电气环境下应如何正确选…

数据结构实验二之线性表(中)

实验题3:实现双链表的各种基本运算的算法 题目描述 编写一个程序dlinklist.cpp,实现双链表的各种基本运算和整体建表算法(偏 双链表的元素类型ElemType为int),并在此基础上设计一个程序exp2-3.cpp完成以 功能。 (1)初始化双链表h。 (2)依次采用尾插法插入元素a、b、c、d、e。 …

springboot itextpdf 形式导出pdf

先看效果(这里只设置了软件版本和 完成情况的勾选框) 导入pom依赖 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-asian</artifactId><version>5.2.0</version> </dependency> <!--itextpdf--> <d…

C++之初识STL(概念)

STL&#xff08;标准模板库&#xff09; STL广义分类为&#xff1a;容器&#xff0c;算法&#xff0c;迭代器 * **容器**和**算法**之间通过**迭代器**进行无缝连接 意义&#xff1a;C的**面向对象**和**泛型编程**思想&#xff0c;目的就是**复用性的提升** STL六大组件 1. 容…

Flink 本地启动的多种方式

Flink 本地启动的多种方式 Application模式通过代码提交到Yarn上启动 //设置Yarn客户端 YarnClient yarnClient ; Configuration configuration new Configuration(); if (customConfiguration ! null) {configuration.addAll(customConfiguration); } configuration.set(Jo…

PostgreSQL的学习心得和知识总结(一百五十一)|[performance] PostgreSQL列对齐

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

九泰智库 | 医械周刊- Vol.59

⚖️ 法规动态 国家药监局&#xff1a;截至目前已批准296个创新医疗器械上市 近日&#xff0c;国家药监局在“推动高质量发展”系列主题新闻发布会介绍。截至目前&#xff0c;国家药监局已批准296个创新医疗器械上市&#xff0c;这些创新医疗器械主要集中在植介入类设备、高端…

孤独伤感视频素材哪里找?分享热门伤感短视频素材资源网站

你是不是也经常在抖音上刷到很火的伤感视频&#xff0c;那么伤感视频素材都在哪里可以下载呢&#xff1f;作为一名从业多年的视频剪辑师&#xff0c;今天就跟大家聊聊那些可以下载伤感素材高清无水印的网站&#xff0c;如果你也在苦苦找寻伤感素材&#xff0c;快来看看吧&#…

基于Es和智普AI实现的语义检索

1、什么是语义检索 语义检索是一种利用自然语言处理&#xff08;NLP&#xff09;和人工智能&#xff08;AI&#xff09;技术来理解搜索查询的语义&#xff0c;以提供更准确和相关搜索结果的搜索技术&#xff0c;语义检索是一项突破性的技术&#xff0c;旨在通过深入理解单词和…

yolov5训练后自动保存打印到屏幕的性能信息

Windows环境&#xff1a; 执行train程序结束之后&#xff0c;会在屏幕打印下列信息&#xff1a; 我们在进行多轮训练时&#xff0c;性能信息不能及时保存&#xff0c;键入以下代码&#xff0c;可自动保存 #放在引入模块后面 sys.stdout open(train_output.txt, w) #这两行代…

音视频入门基础:FLV专题(2)——使用FFmpeg命令生成flv文件

通过FFmpeg命令可以合并视频和音频。比如合并mp4文件中的视频和AAC裸流&#xff08;关于AAC裸流具体可以参考&#xff1a; 《音视频入门基础&#xff1a;AAC专题&#xff08;2&#xff09;——使用FFmpeg命令生成AAC裸流文件》&#xff09;中的音频&#xff0c;生成FLV文件&…

string map练习

to_string 在<string>头文件的std命名空间中 要格式化写浮点型入字符串用 2.map 直接尾插 set,map同方法&#xff0c;map只是把键变为pair键值对 4. string的花括号隐式类型转换不能字母个数字母&#xff0c;会被认为是初始化列表&#xff0c;而不是个数加字母的隐式类…

SpringBoot 整合 apache fileupload 轻松实现文件上传与下载(通用版)

我们以Thymeleaf页面模板引擎为例&#xff0c;简单介绍利用 apache fileupload 工具实现文件上传的功能。 2.1、添加相关依赖包 首先创建一个基础的 Spring Boot 项目&#xff0c;并引入相关的依赖包。 2.2、添加相关配置参数 2.3、文件上传示例 对应文件上传的Controller类&…

QT设计中文输入法软键盘DLL给到C#开发步骤

开发目的&#xff1a;本文提供解决触摸屏C#程序中无法输入中文问题&#xff0c;中文拼音采用开源的谷歌输入法程序、使用QT编译中文输入法界面和中文输入法接口给到C#使用。 开发步骤&#xff1a; 1、QT中设计字母和字符输入界面 2、QT中设计数字输入界面 3、QT中封装调用谷歌…

深度学习:卷积神经网络CNN

目录 一、什么是卷积&#xff1f; 二、卷积神经网络的组成 1. 卷积层 2. 池化层 3. 激活函数 4. 全连接层 三、卷积神经网络的构造 四、代码实现 1.数据预处理 2.创建卷积神经网络 3.创建训练集和测试集函数 4.创建损失函数和优化器并进行训练 一、什么是卷积&…

LPDDR4芯片学习(一)——基础知识与引脚定义

一、基础知识 01 dram基本存储单元 当需要将一位数据存储到DRAM中时&#xff0c;晶体管会充电或放电电容。充电的电容表示逻辑高&#xff08;1&#xff09;&#xff0c;放电的电容表示逻辑低&#xff08;0&#xff09;。由于电容会随着时间泄漏电荷&#xff0c;因此需要定期刷…

学习记录:js算法(四十三):翻转二叉树

文章目录 翻转二叉树我的思路网上思路递归栈 总结 翻转二叉树 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点 图一&#xff1a; 图二&#xff1a; 示例 1&#xff1a;&#xff08;如图一&#xff09; 输入&#xff1a;root [4,2,7,1…

Python记录

1.冒泡排序 时间复杂度O&#xff08;n^2) 选择、插入都是 def bubble(data, reverse):for i in range(len(data)-1):for j in range(len(data)-i-1):if data[j] > data[j1]:data[j], data[j1] data[j1], data[j]if reverse:data.reverse()return data 2.快速排序 时间…