架构设计
架构设计解决系统如何拆分、如何协作、如何演进的问题。好的架构不是一蹴而就的,而是在业务发展过程中不断权衡、逐步演化的结果。
注意
核心矛盾 架构演进的核心矛盾是透明性 vs 复杂性。没有最好的架构,只有最适合当前阶段的架构。
设计原则与模式
软件设计的核心目标是可维护性和可复用性。设计模式 中的 SOLID 原则——单一职责、开闭原则、里氏替换、依赖倒置、接口隔离——为面向对象设计提供了指导方针。这些原则不是孤立的,它们相互支撑:开闭原则是目标,依赖倒置是实现手段,里氏替换是保障。
代理模式 是结构型模式的典型代表,通过代理对象控制对真实对象的访问。Spring AOP 的切面编程、MyBatis 的懒加载、Dubbo 的远程调用,底层都是代理模式的实现。理解代理模式,就理解了框架透明化的核心机制。
设计规约 将设计原则落地为可执行的规范。阿里巴巴 Java 开发手册中的强制规则——存储方案评审、UML 建模指导、DRY 原则——都是工程实践中总结出的最佳实践。错误码设计 是 API 设计的重要组成部分,好的错误码应该快速溯源、沟通标准化,XYYYY 的五位结构清晰区分错误来源和具体问题。
服务架构演进
软件架构经历了从原始分布式到云原生的演进历程。原始分布式时代(1980s)试图通过分布式突破硬件限制,但远程调用与本地调用的性能差距让这个方向失败了。单体架构在小型系统中仍然是最佳选择,只有当系统规模超过单机上限时,才需要考虑分布式。
SOA 通过服务拆分实现独立部署,但过于严格的规范带来过度复杂性。微服务架构在 2014 年后成为主流,Martin Fowler 定义的九大核心特征——服务组件化、围绕业务能力、产品化思维——指导着现代系统设计。云原生架构 是微服务的下一个阶段,通过 Kubernetes 和服务网格实现基础设施的声明式管理。
应用架构
应用分层 是软件架构的基础。典型 Java 应用分为开放 API 层、Web 层、Service 层、Manager 层、DAO 层,每层职责清晰。分层领域模型——DO、DTO、BO、Query、VO——定义了数据在各层之间的流转方式。Manager 层的引入是对 Service 层通用能力的下沉,处理第三方平台封装、缓存方案、中间件通用处理。
分布式系统
分布式系统的核心挑战是一致性与可用性的权衡。分布式事务 从 CAP 定理出发,BASE 理论提出柔性的最终一致性。2PC、TCC、SAGA、AT 模式各有适用场景:普通业务用 AT 模式(Seata),高并发核心系统用 TCC,长事务用 SAGA。
分布式共识算法 解决多个节点如何就同一个值达成一致的问题。Paxos 是理论基础,Raft 通过强 Leader 模式降低了理解难度,Gossip 协议实现最终一致性。Nacos 的 CP 模式使用 Raft,AP 模式使用 Distro(基于 Gossip),正是这些算法的工程实践。
服务治理
服务治理 解决微服务集群中服务如何找到彼此、流量如何进来、请求如何分发的问题。注册中心(Eureka、Nacos、ZooKeeper)实现服务发现,网关(Spring Cloud Gateway)统一入口并提供认证鉴权、限流熔断能力,负载均衡(Ribbon、OpenFeign)将请求分发到多个实例。
远程服务调用 让微服务间像调用本地方法一样通信。REST 面向资源,RPC 面向方法,gRPC 通过 Protobuf 和 HTTP/2 实现高性能通信。OpenFeign 适合中小型微服务,Dubbo 适合大型分布式系统。幂等性设计是分布式场景下的必备能力,通过数据库唯一约束、Redis SetNX、乐观锁、状态机等方案保证重复请求的结果一致性。
流量治理
流量治理 解决微服务集群的雪崩问题。熔断器通过 Closed、Open、Half-Open 三种状态保护故障扩散,限流算法(漏桶、令牌桶、滑动窗口)控制流量入口,降级策略返回兜底结果。Sentinel 已取代 Hystrix 成为首选方案。
透明多级分流 通过在客户端、CDN、反向代理、应用、数据库各层设置缓存,让请求尽早返回。越靠近用户,缓存命中收益越大。缓存穿透、缓存击穿、缓存雪崩是分布式缓存的三大问题,通过缓存空值、互斥锁、随机化 TTL 等方案解决。
可观测性
可观测 通过 Metrics、Logs、Traces 三大支柱实现分布式系统的观测。Metrics 告诉你有问题,Traces 告诉你问题在哪条链路,Logs 告诉你具体发生了什么。Prometheus + Grafana 负责指标监控,ELK/Loki 负责日志收集,Jaeger/Zipkin 负责链路追踪。OpenTelemetry 作为统一可观测性规范,避免厂商锁定。
架构安全
架构安全 解决认证、授权、加密三个核心问题。JWT 实现无状态认证,OAuth 2.0 实现开放授权,RBAC/ABAC 实现访问控制。HTTPS/TLS 通过非对称加密交换密钥、对称加密传输数据保证通信安全。密码存储必须使用 BCrypt 加盐 Hash,API 密钥不能硬编码。
演进规律
架构演进的核心矛盾是透明性 vs 复杂性。原始分布式追求透明导致复杂性失控,单体架构避免复杂失去隔离能力,SOA 规范约束导致过度复杂,微服务轻量自由但决策负担重,云原生通过软硬协同追求透明+轻量。
| 系统规模 | 推荐架构 | 适用条件 |
|---|---|---|
| 小型系统 | 单体 | 单机可支撑 |
| 中型系统 | 微服务(Spring Cloud) | 团队 10-50 人 |
| 大型系统 | 云原生(Kubernetes + 服务网格) | 团队 50+ 人 |