Skip to content

架构模式与原则之演进篇

概览

x

Architecture Design 演进史

  • Monolithic
  • Layered Architecture
  • SOA
  • Microservices
  • Event Driven Microservices Architectures

理解 E-Commerce 领域

  • 功能需求(用例)

    • 需求与建模(Requirements & Modelling)
    • 识别用户故事(User Stories)
    • 识别用户故事中的名词(Nouns)
    • 识别用户故事中的动词(Verbs)
  • 非功能需求

    • 可扩展性 Scalability
    • 可用性 Availability
    • 可靠性 Reliability
    • 可维护性 Maintability
    • 易用性 Usability
    • 响应效率 Efficiency

Monolithic Architecture

x

单体简介

  • 定义

    • 项目中所有的功能特性都维护在同一个代码仓库,就叫单体应用。
  • 特点

    • 单一代码仓库
    • 单一 jar/war/bundle.js 文件
    • 部署范围大
    • 难以维护
    • 难以实现新特性

何时使用单体

  • 需要保持简单直接:
  • 构建、测试、部署、故障排查(troubleshoot)、垂直扩展(Scale Vertically)

单体的优势

  • 开发简单
  • 调试和测试容易
  • 部署简单

单体的挑战

  • 难以理解
  • 难有新改变
  • 新技术障碍
  • 可扩展性差

单体参考架构

x

单体架构通信

  • 进程间通信(Inter-Process Communication)
  • 所有模块在同一个服务器
  • 通信是由代码中的方法调用来执行的
  • 事务管理

    • 单一数据库
    • 简单的提交与回滚操作

单体架构部署

  • 单一代码库
  • 影响整个系统
  • 不可靠
  • 昂贵且高风险

设计原则

  • KISS
  • YAGNI
  • DRY

单体案例 E-Commerce

x

可扩展性:垂直/水平

垂直扩展

  • Vertical Scaling/Scale up
  • 增强 instance 的能力(RAM、CPU etc.)

水平扩展

  • Horizontal Scaling/Scale out
  • 增加更多 instances
  • 提供可扩展性,但同时保持可靠性
  • Stateful or Stateless

单体可扩展性 E-Commerce

  • 为了提供单体架构可扩展性,我们增加应用服务服器
  • 在服务器实例之前,引入**负载均衡器**
  • 如图

x

负载均衡

  • 平衡流量
  • 分发流量到整个集群
  • 一致性哈希算法(Consistent Hashing)

CAP 理论

  • 用于水平扩展。
  • 一致性(Consistency)

    • (等同于所有节点访问同一份最新的数据副本)
  • 可用性(Availability)

    • (每次请求都能获取到非错的响应——但是不保证获取的数据为最新数据)
  • 分区容错性(Partition tolerance)

    • (系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。)

Layered (N-Layer) Architecture

架构常见分层

  • User interface:比如 Web 界面
  • Business logic:用例实现与服务暴露(如REST API)
  • Data access:比如 SQL 数据库

设计原则 - SoC & SOLID

x

  • SoC

    • 关注点分离 (SoC, Separation of Concerns)
    • 软件中的元素应该是他们独有的,而不是与其他成员分担责任。 (Elements in the software should be unique)
    • 成员间责任不共享 (Separate responsibilities)
    • 组件的命名空间作为分配责任的限制 (Namespaces as Limits to allocate Responsibilities)
    • 低耦合高内聚 (Low-coupling, high-cohesion)
  • SOLID

    • Single Responsibility Principle
    • Open-Closed Principle
    • Liskov Substitution Principle
    • Interface Segregation Principle
    • Dependency Inversion Principle

分层架构 E-Commerce

x

Service-Oriented Architecture (SOA)

SOA 定义

  • 面向服务(SOA)宗旨是 以服务为基准点 完成系统的组件化和模块化,继而完成架构搭建。
  • SOA 通过 中立的接口定义 实现松耦合。

SOA 架构设计 E-Commerce

x

架构设计模式 - ESB

x

  • 企业服务总线 (ESB, Enterprise Service Bus)
  • 整合应用-生产者 & 消费者(Integrations between application)
  • 基于消息中间件协作(Middleware messaging components)
  • 数据模型的转换(Transformations of data models)
  • 服务编排(Service orchestration)
  • 复杂性和交互性引入了新的瓶颈(Increased complexity and inters introduced bottlenecks)

SOA 中通信

x

  • 企业服务总线系统(Enterprise service bus-ESB system)
  • 处理连接、消息,执行路由(Handles connectivity and messaging, performs routing)
  • 服务间通信(Inter-service communication)
  • 基于简单对象访问协议的 Web 服务(SOAP-based web services)
  • 关键技术涉及简单对象访问协议、Web服务描述语言、XML Schema 等(SOAP, WSDL and XSD)

SOA vs Microservices

  • 都使用服务间通信(Inter-service communication due to distributed services)
  • SOA 使用企业服务总线(SOA. using Enterprise Service Bus)
  • 微服务使用轻量级的消息代理(Microservices, using message brokers)
  • SOA使用全局数据模型和共享数据库(SOA using Global data model)
  • 微服务使用多种数据库(Microservices has polyglot databases)
  • 服务大小不同,SOA 通常用来整合大型、复杂的、单体的应用(Size of the services different)
  • SOA 增加复杂度和引入瓶颈(SOA increased complexity and introduced bottlenecks)
  • ESB 中间件很昂贵,经常成为瓶颈(ESB middleware expensive)
  • SOA 中的共享数据库引发 分布式单体,集中式服务,对变化有抵触

Microservices Architecture

Microservices 定义

x

  • 微服务是 小的业务服务,它们可以一起工作,也可以 独立/自组织 的部署。
  • Microservice are small business services that can work together and can be deployed autonomously / independently.

Microservices 特性

  • 小、独立、松耦合(Small, independent and loosely coupled)
  • 分离的代码库(Separate codebase)
  • 独立部署(Deployed independently)
  • 持久化自己的数据(Persisting their own data)
  • 依赖定义好的 API 通信(Well-defined APIs)
  • 拥抱不同技术栈(Technology agnostic)

Martin Fowler 说特性

  • Componentization via Services
  • Organized around Business Capabilities
  • Products not Projects
  • 智能端点和傻瓜式管道(Smart endpoints and dumb pipes)

    • SOA 典型例子是企业服务总线(ESB),ESB 负责消息路由、编排、转换以及业务规则的应用,称为智能管道(Smart pipes)。
    • 而微服务倾向于相反的做法。
  • 去中心化技术治理(Decentralized Governance)

  • 去中心化数据管理(Decentralized Data Management)
  • 基础设施自动化(Infrastructure Automation)
  • 容错设计(Design for failure)
  • 演进式设计(Evolutionary Design)

Microservices 优势

  • 敏捷(Agility)
  • 小而聚焦的团队(Small, focused teams)
  • 小而分离的代码库(Small and Separated Code Base)
  • 最合适的工具(Right tool for the job)
  • 适应技术变革(Adapting Technology changes)
  • 错误隔离(Fault Isolation)
  • 更好的可扩展性(Scalability)
  • 数据隔离(Data isolation)

Microservices 挑战

  • 复杂性(Complexity)
  • 网络问题和延迟(Network problems and Latency)
  • 开发和测试(Development and Testing)
  • 数据完整性问题(Data Integrity)

    • 数据的一致性将是一个挑战。

单体 vs 微服务

  • Architecture Comparison

x

  • Deployment Comparison

x

Microservices 参考架构

  • 参考架构一 - simple API GW

x

  • 参考架构二 - message broker

x

Database-per-Service 模式

  • 服务的松散耦合(Loose coupling of services)
  • 自己的数据库(Own databases)
  • 多边型持久化(Polygon persistence)
  • 无法直接访问(Can't be accessed directly)
  • 独立扩展(Scale independently)
  • 数据封装在服务中(Data encapsulated within the service)
  • 不影响其他服务(Not affect to other services)

微服务架构 E-Commerce

x

Microservices Architecture 分解

微服务分解路径

  • 1)通过 Domain analysis 定义微服务边界
  • 2)使用 DDD, Bounded Contexts 及其他 Decompose Strategies

    • 通过 business capability 分解
    • 通过 subdomains 分解
  • 3)识别微服务边界

微服务分解模式

  • 微服务分解模式-Decompose by Business Capability

    • 服务必须 高内聚
    • 服务必须 低耦合
    • 根据 Business Capabilities 定义服务
    • 一个业务能力的概念来自 business architecture modeling
  • 微服务分解模式-Decompose by Subdomain

    • 服务必须 高内聚
    • 服务必须 低耦合
    • 根据 DDD subdomains 定义服务
    • 问题空间的 business as domain;domain 由多个 subdomains 组成,即 part of business。

Bounded Context 模式

x

  • 什么是 DDD?

    • DDD is a recommended approach for use in complex systems
    • Bounded Contexts 是 groups of sub domains。
  • 战略阶段 Strategic DDD

    • 关注 抽象
    • 分解问题空间的业务领域,输出:核心子域,通用子域,支撑子域
    • 进一步分解,输出:领域模型,限界上下文,上下文映射
  • 战术阶段 Tactical DDD

    • 关注 实现
    • 产出软件实现的设计元素:entity, aggregate, value object, repository and domain service

识别 Bounded Context 边界

x

  • 上下文映射模式(DDD-Context Mapping pattern)
  • 定义领域间的逻辑边界

用领域分析来建模微服务

  • 微服务依据 business capabilities 设计
  • 松耦合、自治的服务
  • DDD-Bounded Context 遵从 上下文映射模式;用 子域模型模式 来分解。

E-Commerce 领域案例

  • 领域分析

    • 用例(Use Cases)

      • 转化成 User Stories items:
      • As a use I want to list products
      • As a use I want to filter products as categories
    • 名词/动词(Nouns and Verbs)

  • 识别和分解微服务

x

References

Design Microservices

Blogs