Platform 工具平台模块
Platform 是模块化单体中的「工具型」子域聚合层。它不承担核心业务,而是把一批彼此独立、却常被业务复用的横切能力聚到一起:待办、短链接、节假日、消息中心,以及热榜、TTS、导航站、加密、IP 查询、服务器监控等。本文讲清这个模块的边界在哪、为什么聚到一起、内部如何划分子域,各子域的用法见下方子页面。
为什么把这类能力聚成一个模块
这些能力的共同点是:不属于任何单一业务域,却哪个业务都可能用到。如果拆成独立微服务,会带来部署、鉴权、事务边界的额外成本,而它们彼此之间几乎不需要跨域事务。把它们作为模块化单体里的一个 IModuleStartup 挂载,本质上是用「进程内模块边界」替代「服务边界」——既能整体关闭,又省去远程调用的复杂度。
边界原则:
- 可独立数据源:短链接数据量大且与业务库无关,因此使用独立 FreeSql 实例(
ShortFlag),与主库物理隔离(见下文关系图)。 - 可插拔策略:多渠道场景(消息中心)用
IMessageChannelSender策略模式,飞书/企微/公众号各自实现,新增渠道不改核心逻辑。 - 可水平扩展子域:热榜聚合用
keyed IDailyHotService按平台枚举注册多个实现,聚合 Job 遍历所有键即可。
子域划分与业务能力地图
| 子域 | 承载的业务能力 | 关键服务 |
|---|---|---|
| 节假日 | 中国法定节假日/工作日的同步与本地查询 | IHolidayService · IHolidayManager |
| 短链接 | 长链转短码、跳转计数、批量创建(独立库分表) | IShortUrlService |
| 待办事项 | 个人待办 CRUD、完成态、拖拽排序、到点提醒 | IToDoService · INotificationScheduler |
| 消息中心 | 飞书/企业微信/公众号等多渠道统一发送与重试 | IPlatformMessageService · IMessageChannelSender |
| 热榜聚合 | 25+ 平台热搜的统一抓取与落库(DailyHotItem) | keyed IDailyHotService · DailyHotJobService |
| 文本转语音 | MiMo TTS 合成(独立弹性管线,避免慢调用拖垮全局超时) | ITTSService · MimoTtsOptions |
| 导航站 | 导航分类与导航项(公开/管理两套) | ICateLogService · INavItemService |
| 工具/基础设施 | 加密(国密 SM/AES)、IP 查询、行政区划、本地化、链接历史、服务器监控等 | 各子域独立 Service |
每个子域在自己的目录(如
Holiday/、ShortUrl/、ToDo/、Application/Messages/、Application/DailyHot/)下维护实体、服务与控制器,互不入侵。
模块关系图
快速开始
Platform 不是通过独立扩展方法注册,而是作为模块化单体中的一个 IModuleStartup 挂载:
- 宿主的模块清单
E.Modules字典里存在"platform" => typeof(PlatformModuleStartup)(src/Services/Host/FreeKit.DI/E.cs)。删除该条目即可整体关闭本模块。 - 宿主通过
services.AddModule<PlatformModuleStartup>("module-1", configuration)完成服务注册。
消费方无需手动调用任何 AddXXX 扩展;只要宿主包含 Platform 模块并引用其程序集,相关控制器与服务即自动可用。各子域服务的注入示例见对应子页面。
配置的业务含义
Platform 的配置不是一堆开关,每节都对应一类外部依赖或资源边界:
| 配置节 | 业务含义 | 绑定类 |
|---|---|---|
HolidayAppOption | 节假日同步的年份区间与 api.apihubs.cn 的 API Key——决定了本地缓存覆盖哪几年 | HolidayAppOption |
ShortUrlOption | 短码盐值 / 最小长度 / 分表数——盐值影响短码不可预测性,分表数决定短链库水平拆分粒度 | ShortUrlOption |
ConnectionStrings:ShortUrlConnectionStrings | 短链独立库连接串——让高频且体量大的短链流量与业务库隔离 | AddDefaultFreeSql<ShortFlag> |
PlatformMessage | 消息中心各渠道开关与凭据(飞书/企微/公众号),以及 CmsKit 通知是否外发 | PlatformMessageOptions |
MimoTts | TTS 的 ApiKey / BaseUrl / Model / 超时秒数——单独超时是因为合成慢,避免占用全局 HTTP 超时预算 | MimoTtsOptions |
各子域的详细配置键见对应子页面。