微服务架构

软件架构

软件架构即软件的高层设计和实现,通过精心选择和组装各种架构元素,以满足系统的需求。软件架构的核心是分解,将应用分解成不同的部分,并确定各部分之间的协作关系。

4+1视图模型是描述软件架构的经典模型,它从5个不同的视角来描述软件架构:

  • 逻辑视图,描述系统的对象,包括类、包以及它们之间的关系,侧重于系统的功能需求。
  • 进程视图,描述系统的进程,包括运行时的进程及进程间的通信和同步,侧重于系统的性能要求。
  • 物理视图,描述系统的部署环境,包括物理机器和网络,侧重于基础架构和分布式。
  • 开发视图,也叫实现视图,描述系统开发时的软件元素的静态组织,包括一系列模块或组件以及它们之间的组合、依赖关系。
  • 场景视图,场景视图是其它每个视图中的一系列用例,每个用例描述了该视图中的组件如何协作以处理外部请求。

微服务架构_第1张图片
软件架构的意义不在于满足系统的功能性需求,而在于满足系统的非功能性需求,它们进一步可以分为两类:

  • 运行时需求,如可用性、可靠性和可扩展性;
  • 开发时需求,如可移植性、可维护性、可测试性和可部署性。

分层架构

分层架构按照层来组织软件元素,每层负责一系列职责,上层依赖于它的下层,例如典型的三层架构:

  • 表现层,实现用户界面或外部API
  • 业务逻辑层,实现所有的业务逻辑
  • 持久层,实现数据库访问

分层架构的缺点:

  • 单一的表现层,无法表示多种调用方式
  • 单一的持久层,无法表示多种数据访问方式
  • 业务逻辑层依赖于持久层,使得业务逻辑层测试依赖于持久层

六边形架构

六边形架构,也叫端口和适配器架构(ports and adapters architecture),旨在创建松耦合的应用程序组件,这些组件可以通过端口和适配器轻松连接到其所在的软件环境。这使得组件可以在任何级别上互换,并有助于自动化测试。

六边形架构将系统分解为一些松耦合的可替换的组件,如应用程序核心,数据库,用户界面,测试脚本以及连接其他系统的接口。
微服务架构_第2张图片
六边形架构应用于领域驱动设计,可作为微服务架构中每个子服务的架构。六边形架构的中心是应用核心领域,它是应用的领域模型,实现了所有的业务逻辑。业务逻辑有多个端口,它们是一系列服务。入端口(Inbound Port)是应用核心领域暴露的服务,供外部组件调用;出端口(Outbound Port)定义了应用核心领域如何连接外部组件。围绕应用核心领域的是各种适配器,入适配器(Inbound Adapter)将外部请求适配到入口接口;同理,出口适配器(Outbound Port)为出口接口访问外部应用作适配。

立方体扩展模型和微服务架构

立方体扩展模型(The scale cube)定义了三种应用扩展方法:

  • X轴扩展,即水平复制。通过复制应用实例进行扩展,通过负载均衡算法将请求转发到多个应用实例。
  • Z轴扩展,即数据分片。根据某个属性(如ID)将数据集分片,每个应用实例负责处理一个子数据集,基于当前请求的某个属性执行路由算法,将请求路由到不同的实例以操作对应的子数据集。
  • Y轴扩展,即服务化。将单体应用按不同功能分解成多个微服务,这种扩展方式最灵活。

微服务架构_第3张图片
服务化扩展方法最灵活,按功能或业务领域划分后,每个子服务还可以独立地进一步扩展:
微服务架构_第4张图片
将单体应用按不同功能或业务领域分解成多个不同的服务,就是微服务架构。可见,微服务架构是相对于传统的单体架构来定义的。

微服务架构将应用程序组织为一系列松耦合、独立部署的服务。

微服务架构具有以下特点:

  • 每个服务都是自治的,可独立开发、测试和部署;
  • 单一职责,每个服务只实现一种功能,一般是某种业务功能,也可以是某种共享的技术能力;
  • 可替换性,单一职责使得该服务的功能和角色界限非常明确,易于使用其它实现替换;
  • 独立的数据库,各个微服务的数据库私有,访问别其它服务的数据只能通过它提供的接口;
  • 微服务本身并没有消息通信、服务编排和协调等功能,这些功能由其它公共基础组件实现。

微服务架构具有以下优点:

  • 促进了大型复杂应用的持续交付和部署;
  • 易于维护;
  • 独立部署;
  • 独立伸缩;
  • 促进了团队自治化;
  • 易于新技术的预研和采纳;
  • 错误隔离。

微服务架构并非银弹,它存在以下缺点或挑战:

  • 服务划分需要大量的领域知识;
  • 服务之间的界限和契约很难确定,一旦确定,改变起来很困难;
  • 微服务是分布式系统,因此需要对状态,一致性和网络可靠性做出不同的假设;
  • 更多的服务造成更多失败点;
  • 部署跨多个服务的功能需要正确的服务编排;
  • 分布式系统监控困难;
  • 分布式系统测试困难。

微服务开发生命周期

微服务开发生命周期包括三个大的阶段:设计、部署和观察监控。
微服务架构_第5张图片
设计阶段:

  • 服务划分,自顶向下还是自下向上;
  • 应用的总体架构和外观;
  • 界定服务范围;
  • 服务间通信协议;
  • 如何实现服务弹性。

部署阶段:

  • 标准化服务发布单元;
  • 实现持续交付管道。

观察监控阶段:

  • 主动识别并重构系统中易出故障的部分;
  • 追踪系统的行为。

微服务设计模式和Spring Cloud

基于微服务架构存在的各种挑战,业界总结出了一系列微服务设计模式,Spring Cloud就是这些模式的优秀实践。

服务分解模式:
微服务架构_第6张图片
服务通信模式:
微服务架构_第7张图片
数据一致性模式:
微服务架构_第8张图片
数据访问模式:
微服务架构_第9张图片
服务部署模式:
微服务架构_第10张图片
服务监控模式:

  • 健康检查 API
  • 日志聚合
  • 分布式链路追踪
  • 异常追踪
  • 应用指标
  • 审计日志(用户活动日志)

自动化测试模式:

  • Consumer-driven contract test,测试服务是否符合消费者的期望
  • Consumer-side contract test,测试该服务的客户端能否与该服务通信
  • Service component test,单独测试每个组件

横切关注点模式:

  • 机箱模式,例如,使用spring cloud

安全模式:

  • 访问令牌模式

Spring Cloud是Java领域最流行的微服务框架,它提供了一系列微服务模式编程模型和典型实现,例如:

  • 分布式版本化配置管理
  • 服务注册与发现
  • 服务间调用
  • 客户端负载均衡
  • 熔断器
  • 网关路由
  • 微代理(micro-proxy)
  • 控制总线
  • 一次性令牌(one-time tokens)
  • 全局锁
  • leader选举
  • 分布式session
  • 集群状态

微服务架构_第11张图片

你可能感兴趣的:(微服务,微服务,架构,六边形架构,立方体扩展,设计模式)