软件架构
软件架构即软件的高层设计和实现,通过精心选择和组装各种架构元素,以满足系统的需求。软件架构的核心是分解,将应用分解成不同的部分,并确定各部分之间的协作关系。
4+1视图模型是描述软件架构的经典模型,它从5个不同的视角来描述软件架构:
- 逻辑视图,描述系统的对象,包括类、包以及它们之间的关系,侧重于系统的功能需求。
- 进程视图,描述系统的进程,包括运行时的进程及进程间的通信和同步,侧重于系统的性能要求。
- 物理视图,描述系统的部署环境,包括物理机器和网络,侧重于基础架构和分布式。
- 开发视图,也叫实现视图,描述系统开发时的软件元素的静态组织,包括一系列模块或组件以及它们之间的组合、依赖关系。
- 场景视图,场景视图是其它每个视图中的一系列用例,每个用例描述了该视图中的组件如何协作以处理外部请求。
软件架构的意义不在于满足系统的功能性需求,而在于满足系统的非功能性需求,它们进一步可以分为两类:
- 运行时需求,如可用性、可靠性和可扩展性;
- 开发时需求,如可移植性、可维护性、可测试性和可部署性。
分层架构
分层架构按照层来组织软件元素,每层负责一系列职责,上层依赖于它的下层,例如典型的三层架构:
- 表现层,实现用户界面或外部API
- 业务逻辑层,实现所有的业务逻辑
- 持久层,实现数据库访问
分层架构的缺点:
- 单一的表现层,无法表示多种调用方式
- 单一的持久层,无法表示多种数据访问方式
- 业务逻辑层依赖于持久层,使得业务逻辑层测试依赖于持久层
六边形架构
六边形架构,也叫端口和适配器架构(ports and adapters architecture),旨在创建松耦合的应用程序组件,这些组件可以通过端口和适配器轻松连接到其所在的软件环境。这使得组件可以在任何级别上互换,并有助于自动化测试。
六边形架构将系统分解为一些松耦合的可替换的组件,如应用程序核心,数据库,用户界面,测试脚本以及连接其他系统的接口。
六边形架构应用于领域驱动设计,可作为微服务架构中每个子服务的架构。六边形架构的中心是应用核心领域,它是应用的领域模型,实现了所有的业务逻辑。业务逻辑有多个端口,它们是一系列服务。入端口(Inbound Port)是应用核心领域暴露的服务,供外部组件调用;出端口(Outbound Port)定义了应用核心领域如何连接外部组件。围绕应用核心领域的是各种适配器,入适配器(Inbound Adapter)将外部请求适配到入口接口;同理,出口适配器(Outbound Port)为出口接口访问外部应用作适配。
立方体扩展模型和微服务架构
立方体扩展模型(The scale cube)定义了三种应用扩展方法:
- X轴扩展,即水平复制。通过复制应用实例进行扩展,通过负载均衡算法将请求转发到多个应用实例。
- Z轴扩展,即数据分片。根据某个属性(如ID)将数据集分片,每个应用实例负责处理一个子数据集,基于当前请求的某个属性执行路由算法,将请求路由到不同的实例以操作对应的子数据集。
- Y轴扩展,即服务化。将单体应用按不同功能分解成多个微服务,这种扩展方式最灵活。
服务化扩展方法最灵活,按功能或业务领域划分后,每个子服务还可以独立地进一步扩展:
将单体应用按不同功能或业务领域分解成多个不同的服务,就是微服务架构。可见,微服务架构是相对于传统的单体架构来定义的。
微服务架构将应用程序组织为一系列松耦合、独立部署的服务。
微服务架构具有以下特点:
- 每个服务都是自治的,可独立开发、测试和部署;
- 单一职责,每个服务只实现一种功能,一般是某种业务功能,也可以是某种共享的技术能力;
- 可替换性,单一职责使得该服务的功能和角色界限非常明确,易于使用其它实现替换;
- 独立的数据库,各个微服务的数据库私有,访问别其它服务的数据只能通过它提供的接口;
- 微服务本身并没有消息通信、服务编排和协调等功能,这些功能由其它公共基础组件实现。
微服务架构具有以下优点:
- 促进了大型复杂应用的持续交付和部署;
- 易于维护;
- 独立部署;
- 独立伸缩;
- 促进了团队自治化;
- 易于新技术的预研和采纳;
- 错误隔离。
微服务架构并非银弹,它存在以下缺点或挑战:
- 服务划分需要大量的领域知识;
- 服务之间的界限和契约很难确定,一旦确定,改变起来很困难;
- 微服务是分布式系统,因此需要对状态,一致性和网络可靠性做出不同的假设;
- 更多的服务造成更多失败点;
- 部署跨多个服务的功能需要正确的服务编排;
- 分布式系统监控困难;
- 分布式系统测试困难。
微服务开发生命周期
微服务开发生命周期包括三个大的阶段:设计、部署和观察监控。
设计阶段:
- 服务划分,自顶向下还是自下向上;
- 应用的总体架构和外观;
- 界定服务范围;
- 服务间通信协议;
- 如何实现服务弹性。
部署阶段:
- 标准化服务发布单元;
- 实现持续交付管道。
观察监控阶段:
- 主动识别并重构系统中易出故障的部分;
- 追踪系统的行为。
微服务设计模式和Spring Cloud
基于微服务架构存在的各种挑战,业界总结出了一系列微服务设计模式,Spring Cloud就是这些模式的优秀实践。
服务分解模式:
服务通信模式:
数据一致性模式:
数据访问模式:
服务部署模式:
服务监控模式:
- 健康检查 API
- 日志聚合
- 分布式链路追踪
- 异常追踪
- 应用指标
- 审计日志(用户活动日志)
自动化测试模式:
- Consumer-driven contract test,测试服务是否符合消费者的期望
- Consumer-side contract test,测试该服务的客户端能否与该服务通信
- Service component test,单独测试每个组件
横切关注点模式:
- 机箱模式,例如,使用spring cloud
安全模式:
- 访问令牌模式
Spring Cloud是Java领域最流行的微服务框架,它提供了一系列微服务模式编程模型和典型实现,例如:
- 分布式版本化配置管理
- 服务注册与发现
- 服务间调用
- 客户端负载均衡
- 熔断器
- 网关路由
- 微代理(micro-proxy)
- 控制总线
- 一次性令牌(one-time tokens)
- 全局锁
- leader选举
- 分布式session
- 集群状态