2. 架构视角引入:4+1视图模型简介、逻辑视图与资源模型的关系、开发视图与资源模型的关系
在开始设计IDP自助门户的资源模型之前,必须建立统一的架构视角。Philippe Kruchten提出的4+1视图模型是软件架构领域最经典的视角划分方法,它从不同利益相关者的关注点出发,将复杂系统拆解为五个相互关联的视图。对于IDP资源模型设计而言,逻辑视图与开发视图是核心切入点。
2.1 4+1视图模型简介
4+1视图模型通过五个视角描述软件架构,每个视图对应一组特定的关注点与受众:
| 视图名称 | 关注点 | 主要受众 | IDP场景示例 |
|---|---|---|---|
| 逻辑视图 | 系统功能、业务抽象、实体关系 | 领域专家、架构师 | 环境、组件、配额、模板的抽象模型 |
| 开发视图 | 模块组织、代码结构、依赖关系 | 开发人员、模块负责人 | 资源模型在代码中的包结构、接口定义 |
| 进程视图 | 运行时并发、同步、通信 | 系统工程师、性能分析师 | 资源创建请求的异步编排、事件驱动 |
| 部署视图 | 物理拓扑、网络、节点映射 | 运维人员、基础设施团队 | IDP服务在Kubernetes集群中的部署拓扑 |
| 场景视图(+1) | 用例、用户交互、端到端流程 | 所有利益相关者 | 开发者通过门户自助创建环境的完整流程 |
架构视角选择建议:在IDP资源模型设计初期,优先聚焦逻辑视图(定义资源是什么、有哪些关系)和开发视图(定义资源模型如何被实现和引用)。进程视图与部署视图通常在模型稳定后,作为运行时保障手段引入。
下图展示了4+1视图模型的结构关系,以及逻辑视图与开发视图在IDP资源模型设计中的核心位置:
2.2 逻辑视图与资源模型的关系
逻辑视图关注系统的功能抽象与领域实体关系,它不关心具体的技术实现,而是回答“系统应该提供哪些资源?这些资源之间如何关联?”。在IDP自助门户中,逻辑视图直接决定了资源模型的语义结构。
2.2.1 逻辑视图的核心产出:领域概念模型
从逻辑视图出发,IDP资源模型首先被抽象为一组核心领域实体及其关系:
- 环境(Environment):开发者可用的隔离工作空间,包含计算、存储、网络等资源组合。
- 组件(Component):构成应用的最小部署单元,如微服务、数据库、缓存。
- 模板(Template):预定义的资源组合蓝图,用于快速创建标准化环境。
- 配额(Quota):资源使用的上限约束,关联到团队或项目。
- 策略(Policy):资源创建、变更、销毁的规则与审批流程。
逻辑视图设计原则:资源模型中的每个实体都应具有明确的业务含义,避免将技术实现细节(如Pod名称、存储卷ID)直接暴露在逻辑层。逻辑视图是面向人的模型,不是面向机器的模型。
下图展示了IDP资源模型在逻辑视图中的核心实体关系:
2.3 开发视图与资源模型的关系
开发视图将逻辑视图中的领域概念映射为具体的代码模块、接口定义和依赖关系。它回答的是“资源模型在代码中如何组织?开发者如何引用和扩展这些模型?”。开发视图是逻辑模型走向可执行实现的桥梁。
2.3.1 从逻辑实体到代码结构
在IDP自助门户的开发视图中,资源模型通常遵循以下代码组织模式:
| 逻辑实体 | 开发视图代码结构 | 关键接口/类 |
|---|---|---|
| 环境 (Environment) | idp-core/src/main/java/.../model/Environment.java |
EnvironmentService, EnvironmentRepository |
| 组件 (Component) | idp-core/src/main/java/.../model/Component.java |
ComponentFactory, ComponentLifecycle |
| 模板 (Template) | idp-template/src/main/java/.../model/Template.java |
TemplateEngine, TemplateValidator |
| 配额 (Quota) | idp-governance/src/main/java/.../model/Quota.java |
QuotaManager, QuotaEnforcer |
| 策略 (Policy) | idp-governance/src/main/java/.../model/Policy.java |
PolicyEngine, PolicyEvaluator |
2.3.2 资源模型的接口契约
开发视图强调模块间的依赖关系与接口契约。资源模型在开发视图中通常表现为一组POJO(Plain Old Java Object)或数据传输对象(DTO),并通过以下方式对外暴露:
// 资源模型核心接口示例
public interface ResourceModel {
String getResourceType(); // 资源类型标识
String getResourceId(); // 全局唯一ID
Map<String, Object> getSpec(); // 资源规格定义
Map<String, String> getMetadata(); // 元数据标签
}
// 环境资源的具体实现
public class Environment implements ResourceModel {
private String environmentId;
private String name;
private String namespace;
private List<Component> components;
private Quota quota;
private Policy policy;
// getters, setters, builders...
}
开发视图常见陷阱:将逻辑视图中的实体关系直接照搬到代码依赖中,导致模块间耦合度过高。例如,让Environment直接依赖Component的内部实现类,而不是依赖Component接口。正确的做法是在开发视图中引入依赖倒置,让高层模块依赖抽象接口。
2.3.3 逻辑视图与开发视图的映射关系总结
下表总结了两个视图在IDP资源模型设计中的核心差异与协作方式:
| 对比维度 | 逻辑视图 | 开发视图 |
|---|---|---|
| 关注点 | 业务语义、实体关系 | 代码结构、模块依赖 |
| 产出物 | 领域概念模型、实体关系图 | 包结构、接口定义、类图 |
| 受众 | 领域专家、产品经理、架构师 | 开发人员、模块负责人 |
| 变化频率 | 低(业务稳定后很少变动) | 中(随技术选型迭代调整) |
| IDP资源模型示例 | 环境包含组件,组件受配额约束 | Environment.java 引用 Component接口 |
| 设计原则 | 高内聚、低耦合的业务抽象 | 接口隔离、依赖倒置、模块化 |
实践建议:在IDP自助门户项目中,建议先完成逻辑视图的领域建模(产出实体关系图),再基于逻辑模型推导开发视图的模块划分与接口设计。逻辑视图的稳定性决定了开发视图的扩展性——逻辑模型越清晰,代码重构的成本越低。