2. IDP 自助门户整体架构:分层架构设计

IDP 自助门户作为企业数字身份治理的统一入口,其架构设计必须兼顾高并发接入、复杂业务编排与海量身份数据管理。本节采用经典的三层分层架构模型,将系统解耦为接入层、服务层与数据层,并详细阐述各层职责、组件交互关系及高可用设计原则。

2.1 分层架构总览

下图展示了 IDP 自助门户的核心分层架构,各层通过明确的 API 契约进行通信,实现关注点分离与横向扩展能力。

IDP自助门户分层架构图 IDP 自助门户分层架构图 接入层(Access Layer) 负载均衡(ALB/HAProxy) WAF 安全防护 | 反向代理 | 会话管理 OAuth2/OIDC 网关 | 限流熔断 服务层(Service Layer) 自助服务引擎 申请/审批/变更/回收 策略编排中心 RBAC/ABAC 策略解析 审计与合规 操作日志/合规报告 连接器适配器 SCIM/LDAP/AD/HR 系统 消息与事件总线 异步任务/事件驱动 数据层(Data Layer) 关系数据库(PostgreSQL/MySQL) 缓存(Redis) | 搜索引擎(Elasticsearch) 对象存储(S3/MinIO) | 数据仓库

2.2 接入层设计

接入层是用户与 IDP 门户交互的第一道防线,负责流量接入、安全防护与协议转换。

组件 职责 关键技术
负载均衡 分发用户请求到后端服务实例,支持 SSL 卸载 ALB、HAProxy、Nginx
WAF 安关 SQL 注入、XSS、CSRF 等 Web 攻击防护 ModSecurity、Cloudflare WAF
OAuth2/OIDC 网关 统一认证授权, 校验与颁发 Keycloak、ORY Hydra
限流熔断 防止突发流量击穿后端服务 Sentinel、Resilience4j
会话管理 分布式会话保持与超时控制 Redis Session、JWT
设计要点:接入层应保持无状态设计,所有会话状态下沉至 Redis 或客户端 JWT,便于水平扩展。建议启用全链路 HTTPS 与 HSTS 头部,确保传输安全。

2.3 服务层组件交互

服务层是业务逻辑的核心,各组件通过事件驱动与同步 API 两种模式协同工作。下图展示了典型的一次用户自助申请权限的组件交互流程。

服务层组件交互时序图 服务层组件交互时序图(用户自助申请权限) 用户浏览器 自助服务引擎 策略编排中心 连接器适配器 消息事件总线 1. 提交申请 2. 策略校验 3. 策略结果 4. 执行变更 5. 异步事件 6. 通知审计/用户
关键交互说明:
  • 同步路径:用户请求 → 自助服务引擎 → 策略编排中心 → 连接器适配器,适用于实时性要求高的操作(如密码修改、权限即时生效)。
  • 异步路径:连接器适配器 → 消息事件总线 → 审计与通知服务,适用于非实时场景(如合规审计、邮件通知、数据同步)。
  • 解耦原则:服务层内部组件通过事件总线解耦,避免直接依赖,提升系统可维护性。

2.4 数据层设计

数据层采用混合存储架构,根据数据特性选择最合适的存储引擎。

数据类别 存储引擎 典型数据 高可用策略
关系型数据 PostgreSQL / MySQL 用户账户、角色定义、权限策略、审批流程 主从复制 + 自动故障转移(Patroni / MHA)
缓存数据 Redis Cluster 会话 、策略缓存、限流计数器 哨兵模式 / 集群分片 + 持久化 RDB/AOF
搜索数据 Elasticsearch 审计日志、操作记录、用户搜索索引 多节点集群 + 副本分片
对象存储 S3 / MinIO 合规报告、批量导入文件、日志归档 多 AZ 冗余 + 版本控制

2.5 高可用设计原则

IDP 自助门户作为企业关键基础设施,必须满足 99.99% 以上的可用性要求。以下是核心设计原则:

  1. 无状态化:接入层与服务层所有节点均无状态,会话数据下沉至 Redis,支持任意节点故障后请求无缝切换。
  2. 冗余部署:每个组件至少部署 2 个实例,跨可用区(AZ)分布,避免单点故障。
  3. 熔断降级:当依赖的下游系统(如 AD、HR 系统)响应超时或不可用时,服务层自动熔断并返回降级提示,避免级联故障。
  4. 数据多副本:数据库采用主从同步 + 自动故障转移,缓存采用集群分片 + 副本,确保数据不丢失。
  5. 灰度发布:新功能通过金丝雀发布逐步放量,配合全链路监控(APM)实时观察错误率与延迟。
  6. 定期灾备演练:每季度执行一次跨 AZ 故障切换演练,验证 RTO(恢复时间目标)≤ 5 分钟,RPO(恢复点目标)≤ 1 分钟。
常见陷阱:不要将业务逻辑写入数据库存储过程或触发器,这会导致数据库成为性能瓶颈且难以扩展。所有业务逻辑应集中在服务层处理,数据库仅负责数据持久化与查询优化。

2.6 架构决策记录(ADR)示例

在架构设计过程中,关键决策应记录为 ADR,便于团队回溯与知识传承。

决策编号 决策内容 备选方案 选择理由
ADR-001 采用事件驱动架构解耦服务层组件 同步 RPC 调用 降低组件间耦合度,支持异步审计与通知,提升系统弹性
ADR-002 使用 PostgreSQL 作为主数据库 MySQL、Oracle 支持 JSONB 存储灵活属性,原生支持 CTE 与窗口函数,社区活跃
ADR-003 接入层统一使用 OAuth2/OIDC 协议 SAML、LDAP 直连 标准化认证流程,支持第三方 IdP 集成,便于移动端与 API 场景