← 返回项目列表
业务服务
配置与访问控制服务
租户配置、域名管理与基于优先级的允许/拒绝规则引擎
初版作者 · 重构规则引擎 · 2024.03 — 2026.06
Go go-zero gRPC MySQL/GORM Redis Kafka
项目概述
平台与租户配置:域名、横幅、版本、租户设置和访问规则。我编写了第一版,将其拆分为独立服务(拆分时共 42 个 RPC),并在 2025 年将其访问控制规则重构为统一的规则引擎。
架构设计
网关中间件 → 配置 gRPC 服务 → 规则引擎(按账号、昵称或 IP 的白名单优先;拒绝规则同时匹配账号、昵称、IP、IP 归属地和银行卡)→ 按租户的 Redis Hash → 未命中时查询 MySQL。
核心技术亮点
01
将两套旧的允许/拒绝名单整合为一个基于优先级、支持 5 个匹配维度的规则引擎;规则无法加载时拒绝访问
02
规则从按租户划分、带 TTL 的 Redis Hash 中读取,数据库回源受 singleflight 保护
03
通过一次性 SQL 迁移将现有规则迁入新表(CSV → JSON 数组)
04
租户域名管理:链接校验、基于 Redis Set 的唯一性检查,以及手动缓存重新同步
05
按内容类别定向投放横幅,并通过 Kafka 变更事件推送给已连接的客户端
核心实现
1
统一规则引擎
一张包含动作和优先级的规则表,每次请求在内存中归一化并求值,返回命中的维度以便记录日志。
Why: 两套名单各有代码路径,在边界情况下结果不一致;一个优先级明确的引擎更易于推理和审计。
技术决策
| 技术决策 | 选择 | 替代方案 | 原因 |
|---|---|---|---|
| 规则缓存结构 | 每个租户一个 Redis Hash,在内存中求值 | 每个维度值一个 Redis key | 每个租户的规则集都很小;每个租户读取一次更简单,也无需维护大量索引 key 的一致性。 |