2. IDP 自助门户整体架构:分层架构设计
IDP 自助门户作为企业数字身份治理的统一入口,其架构设计必须兼顾高并发接入、复杂业务编排与海量身份数据管理。本节采用经典的三层分层架构模型,将系统解耦为接入层、服务层与数据层,并详细阐述各层职责、组件交互关系及高可用设计原则。
2.1 分层架构总览
下图展示了 IDP 自助门户的核心分层架构,各层通过明确的 API 契约进行通信,实现关注点分离与横向扩展能力。
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 两种模式协同工作。下图展示了典型的一次用户自助申请权限的组件交互流程。
关键交互说明:
- 同步路径:用户请求 → 自助服务引擎 → 策略编排中心 → 连接器适配器,适用于实时性要求高的操作(如密码修改、权限即时生效)。
- 异步路径:连接器适配器 → 消息事件总线 → 审计与通知服务,适用于非实时场景(如合规审计、邮件通知、数据同步)。
- 解耦原则:服务层内部组件通过事件总线解耦,避免直接依赖,提升系统可维护性。
2.4 数据层设计
数据层采用混合存储架构,根据数据特性选择最合适的存储引擎。
| 数据类别 | 存储引擎 | 典型数据 | 高可用策略 |
|---|---|---|---|
| 关系型数据 | PostgreSQL / MySQL | 用户账户、角色定义、权限策略、审批流程 | 主从复制 + 自动故障转移(Patroni / MHA) |
| 缓存数据 | Redis Cluster | 会话 、策略缓存、限流计数器 | 哨兵模式 / 集群分片 + 持久化 RDB/AOF |
| 搜索数据 | Elasticsearch | 审计日志、操作记录、用户搜索索引 | 多节点集群 + 副本分片 |
| 对象存储 | S3 / MinIO | 合规报告、批量导入文件、日志归档 | 多 AZ 冗余 + 版本控制 |
2.5 高可用设计原则
IDP 自助门户作为企业关键基础设施,必须满足 99.99% 以上的可用性要求。以下是核心设计原则:
- 无状态化:接入层与服务层所有节点均无状态,会话数据下沉至 Redis,支持任意节点故障后请求无缝切换。
- 冗余部署:每个组件至少部署 2 个实例,跨可用区(AZ)分布,避免单点故障。
- 熔断降级:当依赖的下游系统(如 AD、HR 系统)响应超时或不可用时,服务层自动熔断并返回降级提示,避免级联故障。
- 数据多副本:数据库采用主从同步 + 自动故障转移,缓存采用集群分片 + 副本,确保数据不丢失。
- 灰度发布:新功能通过金丝雀发布逐步放量,配合全链路监控(APM)实时观察错误率与延迟。
- 定期灾备演练:每季度执行一次跨 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 场景 |