几年前,Vladik Khononov和他的团队决定开始使用微服务,但是几个月后他们发现自己陷入了巨大的混乱之中。他在最近于伦敦Skills Matter举行的DDD eXchange 2018会议上指出,造成这一现象的原因在于,他们只专注于采用酷炫的新技术,而没有关注更加基础的东西,比如模块化以及如何实现模块化。他们在serverless框架、平台和消息机制上投入了精力,但是在 思考如何将系统分解为微服务方面却思考很少,换句话说,也就是如何寻找边界并将不同的功能按照边界进行划分。

Khononov是Internovus的CTO,对他和他的团队来说,起始的信条就是服务越小,它就会越好。这直接导致他们构建了一个分布式单体结构(distributed monolith),在接下来的几年中,他们一直试图摆脱这些微小的服务并且评估了不同的分解策略。

限界上下文(Bounded context)

Khononov指出通用语言(ubiquitous language)在领域驱动设计(Domain-Driven Design,DDD)中是基础实践,该实践的一种实现方式就是以领域专家的语言与他们进行对话。有时候,你会发现对于相同的业务概念,他们会有不同的心智模型,或者使用相同的术语描述不同的理念,如果这样的话,就预示着这些理念属于不同的限界上下文。从一开始,Khononov和他的团队就使用这些方法来发现定义服务的边界,每个边界内都会成为一个服务。他指出,这些服务代表了很广泛的业务领域,有时候会导致一个限界上下文涵盖多个业务子域。

业务子域

下一步,他们使用这些业务子域作为边界,然后为每个业务子域创建一个服务。在Khononov的经验中,子域和服务之间建立一对一的关系是DDD社区非常常见的方式,但是他们并没有满足于此,而是继续努力实现更小的服务。

业务实体

深入研究子域,他们发现了业务实体和流程,然后他们将其抽取到单独的服务中。开始的时候,这种终极方式失败得很惨,但是Khononov指出在随后的项目中,它取得了更大的成功。

就这三种策略来说,Khononov指出,使用限界上下文能够帮助他们找到最大的有效单体边界,然而,尽管它是一个可行的工作模型,但是他认为这种方式并没有很好地匹配微服务的理念。在业务子域和实体间选择的时候,他认为最好的分解等级依赖于正在构建的系统及其用例。他强调,微服务的理念实际上并不是关于单个服务内部如何实现的,而是关于服务之间如何交合和耦合的。

系统分解为微服务的阈值是由微服务所属的用例来定义的。

Khononov还没有找到一种简单的方式来评估一个系统的设计,但是他相信现在已经有了足够多的启发式设计准则,帮助我们将系统分解为微服务。他认为最有用的几项包括:

  • 始终分解至限界上下文等级。除非你有充分的理由,否则不要进一步分解。分布式系统有它们自己所面临的挑战。

  • 核心子域是公司挣钱的区域。在进行分解时,确保获取领域的知识并具有恰当的子域。

  • 购买或采用通用子域。它们已经解决了一些问题了,如果自己实现的话,是没有竞争优势的。

  • 为了支持核心域,我们需要支持子域,但是这不会增加任何的竞争性优势。它们通常非常稳定和简单,在早期阶段就可以进行进一步的分解,直至使其成为实体服务。

  • 采用一致性的需求,帮助我们寻找必须放到同一个服务中的函数或方法。

  • 确保事件是显式和自描述的。考虑在一个服务中,使用私有事件作为实现细节,而将更为严格的公共事件作为服务的公开接口。

  • 寻找按照相同频率进行变化的服务,它们可能能够进行合并以减低复杂性。

  • 评估每个服务的接口。如果觉得服务范围太广的话,那么它可能能够拆分为更小的服务,主要站在集成方面,重新考虑评估边界以简化整个系统的设计。

Khononov在总结中指出,随着系统中服务的平均规模变得越来越小,你将会从一个大泥球般的单体系统,通过限界上下文实现相对较大的服务,进而转化为微服务。但是,他强调,如果你继续让服务变得更小的话,那么最终将会形成一个分布式的大泥球。

实体服务有时被称为反模式,参见Michael Nygard和Stefan Tilkov的观点。

原文地址:http://www.infoq.com/cn/news/2018/07/decomposing-system-microservices

.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

将系统分解为微服务的策略相关推荐

  1. 微服务拆分策略和原则

    目录 微服务拆分目的 单体应用拆分成微服务的时机 拆分时指导原则 拆分的粒度把控 微服务拆分策略 微服务合并 拆分过程中要注意事项 注意:本文参考  微服务拆分策略和原则 - 简书 微服务拆分目的 不 ...

  2. 微服务实战(六):选择微服务部署策略

    http://dockone.io/article/1066 微服务实战(六):选择微服务部署策略 [编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺 ...

  3. 从零开始搭建系统3.2——微服务注册中心开发及部署

    从零开始搭建系统3.2--微服务注册中心开发及部署 转载于:https://www.cnblogs.com/provence666/p/8638586.html

  4. 微服务实践(六):选择微服务部署策略

    [编者的话]这篇博客是用微服务建应用的第六篇,第一篇介绍了微服务架构模板,并且讨论了使用微服务的优缺点.随后的文章讨论了微服务不同方面:使用API网关,进程间通讯,服务发现和事件驱动数据管理.这篇文章 ...

  5. Go微服务架构实战 中篇:6. 微服务治理策略

    Go微服务架构实战-[公粽号:堆栈future] Go微服务架构实战目录 1. 微服务架构上篇 1. grpc技术介绍 2. grpc+protobuf+网关实战 3. etcd技术介绍 4. 基于e ...

  6. 领课教育系统 - 开源的微服务分布式在线教育系统

    领课教育系统(roncoo-education)是基于领课网络多年的在线教育平台开发和运营经验打造出来的产品,致力于打造一个各行业都适用的分布式在线教育系统.系统采用前后端分离模式,前台采用vue.j ...

  7. JAVA Mall 项目致力于打造一个完整的电商系统,采用微服务架构设计

    项目介绍 mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现,采用Docker容器化部署.前台商城系统包含首页门户.商品推荐.商品搜索.商品展示. ...

  8. 微服务分布式事务处理

    当我们向微服务架构迁移时,如何处理好分布式事务是必须考虑的问题.这篇文章介绍了分布式事务处理的两种方案,可以结合实际采用合适的解决方案.原文:Handling Distributed Transact ...

  9. 单体系统如何拆分为微服务

    当单体系统越来越大,并难于维护时,很多企业开始有意把单体系统拆分为微服务风格架构.这么做很有意义,但不容易.要做好这件事情我们必须学习,我们从一个简单的服务开始,另一方面拉出以垂直功能为基础的服务,这 ...

最新文章

  1. 图片转注释python代码(转)
  2. 转载:https://blog.csdn.net/dcrmg/article/details/52939318
  3. linux tcp server开源,GitHub - 06linux/cellnet: 高性能,简单,方便的开源服务器网络库...
  4. 【手写数字识别】基于matlab GUI贝叶斯+线性分类器手写数字识别【含Matlab源码 828期】
  5. html swf格式转换器,蒲公英SWF格式转换器
  6. 宏晶STC单片机使用STC-ISP串口烧录失败的解决方法及实例汇总 (Ver0.99.15)
  7. 别做正常的傻瓜---奚恺元 随记2017-12-6周三
  8. html生成文字乱码,html中文为什么会乱码?html中文乱码怎么解决?
  9. Spring注解开发配置
  10. 在CentOS 7 安装Calamari
  11. Primeng修改组件样式
  12. 商贸零售行业2021年投资策略:市场下沉、渠道效率升级,新品牌新业态乘风而起
  13. LyX使用小记之三 公式编辑
  14. HashMap的链表结构
  15. Windows下如何快速查看并导出系统详细信息(计算机名、操作系统、系统制造商、系统型号、BIOS、CPU及内存大小)
  16. 并查集——NUIST OJ P1648 炼丹术为例
  17. 谁是消费金融场景之王?
  18. miui9支持android,MIUI9详细体验:最好用Android不是吹的!
  19. 编译原理 | 第一章课后习题答案
  20. Q for Mortals2笔记 -- 原子数据类型

热门文章

  1. 给Web开发人员的以太坊入坑指南
  2. ThinkPHP多次重复提交问题的根源
  3. 《互联网+流通——F2R助力传统产业创新与转型》一一第1章 “互联网+”的新时代...
  4. 《Java线程与并发编程实践》—— 2.3 谨防活跃性问题
  5. 巧合?模仿还是抄袭?水木年华的《秋日恋歌》和Lube 乐队的《Pozovi Menya Tiho Po Imeni》...
  6. GeneralUpdate20220323里程碑版本发布
  7. WTMPlus 1.4 Uniapp来了
  8. 到底该不该使用存储过程
  9. .NET GC 实时监控工具 dotnet gcmon 介绍
  10. 谷歌开源3D舞蹈生成模型FACT,舞姿清奇!