架构模式与原则之演进篇¶
概览¶
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¶
单体简介¶
-
定义
- 项目中所有的功能特性都维护在同一个代码仓库,就叫单体应用。
-
特点
- 单一代码仓库
- 单一 jar/war/bundle.js 文件
- 部署范围大
- 难以维护
- 难以实现新特性
何时使用单体¶
- 需要保持简单直接:
- 构建、测试、部署、故障排查(troubleshoot)、垂直扩展(Scale Vertically)
单体的优势¶
- 开发简单
- 调试和测试容易
- 部署简单
单体的挑战¶
- 难以理解
- 难有新改变
- 新技术障碍
- 可扩展性差
单体参考架构¶
单体架构通信¶
- 进程间通信(Inter-Process Communication)
- 所有模块在同一个服务器
- 通信是由代码中的方法调用来执行的
-
事务管理
- 单一数据库
- 简单的提交与回滚操作
单体架构部署¶
- 单一代码库
- 影响整个系统
- 不可靠
- 昂贵且高风险
设计原则¶
- KISS
- YAGNI
- DRY
单体案例 E-Commerce¶
可扩展性:垂直/水平¶
垂直扩展¶
- Vertical Scaling/Scale up
- 增强 instance 的能力(RAM、CPU etc.)
水平扩展¶
- Horizontal Scaling/Scale out
- 增加更多 instances
- 提供可扩展性,但同时保持可靠性
- Stateful or Stateless
单体可扩展性 E-Commerce¶
- 为了提供
单体架构
的 可扩展性,我们增加应用服务服器
- 在服务器实例之前,引入**负载均衡器**
- 如图
负载均衡¶
- 平衡流量
- 分发流量到整个集群
- 一致性哈希算法(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¶
-
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¶
Service-Oriented Architecture (SOA)¶
SOA 定义¶
- 面向服务(SOA)宗旨是 以服务为基准点 完成系统的组件化和模块化,继而完成架构搭建。
- SOA 通过 中立的接口定义 实现松耦合。
SOA 架构设计 E-Commerce¶
架构设计模式 - ESB¶
- 企业服务总线 (ESB, Enterprise Service Bus)
- 整合应用-生产者 & 消费者(Integrations between application)
- 基于消息中间件协作(Middleware messaging components)
- 数据模型的转换(Transformations of data models)
- 服务编排(Service orchestration)
- 复杂性和交互性引入了新的瓶颈(Increased complexity and inters introduced bottlenecks)
SOA 中通信¶
- 企业服务总线系统(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 定义¶
- 微服务是 小的业务服务,它们可以一起工作,也可以 独立/自组织 的部署。
- 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
- Deployment Comparison
Microservices 参考架构¶
- 参考架构一 - simple API GW
- 参考架构二 - message broker
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¶
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 模式¶
-
什么是 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 边界¶
- 上下文映射模式(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)
-
-
识别和分解微服务