基于 BRPC+Protobuf+Etcd 的分布式文件存储 RPC 服务实现详解
一、系统整体架构:从'通信'到'治理'的全链路设计
这套文件存储系统是一套分布式 RPC 服务解决方案,核心目标是提供'可靠的文件上传/下载能力',并通过服务治理确保分布式环境下的可用性。整体分为 5 层,各层职责清晰、解耦协作:
| 层级 | 核心组件 | 作用 |
|---|---|---|
| 协议定义层 | Protobuf 文件(file.proto 等) | 定义 RPC 通信的'契约':数据结构 + 服务接口 |
| 业务逻辑层 | FileServiceImpl | 实现文件读写的核心业务逻辑 |
| 服务封装层 | FileServer、FileServerBuilder | 封装 BRPC 服务器,简化服务启停与配置 |
| 服务治理层 | Registry、Discovery、ServiceManager | 基于 Etcd 实现服务注册/发现、负载均衡 |
| 客户端测试层 | GTest 测试用例 | 验证服务可用性,覆盖全量 RPC 接口 |
简单理解:客户端通过'服务治理层'找到可用的服务节点,通过'协议定义层'构造请求,调用'业务逻辑层'的文件处理接口,整个过程由'服务封装层'保障服务稳定运行。
二、协议定义层:用 Protobuf 制定'通信规则'
Protobuf(Protocol Buffers)是 Google 的序列化协议,这里用来定义'客户端和服务端该怎么说话'——包括传递的数据格式(消息)和可调用的方法(服务)。这是整个系统的'语言基础',客户端和服务端必须完全遵守。
2.1 核心消息(Message)定义
消息是 RPC 通信的'数据载体',每个消息对应一个具体的数据结构,以下是关键消息的解析:
| 消息名称 | 作用 | 关键字段说明 |
|---|---|---|
| GetSingleFileReq | 单文件下载请求 | request_id(请求唯一标识)、file_id(文件 ID) |
| GetSingleFileRsp | 单文件下载响应 | success(是否成功)、errmsg(错误信息)、file_data(文件数据) |
| GetMultiFileReq | 多文件下载请求 | file_id_list(文件 ID 列表,repeated 表示'多个') |
| GetMultiFileRsp | 多文件下载响应 | file_data(map 结构:file_id→文件数据,方便匹配) |
| PutSingleFileReq | 单文件上传请求 | file_data(包含文件名、大小、二进制内容) |
| PutSingleFileRsp | 单文件上传响应 | file_info(返回文件元信息:file_id、大小、名称) |
| FileDownloadData | 文件下载数据载体 | file_id(文件 ID)、file_content(二进制文件内容) |
| FileUploadData | 文件上传数据载体 | file_name(文件名)、file_size(大小)、file_content(二进制内容) |
| MessageType | 消息类型枚举(扩展用) | STRING(文字)、IMAGE(图片)、FILE(文件)、SPEECH(语音) |


