3. 云原生门户架构:门户前端、API网关、配置中心、缓存层(Redis/Etcd)、巡检引擎
云原生平台门户的架构设计直接影响配置缓存命中巡检的覆盖范围与权限管控粒度。本章从组件职责、数据流向、权限边界三个维度拆解门户核心架构,为后续RBAC策略设计奠定基础。
3.1 架构总览与组件职责
门户采用前后端分离、网关统一接入、配置与缓存分离、巡检引擎异步执行的经典云原生分层架构。各组件职责如下表所示:
| 组件层 | 核心职责 | 与缓存命中巡检的关系 |
|---|---|---|
| 门户前端 | 用户交互界面、仪表盘展示、巡检任务触发入口 | 展示缓存命中率、过期键分布;发起手动巡检 |
| API网关 | 统一认证鉴权、请求路由、限流熔断、审计日志 | 拦截巡检API请求,校验RBAC权限令牌 |
| 配置中心 | 管理巡检规则、缓存白名单、RBAC策略定义 | 存储巡检引擎所需的动态配置 |
| 缓存层 | Redis/Etcd 提供高性能数据缓存与分布式协调 | 巡检引擎直接扫描的缓存实例 |
| 巡检引擎 | 执行缓存键扫描、命中率计算、过期策略校验 | 核心巡检逻辑执行单元 |
架构要点:配置中心与缓存层分离设计,使得巡检规则变更无需重启引擎;API网关作为权限边界,确保巡检API只能被授权用户调用。
3.2 组件交互流程与数据流
一次完整的配置缓存命中巡检请求,经过以下关键步骤:
- 用户触发:运维人员在门户前端点击“执行巡检”,前端构造巡检请求并携带OAuth2令牌。
- 网关鉴权:API网关校验令牌有效性,提取用户角色与权限范围,若权限不足则直接返回403。
- 配置拉取:巡检引擎从配置中心获取当前生效的巡检规则(如扫描键前缀、白名单、阈值)。
- 缓存扫描:引擎连接Redis/Etcd实例,执行SCAN或range查询,统计缓存命中次数与过期键数量。
- 结果回写:巡检结果写入持久化存储,同时推送实时事件到门户前端更新仪表盘。
权限关键点:步骤2中API网关必须校验用户是否拥有“巡检执行”权限;步骤4中引擎使用服务账号连接缓存,该账号仅具备只读权限,防止巡检操作污染缓存数据。
3.3 缓存层双引擎对比:Redis vs Etcd
缓存层同时支持Redis与Etcd两种后端,二者在巡检场景下的差异显著:
| 对比维度 | Redis | Etcd |
|---|---|---|
| 数据模型 | Key-Value,支持多种数据结构 | 分层Key-Value,支持目录结构 |
| 扫描方式 | SCAN游标迭代,避免阻塞 | Range查询,支持前缀匹配 |
| 缓存命中统计 | 内置INFO命令提供命中/未命中计数 | 需自行计算请求次数与缓存命中 |
| 权限模型 | ACL用户+命令级别权限 | 基于角色的RBAC,支持细粒度读/写 |
| 巡检引擎连接方式 | TCP直连或Sentinel/Cluster模式 | gRPC双向认证连接 |
巡检注意事项:Etcd的Range扫描在数据量超过100万键时可能产生较大内存开销,建议在巡检规则中设置扫描上限(如每次最多扫描10万键),避免影响Etcd正常服务。
3.4 架构分层与权限边界
下图展示了门户架构中各层的权限边界与数据流向,帮助理解RBAC策略应部署在哪些节点:
3.5 关键设计原则
- 最小权限原则:巡检引擎仅使用只读服务账号连接缓存层,禁止写入或删除操作。
- 权限下沉至网关:所有巡检API请求必须经过API网关鉴权,后端组件之间使用mTLS服务间认证。
- 配置与执行分离:巡检规则存储在配置中心,引擎运行时拉取,避免硬编码权限策略。
- 审计可追溯:API网关记录每次巡检请求的用户、时间、操作范围,支持事后审计。
架构决策:选择将巡检引擎独立部署而非嵌入门户后端,是为了避免巡检扫描对门户API响应性能产生影响。引擎与缓存层之间的连接池独立管理,扫描超时阈值默认设置为30秒。
3.6 缓存层访问权限模型
针对Redis与Etcd两种缓存后端,巡检引擎使用的服务账号权限配置示例如下:
# Redis ACL 配置示例(仅读权限)
user巡检服务 on +@read +@connection ~* >巡检专用密码
# Etcd RBAC 配置示例(只读角色)
etcdctl role add巡检只读角色
etcdctl role grant-permission巡检只读角色 --prefix=true read /config/cache/
etcdctl user add巡检服务用户
etcdctl user grant-role巡检服务用户巡检只读角色
安全提醒:Redis ACL中的
+@connection权限允许建立连接,但不应授予+@write或+@admin权限。Etcd的read权限应限制在巡检所需的前缀范围内,避免扫描整个keyspace。