4. 方案架构设计:整体架构图、核心组件与数据流
好,咱们进入方案架构设计这一节。说实话,这部分是我在整个课程里最看重的一块。你想想看,没有清晰的架构,后面所有的代码实现都是空中楼阁。我在好几个项目里都见过这种情况——大家一上来就写代码,写到一半发现权限隔离的逻辑根本跑不通,最后推倒重来。嗯,咱们今天就把这事一次性理清楚。
4.1 整体架构图
先上一张整体架构图。这张图我画了不下十遍,最后定下来这个版本。它把整个证书链权限隔离方案分成了三个核心层次:接入层、策略层和存储层。
架构核心思想:每一层只做一件事,层与层之间通过标准接口通信。这样哪怕你以后要换证书颁发机构,或者换存储后端,都不会影响其他层。
这张图你看懂了吗?说白了,所有外部请求先打到接入层,接入层做完基础校验后,把请求交给策略层。策略层才是真正干活的地方——它要决定这个请求能不能通过,该给什么权限。最后,所有数据落盘到存储层。
4.2 核心组件详解
接下来咱们拆开来看。策略层里有三个核心组件,我一个个说。
4.2.1 证书颁发机构(CA)
证书颁发机构,简称 CA。它不是传统意义上那个签发 HTTPS 证书的 CA,而是咱们这个系统里专门负责签发和吊销权限证书的组件。
我记得在第一个版本里,我把 CA 和策略引擎写在一起了。结果呢?每次策略变更都要重新签发证书,耦合度太高。后来我把它拆成了独立服务,世界清净了。
| 功能 | 说明 |
|---|---|
| 证书签发 | 根据策略引擎的评估结果,生成包含权限信息的 X.509 证书 |
| 证书吊销 | 当用户权限变更或过期时,吊销旧证书并加入 CRL(证书吊销列表) |
| 证书续期 | 在证书到期前自动续期,保证服务不中断 |
| 证书验证 | 提供接口供其他服务验证证书的有效性和完整性 |
我的经验:CA 的证书签名密钥一定要单独存储,最好用硬件安全模块(HSM)。我曾经见过有人把私钥直接写在配置文件里……嗯,后果我就不多说了。
4.2.2 策略引擎
策略引擎是整个方案的核心。它负责解析策略规则,并根据规则做出权限决策。
你可能会问:策略规则长什么样?我举个例子:
{
"policy_id": "pol-001",
"name": "只读访问策略",
"rules": [
{
"effect": "allow",
"action": ["read", "list"],
"resource": "project:alpha:*",
"condition": {
"ip_range": ["10.0.0.0/8"],
"time_range": "09:00-18:00"
}
}
]
}
这个策略的意思是:允许用户在 10.0.0.0/8 网段内,在 09:00 到 18:00 之间,对 project:alpha 下的所有资源执行 read 和 list 操作。
策略引擎拿到这个规则后,会做三件事:
- 规则匹配:检查请求的动作和资源是否匹配规则
- 条件评估:检查 IP、时间等条件是否满足
- 决策输出:返回 allow 或 deny
注意:策略引擎的评估结果必须无状态。什么意思?就是同样的输入,必须得到同样的输出。千万别把用户会话状态塞进策略评估逻辑里,否则你会后悔的。
4.2.3 权限缓存
权限缓存,说白了就是把策略评估的结果存起来,避免每次请求都重新算一遍。
为什么要缓存?你想啊,一个用户可能每秒发起几百个请求,如果每个请求都要去数据库里查策略、做评估,那性能肯定扛不住。我在一个项目里测过,不加缓存的情况下,单次策略评估平均耗时 50ms。加了缓存后,直接降到 1ms 以下。
| 缓存策略 | 适用场景 | TTL 建议 |
|---|---|---|
| 本地缓存 | 单节点部署,低延迟要求 | 5-10 分钟 |
| 分布式缓存(Redis) | 多节点部署,需要缓存共享 | 10-30 分钟 |
| 无缓存 | 策略频繁变更,需要实时生效 | N/A |
我的建议:缓存一定要设置合理的 TTL。太短了缓存没意义,太长了策略变更不能及时生效。我个人习惯设 15 分钟,同时提供一个强制刷新接口,方便运维手动清理。
4.3 数据流设计
好,组件都介绍完了。咱们来看看数据是怎么在它们之间流动的。我画了一张数据流图,你跟着走一遍就明白了。
数据流走的是这么个流程:
- 客户端发起请求:带着身份凭证(比如 API Key 或 JWT)打到 API 网关
- API 网关转发:网关做完基础校验后,把请求转发给策略引擎
- 策略引擎查缓存:先看权限缓存里有没有这个用户的决策结果
- 缓存未命中,查数据库:如果缓存没有,就去存储层拉策略规则,现场做评估
- 签发证书:如果评估通过,CA 签发一个短期权限证书,返回给客户端
- 返回结果:客户端拿着这个证书,后续请求就可以直接走缓存了
关键点:第 3 步和第 4 步是性能的分水岭。缓存命中率高,系统吞吐量就上去了。我建议你把缓存命中率作为一个核心监控指标,低于 90% 就要排查原因了。
4.4 避坑指南
最后,我分享几个我在实际项目中踩过的坑,你遇到了可以绕开走。
- 缓存和策略引擎的时钟同步问题:我曾经遇到过缓存里的 TTL 和策略引擎的系统时间不一致,导致证书提前过期。解决方案是统一用 NTP 同步,或者在缓存里存绝对时间戳而不是 TTL。
- CA 的单点故障:一开始我只部署了一个 CA 实例,结果它挂了,整个系统都没法签发证书。后来我做了主备切换,才解决了这个问题。
- 策略规则的版本管理:策略规则改了之后,旧证书还在有效期内,新请求却用了新规则,导致权限不一致。我的做法是给每条策略规则加版本号,证书里也带上版本号,评估时做版本匹配。
嗯,架构设计这块就讲到这里。你把这些组件和数据流理清楚了,后面的实现就会顺很多。