交流讨论💬
设计理念与架构
ECMDB 是平台生态中负责数字资产中枢与动态元模型驱动的核心微服务。
- 源码仓库:GitHub: Duke1616/ecmdb
- 服务契约:HTTP RESTful (
:8000) / 内部 gRPC (:8078) - 核心底座:Golang 1.25、Percona Server for MongoDB 7.0+、Redis 7.0+
1. 总体架构
ECMDB 采用分层解耦架构,核心能力由元模型驱动引擎与专用存储底座协同实现:

- 外部接入层:承接统一 Web 控制台交互、自动化脚本与第三方系统纳管,提供 HTTP RESTful (
:8000) 与内部 gRPC (:8078) 双通道,统一由 EIAM 执行身份认证与 PBAC 策略拦截; - Core 服务层:收敛三级元模型管理、资产平铺内联读写与双向拓扑图谱,横切贯穿
IResourceProtector敏感凭据统管; - 底层引擎层:基于 Percona MongoDB 统一集合(平铺存储 + 原生 ngram 倒排索引)提供高吞吐,辅以 Redis 分布式锁与热点缓存。
2. 核心设计特色
统一平铺内联存储 (bson:",inline")
异构资产属性统一收敛在单一集合 c_resources 中,依靠 model_uid 区分模型,通过平铺打散存储在根文档:
json
{
"_id": "66e7f8...",
"resource_id": 10086,
"tenant_id": "system",
"model_uid": "host",
"name": "prod-app-01",
"ip": "10.0.8.21",
"password": "ENC:V1:a8f93c...", // Secure 敏感属性自动带版本前缀落盘加密
"ctime": 1726488000
}- 零 DDL 锁表:新增自定义字段只需插入元数据,资产数据免 DDL、随写随存;
- 原生原子局部读写:所有字段直接位于根路径,天然支持 MongoDB 原生
$set/$unset局部原子更新; - 高效复合索引:支持自由针对高频平铺字段建立复合索引(如
tenant_id + model_uid + ip)。
原生通配 3-gram 全文检索
免除外部 Elasticsearch 与 Canal/Kafka 同步链路,依托 Percona MongoDB 原生 ngram 插件实现全字段模糊搜索:
go
// internal/repository/dao/init.go
// $** 通配捕获任意动态属性,ngram 滑窗实现中文/IP片段分词
indexes := []mongo.IndexModel{
{
Keys: bson.D{{Key: "$**", Value: "text"}},
Options: options.Index().SetDefaultLanguage("ngram"),
},
}- 全字段自动纳入:任意模型下新增的属性自动被倒排索引捕获,零维护成本;
- 零外部中间件:单套数据库即可支撑 IP 片段、序列号和名称的毫秒级全文检索。
关系拓扑与穿透寻路
资产并非孤立存在,系统通过 c_relations 与 c_relation_types 构建双向网络:
- 类型约束:预定义源与目标约束(如
Host 运行于 Pod、Host 关联网关),约束关系基数; - 双向图谱解析:支持向下依赖追踪与向上影响面反查;
- 级联网络穿透:运维直连或下发脚本时,自动沿拓扑寻路合成跳板机网关上下文。
凭据全生命周期保护
对密码、私钥等机密数据执行闭环防护:
- 落盘阶段:
Secure属性统一采用 AES-GCM-256 密文存储; - 展示阶段:列表与详情查询在接口层自动置空脱敏(展示
[已脱敏]),防止前端审查泄露; - 直连阶段:微服务插件(WebShell/SFTP)发起握手时通过内网 gRPC 瞬态解密,握手完毕即刻在内存彻底销毁。
3. 控制面与数据面解耦
ECMDB 将运维操作入口彻底与资产主站解耦:
- ECMDB Core(控制面):专注元模型、资产管理与凭据安全,保障高可用;
- ecmdb-plugins(数据面):独立微服务承接 SSH WebShell 长连接与 SFTP 流传输,崩溃或高负载完全不影响主站。
TIP
详细反向代理流程、插件自动注册契约与 Go Tag 绑定机制,请参阅:
👉 微服务插件体系