网站开发/百度信息流推广

网站开发,百度信息流推广,怎么在ps做网站首页,南京软件外包公司排名目录 功能设计 模块划分 业务接口/功能示意图 服务实现流程 服务代码实现 封装文件操作模块(utils.hpp) 获取唯一标识ID 文件读操作 文件写操作 编写proto文件 文件元信息 文件管理proto 单文件上传 多文件上传 单文件下载 多文件下载 RPC调用 服务端创建子…

目录

功能设计

模块划分

业务接口/功能示意图

服务实现流程

服务代码实现

封装文件操作模块(utils.hpp)

获取唯一标识ID

文件读操作

文件写操作

编写proto文件

文件元信息

文件管理proto

单文件上传

多文件上传

单文件下载

多文件下载

RPC调用

服务端创建子类(FileManageServiceImpl)完成RPC服务调用函数重写

SingleFileUp(单文件上传)

MultiFileUp(多文件上传)

SingleFileDown(单文件下载)

MultiFileDown(多文件下载)

RPC服务端代码(总)

服务端完成文件管理子服务类(FileManageServer)

注意

实例化服务类对象,启动服务

工程系统构建配置文件(CMakeLists.txt)

服务测试


本章节,主要对项目中文件管理子服务模块进行分析、开发与测试。

功能设计

文件管理子服务,主要提供两个功能:文件的上传和文件的下载,因此,文件管理子服务主要提供4个功能性接口:

1、单个文件的上传:主要用于后台,将收到的文件消息进行存储。

2、多个文件的上传:主要用于后台,将收到的文件消息进行存储。

3、单个文件的下载:在后台用于获取头像文件数据,以及客户端用于获取文件数。

4、多个文件的下载:在后台用于大批量获取头像文件数据,以及前端的批量文件下载。

模块划分

参数/配置文件解析模块基于gflags框架直接使用,进行参数/配置文件的解析。
日志模块基于spdlog封装的logger 直接进行日志输出。
服务注册模块基于etcd框架封装的注册模块 直接进行文件管理子服务模块的服务注册。
RPC服务模块基于brpc框架 搭建文件管理子服务的RPC服务器。
文件操作模块基于标准库的文件流操作实现文件的读写封装,用于文件操作。

业务接口/功能示意图

文件上传:

文件下载/获取:

服务实现流程

1、实现文件操作模块的封装(utils.hpp),其中包括 文件读操作、文件写操作,外加一个获取唯一标识ID的操作(用于用户ID、文件ID等)。
2、编写服务所需的proto文件,利用protoc工具生成RPC服务器所需的.pb.h 和 .pb.cc 项目文件。
3、服务端 创建子类,继承于proto文件中RPC调用类,并进行功能性接口函数重写。
4、服务端 完成文件管理子服务类。
5、实例化 服务类对象,启动服务。

服务代码实现

封装文件操作模块(utils.hpp)

获取唯一标识ID

在代码中,文件ID、用户ID 或者是 会话ID 都由此处操作来获取。

这里使用16个随机的字符串 组成这个唯一的标识ID。

实现思想:

1、先生成6个 0 ~ 255 内的随机数字,而1 个 字节,为 8位。再将这8位,分成4 4 位,每4位转换成1个16进制数字,从而 1个随机数字 转换成 2个 16位数字。至此,得到12 位 随机16进制字符。

2、再通过一个 静态变量,生成一个2 字节的 编号数字,同样 转换成 4 个 16位数字。至此,得到4位 随机16进制字符。

3、将1和2进行拼接,得到16个随机的字符串。

utils.hpp:

    // 生成一个唯一标识IDstd::string uuid(){// 1. 生成12位16进制字符std::random_device rd;                                   // 实例化设备随机数对象, 用于生成设备随机数(唯一性更强)std::mt19937 generator(rd());                            // 以设备随机数为种子, 实例化随机数对象(mt19937:一种生成随机数的方式)std::uniform_int_distribution<int> distribution(0, 255); // 限定生成随机数的范围std::stringstream ss;for (int i = 0; i < 6; ++i){if (i == 2)ss << "-"; // 添加-, 最终形式为: xxxx-yyyy-zzzz-ddddss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator);// distribution(generator) : 生成一个 0-255的随机数// std::hex + std::setw(2) : 转换为 2个 16进制数// std::setfill('0'): 不足的,前面用0填充}// 2. 通过静态变量生成 4位 16进制字符ss << "-";static std::atomic<short> idx(0);short tmp = idx.fetch_add(1);ss << std::setw(4) << std::setfill('0') << std::hex << tmp;return ss.str();}

文件读操作

通过传入文件名 和 承接文件内容的string,用来获取文件内容。

实现思想:

1、根据文件名打开文件。

2、跳转文件内部指针,获取文件指针偏移量(文件大小)。

3、再将文件内部指针跳转开头,进行读取文件内容。

4、关闭文件。

utils.hpp:

    // 读取文件bool ReadFile(const std::string &file_name, std::string &body){std::ifstream ifs(file_name, std::ios::in | std::ios::binary);if (ifs.is_open() == false){LOG_ERROR("打开文件失败, file_name: {}", file_name);return false;}ifs.seekg(0, std::ios::end);size_t file_size = ifs.tellg();ifs.seekg(0, std::ios::beg);body.resize(file_size);ifs.read(&body[0], file_size);if (ifs.good() == false){LOG_ERROR("读取文件失败, file_name: {}", file_name);ifs.close();return false;}ifs.close();return true;}

文件写操作

通过传入文件名 和 想要写入的内容,用来向文件写入数据。

实现思想:

1、根据文件名打开文件。

2、写入数据。

3、关闭文件。

utils.hpp:

    // 写入文件bool WriteFile(const std::string &file_name, const std::string &body){std::ofstream ofs(file_name, std::ios::out | std::ios::binary | std::ios::trunc); // 覆盖式写入if (ofs.is_open() == false){LOG_ERROR("打开文件失败, file_name: {}", file_name);return false;}ofs.write(body.c_str(), body.size());if (ofs.good() == false){LOG_ERROR("写入文件失败, file_name: {}", file_name);ofs.close();return false;}ofs.close();return true;}

编写proto文件

文件元信息

首先对于文件来说,不光需要编写文件的上传/下载的proto文件,文件还需要有它的元信息(文件ID、文件名称、文件大小、文件内容),并且后续用户发送的消息里面,也可能是文件,需要我们进行识别,所以将文件的元信息,单独放在一个proto文件里面(后续用户元信息、会话元信息、图像元信息、语音元信息、字符串消息元信息都放在里面)。统称为 base.proto

文件元信息(FileInfo)成员:

1、file_id:文件ID。

2、file_size:文件大小。

3、file_name:文件名称。

4、file_content:文件内容。

// ------文件元信息------
message FileInfo
{optional string file_id = 1;optional int64 file_size = 2;optional string file_name = 3;optional bytes file_content = 4;
};

考虑到多文件上传/下载需要repeated的相同信息,所以将文件的上传和下载所需要的信息也放进来。 

// ------文件元信息 + 文件上传/下载信息------
message FileInfo
{optional string file_id = 1;optional int64 file_size = 2;optional string file_name = 3;optional bytes file_content = 4;
};
message FileUpInfo
{string file_name = 1;int64 file_size = 2;bytes file_content = 3;
};
message FileDownInfo
{string file_id = 1;bytes file_content = 2;
};

文件管理proto

既然文件管理模块有4个功能性接口,那么就有4个对应的请求与响应结构,以及最终的PRC调用(fileManage.proto)。

单文件上传

SingleFileUpReq包含成员:

1、请求ID:标识请求的唯一性。

2、文件上传信息:存储文件上传所需信息(文件名、文件大小、文件内容)。

3、用户ID(optional):标明来自哪个用户。

4、会话ID(optional):标明来自哪个会话。

SingleFileUpResp包含成员:

1、请求ID:对应请求中的请求ID,标识请求唯一性。

2、成功标识:标识该次请求的处理结果。

3、错误信息(optional):如果处理出错,记录出错信息。

4、文件元信息:存储文件元信息(文件ID、文件大小、文件名、文件内容)。

// ------单文件上传------
message SingleFileUpReq
{string req_id = 1;FileUpInfo file_up_info = 2;optional string user_id = 3;optional string session_id = 4;
};
message SingleFileUpResp
{string req_id = 1;bool success = 2;optional string err_msg = 3;optional FileInfo file_info = 4;
};
多文件上传

多文件上传和单文件上传没啥不同的,就是里面的文件东西,由列表来构成。

// ------多文件上传------
message MultiFileUpReq
{string req_id = 1;repeated FileUpInfo file_up_info_list = 2;optional string user_id = 3;optional string session_id = 4;
};
message MultiFileUpResp
{string req_id = 1;bool success = 2;optional string err_msg = 3;repeated FileInfo file_info_list = 4;
};
单文件下载

SingleFileDownReq包含成员:

1、请求ID:标识请求的唯一性。

2、文件ID:根据文件ID才能找到文件。

3、用户ID(optional):标明来自哪个用户。

4、会话ID(optional):标明来自哪个会话。

SingleFileDownResp包含成员:

1、请求ID:对应请求中的请求ID,标识请求唯一性。

2、成功标识:标识该次请求的处理结果。

3、错误信息(optional):如果处理出错,记录出错信息。

4、文件下载信息:存储文

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ES的简单讲解

功能 &#xff1a; 文档存储 与 文档搜索 特点&#xff1a;比如有一个文档名 “你好” 可以用‘你‘&#xff0c;好&#xff0c;你好都可以搜索到这个文档 ES核心概念 类似于数据库中表的概念&#xff0c;在表的概念下又对数据集合进行了细分 ​ ES_Client查询接口 cpr::R…

宝塔安装向量数据库-Milvus

注&#xff1a;宝塔需要安装好docker容器组件&#xff01; 1、纯血宝塔安装 1.1 在线上镜像中&#xff0c;拉取milvus镜像&#xff0c;创建milvus容器 1.2 安装milvus管理工具ATTU&#xff1b;同样方式拉取线上镜像创建attu容器 2、自定义安装 2.1修改配置 {"registry-…

【K8S】Kubernetes 基本架构、节点类型及运行流程详解(附架构图及流程图)

Kubernetes 架构 k8s 集群 多个 master node 多个 work nodeMaster 节点&#xff08;主节点&#xff09;&#xff1a;负责集群的管理任务&#xff0c;包括调度容器、维护集群状态、监控集群、管理服务发现等。Worker 节点&#xff08;工作节点&#xff09;&#xff1a;实际运…

数据库MySQL,在终端输入后,提示不是内部命令等

【解决问题】mysql提示不是内部或外部命令&#xff0c;也不是可运行的程序 一般这种问题是因为没有在系统变量里面添加MySQL的可执行路径 以下是添加可执行路径的方法&#xff1a; 第一步&#xff1a;winR输入services.msc 然后找到MySQL&#xff0c;右击属性并复制MySQL的可执…

PhotoShop学习01

了解Photoshop 这里省略了Photoshop的软件安装&#xff0c;请自行查找资源下载。 1.打开图片 下图为启动photoshop后出现的界面&#xff0c;我们可以通过创建新文件或打开已有文件来启用photoshop的工作界面。 可以通过左边的按钮进行新文件的创建或打开已有文件。 也可以点…

GitCode 助力 python-office:开启 Python 自动化办公新生态

项目仓库&#xff1a;https://gitcode.com/CoderWanFeng1/python-office 源于需求洞察&#xff0c;打造 Python 办公神器 项目作者程序员晚枫在运营拥有 14w 粉丝的 B 站账号 “Python 自动化办公社区” 时&#xff0c;敏锐察觉到非程序员群体对 Python 学习的强烈需求。在数字…

javaweb + AI day03

一、web基础 二、分层解耦 注意&#xff1a;bean的名字默认是类名的首字母小写&#xff01;&#xff01;&#xff01; 三、Mysql count不参与null值统计 四、JDBC 五、MyBatis 数据库连接池

运行程序时出现加载配置文件时出错,对路径****的访问被拒绝

问题&#xff1a;最近给客户用c#语言编写进销存项目&#xff0c;在用vs2022自带的打包工具Microsoft visual studio installer projects 打包生成了安装文件&#xff0c;顺利安装后&#xff0c;点击桌面快捷方式后出现如下错误 经过查询相关资料发现是桌面快捷方式的权限问题&a…

基于C#的CANoe CLR Adapter开发指南

一、引言 CANoe 是一款广泛应用于汽车电子开发和测试的工具&#xff0c;它支持多种编程接口&#xff0c;方便开发者进行自定义扩展。CANoe CLR Adapter 允许我们使用 C# 语言与 CANoe 进行交互&#xff0c;充分利用 C# 的强大功能和丰富的类库。本文将详细介绍如何基于 C# 进行…

【三维分割】LangSplat: 3D Language Gaussian Splatting(CVPR 2024 highlight)

论文&#xff1a;https://arxiv.org/pdf/2312.16084 代码&#xff1a;https://github.com/minghanqin/LangSplat 文章目录 一、3D language field二、回顾 Language Fields的挑战三、使用SAM学习层次结构语义四、Language Fields 的 3DGS五、开放词汇查询&#xff08;Open-voca…

haclon固定相机位标定

什么是标定&#xff1f; 工业应用中相机拍到一个mark点的坐标为C1&#xff08;Cx,Cy&#xff09;&#xff0c;C1点对应的龙门架/机械手等执行端对应的坐标是多少&#xff1f; 标定就是解决这个问题&#xff0c;如相机拍到一个点坐标C1&#xff08;Cx,Cy&#xff09;&#xff0c…

【通俗讲解电子电路】——从零开始理解生活中的电路(二)

电路分析&#xff1a;看懂简单的“电路图” ——从“路线图”到“工具箱”&#xff0c;掌握电路的底层逻辑 1. 欧姆定律&#xff1a;电的“交通规则” 公式解析&#xff1a;V I R 电压&#xff08;V&#xff09;&#xff1a;推动电流的动力&#xff08;如电池电压&#xff…

Linux 第三次脚本作业

源码编译安装httpd 2.4&#xff0c;提供系统服务管理脚本并测试&#xff08;建议两种方法实现&#xff09; 一、第一种方法 1、把 httpd-2.4.63.tar.gz 这个安装包上传到你的试验机上 2、 安装编译工具 (俺之前已经装好了&#xff09; 3、解压httpd包 4、解压后的httpd包的文…

视频推拉流EasyDSS点播平台云端录像播放异常问题的排查与解决

EasyDSS视频直播点播平台是一个功能全面的系统&#xff0c;提供视频转码、点播、直播、视频推拉流以及H.265视频播放等一站式服务。该平台与RTMP高清摄像头配合使用&#xff0c;能够接收无人机设备的实时视频流&#xff0c;实现无人机视频推流直播和巡检等多种应用。 最近&…

SpringBoot新闻推荐系统设计与实现

随着信息时代的快速发展&#xff0c;新闻推荐系统成为用户获取个性化内容的重要工具。本文将介绍一个幽络源的基于SpringBoot开发的新闻推荐系统&#xff0c;该系统功能全面&#xff0c;操作简便&#xff0c;能够满足管理员和用户的多种需求。 管理员模块 管理员模块为系统管…

一次现网问题定位-线程池设置不当,导致流量上去后接口变慢

背景 公司大促活动流量上升&#xff0c;突然一线用户反馈发消息特别慢&#xff0c;运维已经初步通过监控发现B服务接口大量超时&#xff0c;调用链如下图。 发消息接口以前只经过A服务&#xff0c;后面为了防止客服骂人&#xff08;我们是客服系统&#xff09;&#xff0c;接…

【JavaWeb13】了解ES6的核心特性,对于提高JavaScript编程效率有哪些潜在影响?

文章目录 &#x1f30d;一. ES6 新特性❄️1. ES6 基本介绍❄️2. 基本使用2.1 let 声明变量2.2 const 声明常量/只读变量2.3 解构赋值2.4 模板字符串2.5 对象拓展运算符2.6 箭头函数 &#x1f30d;二. Promise❄️1. 基本使用❄️2. 如何解决回调地狱问题2.1回调地狱问题2.2 使…

《几何原本》命题I.2

《几何原本》命题I.2 从一个给定的点可以引一条线段等于已知的线段。 设 A A A 为给定点&#xff0c; B C BC BC 为给定线段 连接 A B AB AB&#xff0c;作等边 △ A B D \triangle ABD △ABD 以 B B B 为圆心&#xff0c; B C BC BC 为半径作小圆 延长 D B DB DB 交小圆…

java数据结构_Map和Set_9.1

1. 搜索树 1.1 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有的结点都小于根结点的值若它的右子树不为空&#xff0c;则右子树上所有的结点都大于根结点的值…

蓝桥杯 路径之谜

路径之谜 题目描述 小明冒充 XX 星球的骑士&#xff0c;进入了一个奇怪的城堡。 城堡里边什么都没有&#xff0c;只有方形石头铺成的地面。 假设城堡地面是 nnnn 个方格。如下图所示。 按习俗&#xff0c;骑士要从西北角走到东南角。可以横向或纵向移动&#xff0c;但不能斜着走…