N 层架构
逻辑层与物理层次有什么区别?
- Layer: 按职责拆分的逻辑模块,用于管理依赖关系,例如表现、业务和数据访问;
- Tier: 独立部署的物理边界,通常通过网络通信,可以单独扩容或隔离故障;
- 映射关系: 多个逻辑层可以部署在同一进程或机器,一个逻辑层也可以有多个部署实例;
- 设计收益: 先明确职责,再决定是否值得付出网络成本把它们分开部署;
三层架构如何处理一次请求?
表现层 → 业务逻辑层 → 数据访问层 → 数据存储
- 表现层: 接收用户交互并呈现结果,负责把输入转换成业务能够理解的请求;
- 业务层: 执行业务校验和规则,决定需要读取或修改哪些数据;
- 数据访问层: 封装存储操作,把业务需求转换成具体查询和写入;
- 边界要求: 上层可以依赖下层能力,下层不应反过来依赖某个具体界面;
开放层与封闭层怎样约束调用?
| 形式 | 允许调用 | 主要权衡 |
|---|---|---|
| 封闭层 | 只调用紧邻下层 | 依赖清楚,但可能出现纯转发 |
| 开放层 | 可跨过中间层访问更低层 | 减少绕路,但耦合更难控制 |
- 选择依据: 看中间层是否提供真实规则或隔离价值,不能只为了少一次函数调用破坏边界;
- 网络影响: 如果每层都独立部署,纯转发会额外增加往返与故障点;
一层和两层结构什么时候足够?
- 一层: 所有组件在单个应用或服务器中运行,适合简单部署,仍可以有内部逻辑分层;
- 两层: 客户端直接与数据或服务端通信,没有单独部署的中间业务层;
- 简化价值: 小规模需求可以减少基础设施与排错成本,层数多本身不是设计质量的指标;
分开部署各层会增加哪些成本?
- 收益: 各层可独立扩容、维护和设置网络权限,有助于分工与隔离;
- 延迟: 每跨一个网络边界都可能增加序列化、传输、排队与超时;
- 运维: 多层需要更多实例、部署流程和监控,网络访问规则也更复杂;
- 安全边界: 分层有利于控制访问路径,但逻辑分层本身不会自动变成防火墙;