SlideShare a Scribd company logo
1 of 36
Download to read offline
微服务架构设计模式
Microservices Patterns
李杉杉
目录
01 微服务架构基础知识
02 微服务核心设计模式
教
材
博
客
https://martinfowler.com/microservices/
https://microservices.io/index.html
01 微服务架构风格
• 发 展 历 程
• 单 体 架 构
• 微 服 务 架 构
• 主 要 特 性
• 架 构 对 比
发展历程 单体架构 微服务架构 主要特性 架构对比
单体架构 分层架构 SOA架构 微服务架构
• 最简单的架构风格
• 完全封闭
• 代码统一部署
• 紧耦合“大泥球”
• 整体扩展伸缩
• 业务发展初期
• 抽象和分层
• 结构化思考
• MVC三层架构
• 紧耦合“重复造轮子”
• 整体扩展伸缩
• 业务快速增长
• 面向服务架构
• 重量级消息通信机制
• ESB企业服务总线
• 共享数据库
• 整体扩展伸缩
• 集中式服务解决方案
• 服务解耦组件化
• 轻量级通信机制
• 非共享数据库
• 独立部署运行
• 独立扩展伸缩
• 去中心化协同管理
发展历程 单体架构 微服务架构 主要特性 架构对比
发展历程 单体架构 微服务架构 主要特性 架构对比
单体架构示例(FTGO应用)
• 订餐应用
• 分层模块化企业级Java应用
• 核心是业务逻辑组件
• 订单管理
• 配送管理
• 餐馆管理等
• 业务逻辑外是实现用户界面的适配
器和与外部系统的接口
• Stripe管理支付
• Twilio实现消息传递
• Amazon SES发送电子邮件
• MySQL存储数据
发展历程 单体架构 微服务架构 主要特性 架构对比
单体(Monolithic)应用的全部功能被集成在一起作为一个单一的单元。
• Java Web应用程序(WAR)文件
• GoLang语言,交付形态为单一可执行文件
• Ruby或Node.js,交付形态为目录和子目录下各种源码
• 初始化、配置、监控、管理等功能
单体架构的好处
• 易于开发(Development)
• 易于修改(Modifiability)
• 易于测试(Testability)
• 易于部署(Deployability)
• 易于伸缩(Scalability)
发展历程 单体架构 微服务架构 主要特性 架构对比
单体架构的问题
• 过度复杂性
• 开发速度缓慢
• 部署周期长且易出错
• 难以扩展
• 可靠性差
• 过期技术栈
发展历程 单体架构 微服务架构 主要特性 架构对比
概括性描述:
微服务架构是把应用程序功能性分解为一组服务的架构风格,每一个服务
都是由一组专注、内聚的功能职责组成。
https://microservices.io
Chris Richardson
发展历程 单体架构 微服务架构 主要特性 架构对比
高可伸缩
服务可以独立扩展
每个服务之间松耦合,功能扩展性高,
扩展后的服务可快速上线
技术栈不受限
开发者可以自由选择开发技术,提供
API服务,针对项目开始时采用的过时
技术,可以选择现在的技术
大型复杂程序可以持续部署和交付
可测试性、可部署性、团队自主且松散耦合,持续
化部署和交付成为可能
每个服务相对较小并容易维护
应用被分解为多个可管理的分支或服
务,每个服务都有一个用RPC或者消息
驱动API定义清楚的边界
系统中的某个微服务遇到了瓶颈,根据业务请求,增加
或减少资源如内存、CPU或节点,提高资源利用率
发展历程 单体架构 微服务架构 主要特性 架构对比
Martin Fowler
微服务架构是一种将单体应用拆分为细粒度
的服务,并使其运行在独立进程中,服务之
间采用轻量级通信机制(如HTTP RESTful
API)进行交互的架构风格。这些服务围绕系
统的业务能力构建,且可以通过全自动的部
署机制进行独立部署。服务可以进行分布式
管理,从而支持不同的编程语言进行开发和
不同的数据存储技术进行存储。
FOWLER M, LEWIS J. Microservices - A definition of
this new architectural term[EB/OL]. 2014.
https://martinfowler.com/articles/microservices.html.
发展历程 单体架构 微服务架构 主要特性 架构对比
微服务架构示例
(FTGO应用)
发展历程 单体架构 微服务架构 主要特性 架构对比
1. 通过服务组件化
• 组件:可以独立替换和升级的软件单元
• 进程内组件
• 类、对象或库的形式
• 一般直接调用、以内存方式进行功能调用(共享内存)
• 进程外组件
• 微服务架构中的独立服务
• 实现组件化的方式是分解成服务
• 通过Web服务请求或 RPC机制通信
• 轻量级消息传递机制(如RabbitMQ)
• 产生明确的组件发布接口
• 耦合度低,隔离性好、独立开发、部署和运维
• 远程调用性能损耗、跨进程服务职责
发展历程 单体架构 微服务架构 主要特性 架构对比
2. 围绕业务能力组织
• 传统软件系统开发管理通常聚焦在技术层面
• UI团队、服务逻辑团队、数据库团队…
• 跨团队的沟通、交接和预算审批等
• 采用围绕业务能力的划分方法
• 服务业务领域内的宽栈实现
• 团队跨职能、全方位开发技能
• 如用户体验、数据库、项目管理……
• 采用产品开发模式
• 传统:项目模式,开发-维护,开发完解散
• 开发团队负责软件的整个产品周期
• 持续关注软件如何帮助用户提升业务能力,实现价值交付
发展历程 单体架构 微服务架构 主要特性 架构对比
3. 内聚和解耦
• 内聚:单一职责,有各自的领域逻辑
• 解耦:微服务间尽量减少直接依赖,独立自治
• 服务边界的确定(划分)有助于澄清和强化分离
• 业务功能分解:每个微服务负责独立的业务能力
• 领域驱动设计:通用领域划分为多个子域,识别
限界上下文(Bounded Context)-服务边界
发展历程 单体架构 微服务架构 主要特性 架构对比
4. 去中心化
• 去中心化治理
• 构建微服务时可以有服务自己的技术栈选择
• 服务之间只需约定接口,无需关注内部实现
• 运维只需了解服务部署规范
• 去中心化数据存储
• 让每个微服务管理自己的数据库
• 或同一数据库技术的不同实例
• 或完全不同的数据库系统
• 去中心化数据管理
• 传统架构采用事务保证数据一致性,分布式微服务架构中中数据管理困难
• 强调服务间的无事务协作,最终一致性和补偿策略
• 需权衡更大一致性的业务损失与修复错误的代价
发展历程 单体架构 微服务架构 主要特性 架构对比
5. 基础设施自动化
• 依赖自动化的基础设施,降低开发和运维微服务的操作复杂度
• 持续部署和交付:编码、管理代码库、集成(构建、测试、打包)、部署、监控和运维
• 测试:单元测试、集成测试、组件化测试、契约测试和端到端测试等
发展历程 单体架构 微服务架构 主要特性 架构对比
6. 服务设计与演进
• 高可用设计
• 容忍服务失败,客户端须尽可能有效地做出响应
• 完善的监控和日志记录,架构元素或业务指标、链路追踪
• 快速发现不良突发行为并尽早修复
• 演进式设计
• 传统架构软件变更难以预测且改造成本高昂
• 合理设计实现频繁、快速且控制良好的增量变更和演化
• 合适的服务解耦,只需重新部署修改的服务
• 变更频率不同,拆分(相同,合并)
• 架构适应度函数(Architectural fitness function)
发展历程 单体架构 微服务架构 主要特性 架构对比
发展历程 单体架构 微服务架构 主要特性 架构对比
SOA MSA
服务间通信 1. 智能管道,如 (ESB)
2. 重量级协议,如SOAP或WS*标准
1. 哑管道,如消息代理,或服务之间点对点通信
2. 轻量级协议,如 REST或gRPC
数据管理 全局数据模型并共享数据库 每个服务有自己的数据模型和数据库
典型服务规模 较大的单体应用 较小的服务
SOA (Service-Oriented Architecture) = MSA (Microservice Architecture)?
02 微服务核心设计模式
• 挑战问题
• 模式和模式语言
• 模式集合及示例
微服务架构挑战问题
• 微服务的拆分和定义(粒度问题),如何拆、结果优劣
• 进程间通信机制复杂性高于方法调用、局部故障
• 跨服务的事务和查询(Saga维护数据一致性、API组合或CQRS视图从多个服务中检索数据)
• 编写包含多项服务在内的自动化测试(验证服务交互、消费者驱动的契约测试)
• 部署跨服务的功能需要协调更多开发团队
• 运维复杂性(自动化部署工具、产品化PaaS平台、Docker容器编排平台)
谨慎决策、权衡取舍 => 微服务架构模式语言
微服务架构不是
一颗银弹!
挑战问题 模式和模式语言 拆分 数据 通信 部署 运维
模式:针对特定上下文中发生的问题的可重用解决方案。
• 上下文(Context):问题特定的上下文环境
• 问题(Problems):需要解决的问题
• 需求(Forces):需求、优先级和其他约束
• 方案(Solution):可重用的解决方案
• 结果(Consequences):采用模式后的后果
• 好处
• 弊端
• 问题
• 相关模式(Related patterns):与其他模式之间的关系
• 前导(Predecessor )
• 后续(Successor )
• 替代(Alternative )
• 泛化(Generalization)
• 特化(Specialization)
挑战问题 模式和模式语言 拆分 数据 通信 部署 运维
@crichardson
Alternative
Pattern
Pattern
Benefits
Drawbacks
Issues
Alternative
Pattern
Patterns
that
address
issues
Context
Problem
Solution
aka the situation
(conflicting) issues/
requirements/etc to
address
Forces
Consequences
predecessor
successor
微服务架构模式语言(一组模式)
• 应用相关模式组
• 应用基础设施相关模式组
• 基础设施相关模式组
挑战问题 模式和模式语言 拆分 数据 通信 部署 运维
微服务架构模式语言(一组模式)
• 帮助解决微服务架构设计问题
• 拆分问题
• 数据问题
• 通信问题
• 部署问题
• 运维问题
• ……
Deployment
Define services
Observe
UI
Communication
Test
Cross cutting concerns
“Data”
挑战问题 模式和模式语言 拆分 数据 通信 部署 运维
应用相关模式组-拆分模式
应用和基础设施相关模式组-
通信模式
应用相关模式组-数据模式
基础设施相关模式组-部署模式
挑战问题 模式和模式语言 拆分 数据 通信 部署 运维
挑战问题 模式和模式语言 拆分 数据 通信 部署 运维
拆分相关模式
• 问题:如何将应用拆分为微服务?
• 需求:
• 高内聚:实现一组密切相关的功能
• 松耦合:封装内部细节,API交互
• 单一职责原则(SRP)
• 共同封闭原则(CCP)
• 双披萨团队开发
• 团队自治
• ……
1. 识别系统操作:
FTGO领域模型中的关键类
FTGO的重要系统操作
具体流程
挑战问题 模式和模式语言 拆分 数据 通信 部署 运维
2. 服务拆分:
• 方案1:根据业务能力进行服务拆分
• 为企业产生价值的商业活动
• 保险:承保、理赔管理、账务管理等
• FTGO:供应商、消费者、订单获取和执行、
记账管理
• 业务能力可分解:顶级能力和子能力
• 能力层次结构中各级别能力映射到服务中
• 结果:
• 内聚和解耦
• 能力与服务的映射具有主观性
• 过多的进程间通信导致重新分解或组合
• 相关模式:
• 根据子域、动静态调研关系进行服务拆分
挑战问题 模式和模式语言 拆分 数据 通信 部署 运维
2. 服务拆分:
• 方案2:根据子域进行服务拆分
• 领域驱动设计DDD核心:子域和限界上下文
• 领域:描述应用程序问题域的术语(包含子领域)
• 拆分过程:
• 分析业务
• 识别子领域(领域模型)
• 子领域模型边界(限界上下文、微服务边界)
• 订单获取、餐馆管理、配送、记账等
• 结果:
• 高内聚和松耦合
• 单独的领域模型来消除上帝类
• 领域模型由团队独立开发、支持团队自治
• 相关模式:
• 根据业务能力、动静态调研关系进行服务拆分
挑战问题 模式和模式语言 拆分 数据 通信 部署 运维
2. 服务拆分:
• 方案3:根据动静态调用关系进行服务拆分
• 收集单体应用动静态调用信息
• 静态:用例分析、字节码解析、API接口
• 动态:调用链路、数据流图、控制流图
• 构建调用关系图
• 基于聚类算法拆分
• 结果:
• 棕地开发场景的拆分(遗留系统)
• 自动化、效率高
• 受限于遗留系统的分析和数据收集难度
• 相关模式:
• 根据业务能力、子域进行服务拆分
挑战问题 模式和模式语言 拆分 数据 通信 部署 运维
3. 定义API:
• 将系统操作映射到服务
• 操作分配到需要操作提供信息的服务
• noteUpdatedLocation()
• 操作分配到具有处理它所需信息的服务
• verifyConsumerDetails ()
• 确定在处理每一个系统操作时,
服务之间如何交互
• 单个服务处理
• 跨越多个服务
• 进程间通信技术(同步或异步)等
挑战问题 模式和模式语言 拆分 数据 通信 部署 运维
作业(3-4人小组为单位):
1. 选取一个开源的单体系统,分析需求、构建领域模型并识别系统操作
• GitHub上检索
• Star数量超过500
• 有完整需求分析和文档
• 无对应的微服务版本
2. 根据服务拆分模式1和2进行微服务的划分
3. 定义候选微服务的API并体现和业务操作的对应关系
4. 对另一小组的设计方案进行同行评审
挑战问题 模式和模式语言 拆分 数据 通信 部署 运维
谢 谢

More Related Content

Similar to 微服务架构设计模式-第一次课v2.pdf

Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconYiwei Ma
 
Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconYiwei Ma
 
Rest与面向资源的web开发
Rest与面向资源的web开发Rest与面向资源的web开发
Rest与面向资源的web开发topgeek
 
新浪微博平台与安全架构
新浪微博平台与安全架构新浪微博平台与安全架构
新浪微博平台与安全架构n716
 
淘宝网架构变迁和挑战(Oracle架构师日)
淘宝网架构变迁和挑战(Oracle架构师日)淘宝网架构变迁和挑战(Oracle架构师日)
淘宝网架构变迁和挑战(Oracle架构师日)vanadies10
 
新浪微博Feed服务架构
新浪微博Feed服务架构新浪微博Feed服务架构
新浪微博Feed服务架构XiaoJun Hong
 
浅谈伪分布式数据库架构
浅谈伪分布式数据库架构浅谈伪分布式数据库架构
浅谈伪分布式数据库架构mysqlops
 
低成本和高性能MySQL云架构探索
低成本和高性能MySQL云架构探索低成本和高性能MySQL云架构探索
低成本和高性能MySQL云架构探索Feng Yu
 
百度数据库中间层
百度数据库中间层百度数据库中间层
百度数据库中间层yp_fangdong
 
百度消息队列设计和实现总结
百度消息队列设计和实现总结百度消息队列设计和实现总结
百度消息队列设计和实现总结everestsun
 
天涯论坛的技术进化史-Qcon2011
天涯论坛的技术进化史-Qcon2011天涯论坛的技术进化史-Qcon2011
天涯论坛的技术进化史-Qcon2011Yiwei Ma
 
构建高性能MySQL系统
构建高性能MySQL系统构建高性能MySQL系统
构建高性能MySQL系统jackbillow
 
Top100summit 腾讯-周健-服务化与体系化解决大量定制小项目开发困境
Top100summit 腾讯-周健-服务化与体系化解决大量定制小项目开发困境Top100summit 腾讯-周健-服务化与体系化解决大量定制小项目开发困境
Top100summit 腾讯-周健-服务化与体系化解决大量定制小项目开发困境drewz lin
 
Web development introduced history and future
Web development introduced history and futureWeb development introduced history and future
Web development introduced history and futurejarryli
 
中国移动Boss3.0技术方案
中国移动Boss3.0技术方案中国移动Boss3.0技术方案
中国移动Boss3.0技术方案yiditushe
 
王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计YANGL *
 
Cloud computing for manufacturing
Cloud computing for manufacturingCloud computing for manufacturing
Cloud computing for manufacturingJeff Chu
 
浅析主流商业和开源Esb产品
浅析主流商业和开源Esb产品浅析主流商业和开源Esb产品
浅析主流商业和开源Esb产品nereuschen
 

Similar to 微服务架构设计模式-第一次课v2.pdf (20)

Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qcon
 
Cibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qconCibank arch-zhouweiran-qcon
Cibank arch-zhouweiran-qcon
 
Rest与面向资源的web开发
Rest与面向资源的web开发Rest与面向资源的web开发
Rest与面向资源的web开发
 
新浪微博平台与安全架构
新浪微博平台与安全架构新浪微博平台与安全架构
新浪微博平台与安全架构
 
淘宝网架构变迁和挑战(Oracle架构师日)
淘宝网架构变迁和挑战(Oracle架构师日)淘宝网架构变迁和挑战(Oracle架构师日)
淘宝网架构变迁和挑战(Oracle架构师日)
 
新浪微博Feed服务架构
新浪微博Feed服务架构新浪微博Feed服务架构
新浪微博Feed服务架构
 
浅谈伪分布式数据库架构
浅谈伪分布式数据库架构浅谈伪分布式数据库架构
浅谈伪分布式数据库架构
 
低成本和高性能MySQL云架构探索
低成本和高性能MySQL云架构探索低成本和高性能MySQL云架构探索
低成本和高性能MySQL云架构探索
 
百度数据库中间层
百度数据库中间层百度数据库中间层
百度数据库中间层
 
百度消息队列设计和实现总结
百度消息队列设计和实现总结百度消息队列设计和实现总结
百度消息队列设计和实现总结
 
天涯论坛的技术进化史-Qcon2011
天涯论坛的技术进化史-Qcon2011天涯论坛的技术进化史-Qcon2011
天涯论坛的技术进化史-Qcon2011
 
构建高性能MySQL系统
构建高性能MySQL系统构建高性能MySQL系统
构建高性能MySQL系统
 
Top100summit 腾讯-周健-服务化与体系化解决大量定制小项目开发困境
Top100summit 腾讯-周健-服务化与体系化解决大量定制小项目开发困境Top100summit 腾讯-周健-服务化与体系化解决大量定制小项目开发困境
Top100summit 腾讯-周健-服务化与体系化解决大量定制小项目开发困境
 
Esb
EsbEsb
Esb
 
ASP.net MVC
ASP.net MVCASP.net MVC
ASP.net MVC
 
Web development introduced history and future
Web development introduced history and futureWeb development introduced history and future
Web development introduced history and future
 
中国移动Boss3.0技术方案
中国移动Boss3.0技术方案中国移动Boss3.0技术方案
中国移动Boss3.0技术方案
 
王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计王龙:百度数据库架构演变与设计
王龙:百度数据库架构演变与设计
 
Cloud computing for manufacturing
Cloud computing for manufacturingCloud computing for manufacturing
Cloud computing for manufacturing
 
浅析主流商业和开源Esb产品
浅析主流商业和开源Esb产品浅析主流商业和开源Esb产品
浅析主流商业和开源Esb产品
 

微服务架构设计模式-第一次课v2.pdf