CloudStack 代码阅读(五)—— 资源模型与实体对象(VO/DAO)
本篇介绍 CloudStack 的资源模型设计:VO(持久化对象)与 DAO(数据访问对象)。
1. CloudStack 的数据层结构
数据层分为:
VO(值对象 → DB Row)
DAO(数据访问 → SQL 操作)
Manager(业务逻辑)
Orchestration Engine(编排)
Agent(执行)
VO 与 DAO 模式在 CloudStack 中极其关键。
2. VO(Value Object)
VO 是数据库表的直接映射对象,例如:
| VO | 对应表 |
|---|---|
| VirtualMachineVO | vm_instance |
| VolumeVO | volumes |
| NetworkVO | networks |
| HostVO | hosts |
2.1 VO 的特点
- 字段与 DB 一一对应
- 包含资源状态字段(state)
- 通常是不可变对象
- 仅用于存储数据,不包含业务逻辑
3. DAO(Data Access Object)
DAO 作用:
- CRUD 操作
- 基于主键 / 外键查询
- 基于状态的条件查询
- 乐观锁操作
- 状态机 transition
示例:
VirtualMachineDao
VolumeDao
NetworkDao
IpAddressDao
3.1 乐观锁
DAO 使用:
UPDATE vm_instance SET state = ? WHERE id = ? AND state = oldState
保证并发安全。
4. 状态机结合 DAO
VM 状态更新通常使用:
_stateMachine.transitTo(vm, newState, event);
内部会:
- 校验合法迁移
- 调用 DAO 更新数据库
- 发布事件(EventBus)
5. Resource Object Model
CloudStack 的资源模型流程:
VO(持久化层数据)
→ DAO(SQL 访问)
→ Manager(业务逻辑)
→ Orchestration(跨模块编排)
→ AgentCommand(物理执行)
例如启动 VM:
vmDao.findById()
vmDao.update()
networkMgr.prepare()
volumeMgr.prepare()
agentMgr.send(StartCommand)