系统架构概览
在分布式系统中,文件存储服务需要解决高可用、高性能、可扩展三大核心问题。我们采用分层设计,整体架构如下:
┌─────────────────┐ ┌─────────────────────────────────────┐
│ 客户端层 │◄────►│ 服务端层 │
│ (测试/业务客户端)│ │ ┌─────────┐ ┌─────────────────┐ │
└─────────────────┘ │ │ RPC 服务 │ │ 核心依赖层 │ │
│ │(brpc) │ │ MinIO+Redis+LRU │ │
│ └─────────┘ └─────────────────┘ │
│ ▲ │
│ │ 服务注册发现层 │
│ │ (etcd) │
│ └───────────────────────────────┘
│ ┌─────────┐ ┌─────────────────┐ │
│ │ 服务构建器│ │ 元数据管理 │ │
│ │(Builder)│ │MultipartManager │ │
│ └─────────┘ └─────────────────┘ │
└─────────────────────────────────────┘
核心功能特性
- 支持单文件上传 / 下载、多文件批量上传 / 下载、分块上传 / 合并三种存储模式。
- 基于 MinIO 实现可靠的对象存储,兼容 S3 协议,支持分布式部署。
- Redis 持久化分块上传元数据,LRU 缓存热点文件信息,提升访问性能。
- etcd 实现服务注册与发现,支持服务动态扩容、故障自动切换。
- 完善的错误处理、参数校验、资源释放机制,保证服务稳定性。
服务端核心实现解析
服务启动与初始化
服务启动遵循「参数解析→日志初始化→依赖初始化→服务构建→启动」的标准化流程,代码结构清晰,可维护性强:
int main(int argc, char *argv[]) {
// 1. 命令行参数解析(google::gflags)
google::ParseCommandLineFlags(&argc, &argv, true);
// 2. 日志初始化(支持调试/发布模式切换)
zrt::init_logger(FLAGS_run_mode, FLAGS_log_file, FLAGS_log_level);
LOG_INFO("日志初始化完成,运行模式:{}", FLAGS_run_mode ? "发布" : "调试");
try {
// 3. Redis 客户端初始化(分块元数据存储)
sw::redis::ConnectionOptions redis_opts;
redis_opts.host = FLAGS_redis_host;
redis_opts.port = FLAGS_redis_port;
redis_opts.password = FLAGS_redis_password;
redis_opts.db = FLAGS_redis_db;
redis_client = std::<sw::redis::Redis>(redis_opts);
redis_client->();
();
zrt::MinIOClient::ptr minio_client = std::<zrt::MinIOClient>(
FLAGS_minio_endpoint, FLAGS_minio_access_key,
FLAGS_minio_secret_key, FLAGS_minio_bucket
);
();
zrt::FileServerBuilder fsb;
fsb.(FLAGS_minio_endpoint, FLAGS_minio_access_key,
FLAGS_minio_secret_key, FLAGS_minio_bucket);
fsb.(redis_client);
fsb.(FLAGS_listen_port, FLAGS_rpc_timeout,
FLAGS_rpc_threads, FLAGS_storage_path);
fsb.(FLAGS_registry_host, FLAGS_base_service + FLAGS_instance_name,
FLAGS_access_host);
server = fsb.();
(, FLAGS_listen_port);
server->();
} ( std::exception& e) {
(, e.());
;
}
;
}


