系统拆分之按业务进行拆分
上下文
您正在开发一个大型,复杂的应用程序,并希望使用微服务架构。微服务架构将应用程序构造为一组松散耦合的服务。微服务架构的目标是通过实现持续交付/部署来加速软件开发。
微服务架构以两种方式实现:
- 简化测试并使组件能够独立部署
- 将工程组织构建为小型(6-10个成员)自治团队的集合,每个团队负责一个或多个服务
这些好处不会自动得到保证。相反,它们只能通过将应用程序细致地功能分解为服务来实现。
服务必须小到足以由小团队开发并且易于测试。面向对象设计(OOD)的一个有用指导是单一责任原则(SRP)。 SRP将类的责任定义为改变的原因,并声明类只应有一个改变的理由。将SRP应用于服务设计以及设计具有凝聚力的服务并实现一小组强相关功能是有意义的。
应用程序也以某种方式进行分解,以便大多数新的和更改的要求仅影响单个服务。这是因为影响多个服务的更改需要跨多个团队进行协调,这会降低开发速度。 OOD的另一个有用原则是Common Closure Principle(CCP),它声明由于相同原因而改变的类应该在同一个包中。也许,例如,两个类实现相同业务规则的不同方面。目标是当业务规则改变开发人员时,只需要更改少量代码(最好只有一个)的代码。这种思维在设计服务时很有意义,因为它有助于确保每项变更只影响一项服务。
问题
如何将应用程序分解为服务?
需要满足的诉求
- 架构必须稳定
- 服务必须具有凝聚力。服务应该实现一小组强相关的功能。
- 服务必须符合通用关闭原则 - 将一起更改的内容打包在一起 - 以确保每个更改仅影响一个服务
- 服务必须松散耦合 - 每个服务作为封装其实现的API。可以在不影响客户端的情况下更改实现
- 服务应该是可测试的
- 每项服务都小到足以由“两个披萨”团队开发,即一个6-10人的团队
- 拥有一项或多项服务的每个团队必须是自治的。团队必须能够与其他团队进行最少的协作来开发和部署他们的服务。
解决办法
定义与业务功能相对应的服务。业务功能是业务架构建模的概念。这是企业为了创造价值所做的事情。业务能力通常对应于业务对象,例如业务对象。
- 订单管理负责订单
- 客户管理负责客户
业务功能通常组织为多级层次结构。例如,企业应用程序可能具有顶级类别,例如产品/服务开发,产品/服务交付,需求生成等。
例子
在线商店的业务能力包括:
- 产品目录管理
- 库存管理
- 订单管理
- 交货管理
- ...
相应的微服务架构将具有与这些能力中的每一个相对应的服务。
最终结果
这种模式具有以下好处:
- 稳定的架构,因为业务能力相对稳定
- 开发团队跨职能,自主,有组织地提供业务价值而非技术特征
- 服务具有凝聚力和松散耦合
问题
有以下问题需要解决:
如何识别业务能力?识别业务能力和服务需要了解业务。通过分析组织的目的,结构,业务流程和专业领域来识别组织的业务能力。使用迭代过程可以最好地识别有界上下文。识别业务能力的良好起点是:
- 组织结构 - 组织内的不同组可能对应于业务功能或业务功能组。
- 高级域模型 - 业务功能通常对应于域对象
相关模式
子域模式分解是一种替代模式
原文链接
系统拆分之按业务进行拆分相关推荐
- 点餐业务服务拆分分析
我们有两种方式可以拆分服务,第一种我们的系统分为买家端和卖家端,你可以把vue放到app上,用来做买家端需要的接口,卖家端呢,也就是PC端,由freemark做的html页面作为另外一个边缘服务,两端 ...
- 微服务拆分:业务横向拆分和纵向拆分
大规模系统架构的设计一般原则就是尽可能地拆分,以达到更好的独立扩展与伸缩.更灵活的部署.更好的隔离和容错.更好的开发效率. 具体的拆分策略大体上可以分为横向拆分和纵向拆分. 总结: 纵向拆分主要从业务 ...
- 06|领域拆分:如何合理地拆分系统?
06|领域拆分:如何合理地拆分系统? 你好,我是徐长龙. 从这一章开始,我们一起看看怎么对数据一致性要求极高的系统做高并发改造.在这个章节中,我会以极具代表性的电商系统为例,对改造的技术关键点进行讲解 ...
- mysql数据库水平拆分例子_数据库水平拆分
数据库拆分 垂直拆分 数据库垂直拆分就是要把表按模块划分到不同数据库中.微服务架构中每个服务拥有自己独立的数据库,就是典型的垂直拆分.通俗说,就是根据业务类型,把一个数据库中的多张表拆分到多个数据库中 ...
- 写代码犹如写文章: “大师级程序员把系统当故事来讲,而不是当做程序来写” | 如何架构设计复杂业务系统? 如何写复杂业务代码?
写代码犹如写文章: "大师级程序员把系统当故事来讲,而不是当做程序来写" | 如何架构设计复杂业务系统? 如何写复杂业务代码? Kotlin 开发者社区 "大师级程序员把 ...
- Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组、split函数垂直拆分二维numpy数组
Python使用numpy函数vsplit垂直(行角度)拆分numpy数组(返回拆分后的numpy数组列表)实战:垂直拆分二维numpy数组.split函数垂直拆分二维numpy数组 目录
- Python使用numpy函数hsplit水平(按列)拆分numpy数组(返回拆分后的numpy数组列表)实战:水平(按列)拆分二维numpy数组、split函数水平(按列)拆分二维numpy数组
Python使用numpy函数hsplit水平(按列)拆分numpy数组(返回拆分后的numpy数组列表)实战:水平(按列)拆分二维numpy数组.split函数水平(按列)拆分二维numpy数组 目 ...
- java 开票金额拆分_关于开票尾差拆分凑整的算法问题
多个费项合计计算含税价与分别计算含税的合计不一致,存在尾差. 例如: 不含税税率含税价 费项15133.21 6%5441.2 费项22647976.26 6%2806854.84 费项3475247 ...
- diskgenius单文件专业版_金蝶KIS专业版系列——系统工具六(业务套打工具)
导读: (一)问一问 1.1.套打的作用 1.2.举例 (二)怎么进入套打设计器 2.1.入口1 2.2.入口2 (三)怎么使用套打设计器打开套打模板 3.1.打开系统标准套打模板 3.2.新建一个空 ...
最新文章
- python网上课程-python完整课程
- 【深度学习】PyTorch深度学习技术生态
- 《算法设计与分析基础》Chapt 2 算法效率分析基础
- C/C++ 进程的探索(fork函数)
- Scrapy框架学习(1)
- springboot项目启动rabbitmq报错org.springframework.amqp.AmqpIOException: java.io.IOException
- LOL(英雄联盟)提示不支持虚拟机登录,解决方法
- 关于微信小程序中uView中通过packer选择器修改表单无法触发form组件的表单验证的问题
- mysql之查询用户名
- 修复Mac上的“ Safari无法找到服务器”错误的解决方法
- 电脑W7系统怎样安装鸿蒙系统,真正纯净版的win7系统
- 《The Selfish Giant》
- 【转载】ASP.Net请求处理机制初步探索之旅 - Part 3 管道
- Round Roundup
- 从“半部电台”到“云监工” 天翼云助力红色电信启航新征程
- 什么是测试环境?如何搭建测试环境?
- (第二章)OpGL超级宝典学习:创建我们第一个OpenGL程序,绘制一个点和三角形
- android 实用代码
- 大二第二次月赛--买水果
- Zhong__Docker安装和简单使用