• Means:基于 .NET 10 打造的开源自部署 S3 兼容对象存储服务


    Means:基于 .NET 10 打造的开源自部署 S3 兼容对象存储服务

    🔗 GitHub 地址:https://github.com/AIDotNet/Means

    欢迎 Star ⭐、Fork、提 Issue 和 PR!MIT 开源协议,放心使用。


    image

    image

    引言

    对象存储已经成为现代云原生架构的基石。从 AWS S3 到 MinIO,S3 兼容 API 几乎成了对象存储的"通用语言"。然而在 .NET 生态中,一直缺少一个纯 .NET 原生实现的高质量 S3 兼容存储方案。

    Means 应运而生——它是一个基于 .NET 10 / ASP.NET Core 构建的、可自部署的 S3 兼容对象存储服务。你可以把它理解为一个 .NET 版的 MinIO:完全兼容 S3 API,支持单节点多盘部署,提供 Web 管理控制台,同时提供 C# 和 TypeScript SDK。


    一、为什么需要一个 .NET 原生的对象存储?

    • 统一技术栈:如果你的团队以 .NET 为主,Means 可以无缝融入现有运维体系,无需额外学习 Go/Java 生态的运维工具
    • 深度定制:源码完全开放(MIT),你可以根据自己的业务需求修改存储后端、接入自定义认证、扩展协议
    • .NET 10 性能红利:享受 .NET 10 的原生 AOT、低内存占用和高吞吐能力
    • 自部署、数据主权:数据完全在你自己的基础设施上,满足合规和隐私需求

    二、Means 的核心能力

    S3 数据面(v1 基线)

    Means 已实现了生产级的 S3 协议兼容,覆盖绝大多数常用场景:

    能力 说明
    Bucket 管理 ListBuckets / CreateBucket / HeadBucket / DeleteBucket
    对象 CRUD PutObject / GetObject / HeadObject / DeleteObject / CopyObject
    ListObjectsV2 支持 prefix / delimiter / continuation-token / max-keys
    Multipart Upload 完整实现:initiate → upload part → upload part copy → complete / abort / list parts / list uploads
    Versioning Bucket 版本控制、object versionId、delete marker、ListObjectVersions
    Object Tagging 支持 current version 和指定 versionId
    Lifecycle 过期删除、非当前版本清理、未完成 Multipart 自动中止
    Bucket CORS CRUD 配置 + OPTIONS preflight
    Bucket Policy 基础 Allow/Deny 策略
    Bucket Notification 预留配置接口
    SigV4 预签名 URL GET / PUT / multipart UploadPart
    Range 读取 支持 206 Partial Content,非法 Range 返回 416

    协议兼容细节

    • 同时支持 path-stylevirtual-hosted-style 地址解析
    • 统一返回 S3 风格 XML 响应(列表、错误、复制结果)
    • 支持内容协商压缩(br / gzip),Range 请求下自动禁用压缩
    • PutObject原子写入语义,元数据事务提交后对象对外可见
    • Multipart Upload 严格遵循 S3 规范:partNumber 1-10000,最小 5 MiB,ETag 为 md5(concat(part-md5-bytes))-part-count

    管理控制台

    内置基于 React 的 Web 管理控制台(/api/console JSON API + wwwroot),提供:

    • 🔐 登录/登出/会话管理(Cookie 鉴权)
    • 🪣 Bucket 管理(创建、删除、对象浏览)
    • 📋 Bucket Policy 可视化管理
    • 🔗 预签名上传/下载链接生成
    • 📤 大文件分片上传(默认 5 MiB 起启用 multipart,16 MiB part,3 并发)
    • 🔑 AccessKey 管理(创建、删除、列表)
    • ⚙️ 系统设置(最大上传大小)
    • 📊 审计日志与小时级请求统计看板
    • 🖥️ 集群状态页、节点/磁盘健康页与诊断导出
    • 📈 Prometheus 文本指标导出(/metrics
    • 🔭 可选 OpenTelemetry 链路追踪(OTLP)
    • ⏱️ 后台任务统一管理与手动触发

    三、技术架构

    整体分层

    ┌──────────────────────────────────────────┐
    │        React 管理控制台 (Vite)            │
    ├──────────────────────────────────────────┤
    │        Console API (/api/console)         │
    ├──────────────────────────────────────────┤
    │     S3 数据面 API (REST / SigV4)          │
    ├──────────────────────────────────────────┤
    │   Means.Protocol.S3 (协议层)              │
    │   · 地址解析 (path / virtual-hosted)      │
    │   · SigV4 签名校验                        │
    │   · S3 XML 序列化/反序列化                │
    ├──────────────────────────────────────────┤
    │   Means.Core (业务核心)                   │
    ├──────────────────────────────────────────┤
    │   存储后端 (可插拔)                        │
    │   · XlFs (默认,MinIO-inspired)           │
    │   · SqliteFs (SQLite + filesystem)       │
    ├──────────────────────────────────────────┤
    │   MeansLogDb (元数据引擎)                  │
    │   · Append-only WAL                       │
    │   · Batch atomic commit                   │
    │   · Snapshot / Restore / Recovery         │
    └──────────────────────────────────────────┘
    

    关键技术选型

    层级 技术选型
    运行时 .NET 10 / ASP.NET Core
    存储后端 XlFs(自研,MinIO-inspired 单节点多盘)、SqliteFs(SQLite + filesystem,legacy/test)
    元数据引擎 MeansLogDb(自研 WAL + Snapshot 索引引擎)
    前端 React + TypeScript + Vite + TailwindCSS
    SDK C# SDK、TypeScript SDK(browser-safe)、Node SDK
    可观测性 Prometheus metrics + OpenTelemetry tracing(OTLP)
    部署 Docker / Docker Compose(单节点 + 多节点实验拓扑)
    客户端兼容 AWS CLI、boto3、aws-sdk-js、rclone、mc
    许可证 MIT

    自研存储后端 XlFs

    XlFs 是 Means 默认的存储引擎,设计灵感来自 MinIO 的 Xl 存储格式,核心特性:

    • 单节点多盘:充分利用多块磁盘的 IO 能力
    • 对象 Manifest:每个对象维护完整的元数据清单
    • Quorum 机制:读写时基于多数派保证数据一致性
    • MeansLogDb:自研的 append-only WAL 元数据索引引擎,支持 batch atomic commit、snapshot/restore、crash recovery
    • 后台任务:heartbeat、disk health、metadata consistency check、storage GC、repair、rebalance、lifecycle、replication worker

    四、快速开始

    环境要求

    • .NET SDK 10
    • Node.js 20+(仅修改前端时需要)

    源码启动

    git clone https://github.com/AIDotNet/Means.git
    cd Means
    dotnet restore Means.slnx
    dotnet build Means.slnx
    dotnet run --project src/Means/Means.csproj --launch-profile http
    

    访问 http://localhost:5178,默认控制台账号:meansadmin / meansadmin-local

    Docker Compose 启动

    单节点(XlFs 存储):

    docker compose up -d --build
    

    多节点实验拓扑:

    docker compose -f compose.multinode.yaml up -d --build
    # 访问 http://localhost:5181 / 5182 / 5183
    

    S3 客户端接入

    默认 S3 凭证:meansadmin / meansadmin-local-secret。可以直接使用 AWS CLI、rclone、mc 等标准 S3 客户端连接。


    五、开发路线图

    Means 正在快速迭代中,以下是里程碑计划:

    里程碑 状态 内容
    M3 ✅ 已完成 Versioning + Lifecycle
    M1 🚧 进行中 单机生产化 hardening
    M2 🚧 进行中 多副本分布式存储
    M4 📋 计划中 IAM/STS + SSE 加密
    M5 📋 计划中 Replication + Object Lock
    M6 📋 计划中 纠删码(EC)+ 自动 repair/rebalance
    M7 📋 计划中 S3 兼容矩阵全面稳定

    当前已完成的核心能力:分布式存储内核(节点注册/心跳/副本写入/修复队列)、MeansLogDb 元数据引擎、Versioning、Lifecycle、Bucket CORS、Object Tagging、后台任务框架、多客户端兼容测试等。


    六、为什么选择 Means?

    vs. MinIO

    对比维度 MinIO (Go) Means (.NET)
    技术栈 Go 语言 .NET 10 / C#
    开源协议 AGPLv3 MIT
    控制台 功能丰富 React 管理控制台
    SDK 官方 SDK 多语言 C# / TypeScript / Node
    .NET 集成 需通过 HTTP/S3 SDK 原生 .NET 集成
    定制门槛 需熟悉 Go 生态 对 .NET 团队零门槛

    适用场景

    • ✅ .NET 技术栈团队需要自部署对象存储
    • ✅ 希望拥有完全可控的存储源码(MIT 协议)
    • ✅ 需要在对象存储上做深度定制(自定义认证、存储后端、审计)
    • ✅ 边缘部署 / 私有云 / 混合云场景
    • ✅ 学习和研究 S3 协议实现的开发者

    结语

    Means 是 .NET 生态中一个非常有野心的开源项目——用 C# 实现一个完整的 S3 兼容对象存储。它不仅填补了 .NET 生态在这一领域的空白,更以 MIT 协议 开放全部源码,让 .NET 开发者第一次可以真正"拥有"自己的对象存储。

    当前 Means 已经具备了单节点生产级存储能力,分布式多节点正在快速迭代中。如果你是用 .NET 做基础设施的团队,或者对 S3 协议实现感兴趣,不妨去看看源码,点个 Star ⭐ 支持一下这个项目。

    用 .NET 10 重新定义对象存储——Means,让 S3 触手可及。


    🔗 GitHub:https://github.com/AIDotNet/Means

    如果觉得 Means 对你有帮助,请给项目点个 ⭐ Star 支持一下!


  • 相关阅读:
    低代码平台:通过可视化的开发工具和组件库,可快速地构建应用程序,从而实现快速迭代和升级
    【NVMe2.0b 14-6】Format NVM、Keep Alive、Lockdown command
    【JavaEE】JUC(java.util.concurrent)的常见类以及线程安全的集合类
    如何实现工业设备一站式的远程维护?
    webpack 自定义loader与插件
    全局平均池化/全局最大池化Pytorch实现:
    c#中禁用当鼠标位于控件上方时ToolStripDropDownButton上的蓝色焦点
    SpringCloud(三)Sentinel、Seata、多级缓存
    web前端期末大作业 html+css学生心理 7页主题网页设计
    LabVIEW压电驱动迟滞补偿控制
  • 原文地址:https://www.cnblogs.com/token-ai/p/20308087