将系统分解为微服务的策略

几年前,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 NygardStefan Tilkov的观点。

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

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

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320887.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET Core微服务之基于Ocelot+IdentityServer实现统一验证与授权

一、案例结构总览这里,假设我们有两个客户端(一个Web网站,一个移动App),他们要使用系统,需要先向IdentityService进行Login以进行验证并获取Token,在IdentityService的验证过程中会访问数据库以…

CentOS安装使用.netcore极简教程(免费提供学习服务器)

本文目标是指引从未使用过Linux的.Neter,如何在CentOS7上安装.Net Core环境,以及部署.Net Core应用。 仅针对CentOS,其它Linux系统类似,命令环节稍加调整;需要提前准备好服务器地址、用户名、密码;如果手上…

ASP.NET Core MVC+EF Core从开发到部署

笔记本电脑装了双系统(Windows 10和Ubuntu16.04)快半年了,平时有时间就喜欢切换到Ubuntu系统下耍耍Linux,熟悉熟悉Linux命令、Shell脚本以及Linux下的各种应用的安装、配置、运行。使用下来的感受是Linux确实相当好使,…

网络流及建模专题(上)

前言 不断更新中…… 这几天新坑填不下去了,回来回顾一些经典的模型套路,先拿网络流开刀,窃以为洛谷这几道网络流的题目还是非常具有代表性的,涵盖了网络流调整、多解计数、最小割、最大权闭合子图问题。 还涵盖了图论&#xff0…

基于 websocket 实现的 im 实时通讯案例

分享利用 redis 订阅与发布特性,巧妙的现实高性能im系统。为表诚意,先贴源码地址:https://github.com/2881099/im下载源码后的运行方法:运行环境:.NETCore 2.1 redis-server 2.8下载Redis-x64-2.8.2402.zip&#xff0…

ACM/ICPC 比赛生涯总结+经验分享

ACM/ICPC 比赛生涯总结经验分享 1.获奖经历 时间比赛奖励大一下ACM陕西省赛打铁大一下CCCC团队二等奖大二下ACM/ICPC全国邀请赛银奖大二下CCCC团队特等奖大三上ACM/ICPC区域赛沈阳站铜奖大三上ACM/ICPC区域赛南宁站银奖大三上ACM/ICPC EC-Final上海铜奖大三下CCCC团队特等奖大…

NCC Meetup 2018 Shanghai 活动小结

NCC Meetup 2018 上海的活动于2018年6月30日在微软上海港汇办公室进行。原本计划30人规模的小型活动,结果收到了逾60人的报名,其中大部均来到现场参加了活动。本次活动得到了微软公司的场地支持,同时非常感谢 范亮先生、 刘浩杨先生和 邹嵩…

Asp.Net Core 使用Quartz基于界面画接口管理做定时任务

今天抽出一点点时间来造一个小轮子,是关于定时任务这块的。这篇文章主要从一下几点介绍:创建数据库管理表创建web项目引入quarzt nuget 包写具体配置操作,实现定时任务处理第一步:创建一个空web项目,引入quarzt nuget …

.NET Core微服务之服务间的调用方式(REST and RPC)

一、REST or RPC ?1.1 REST & RPC微服务之间的接口调用通常包含两个部分,序列化和通信协议。常见的序列化协议包括json、xml、hession、protobuf、thrift、text、bytes等;通信比较流行的是http、soap、websockect,RPC通常基于TCP实现&am…

【记忆化搜索】【dfs】【递归】Chocolate

Chocolate 题目大意: 有一块巧克力(每一个单位有一定的美味值),判断是否可以把他分为k块美味值相等的小巧克力 原题: 题目描述 Charlie 有一块巧克力。 这块巧克力是矩形的,有 n 行 m 列一共 n m 个大…

Nuget 多平台多目标快速自动打包

构建现代的 .Net 应用离不开 Nuget 的支持,而快速打包 Nuget 成了提高生产率的有效方法。1. 前置条件为了实现 Nuget 的快速打包,我们需要先解决一些前置依赖,无论是 .Net Framework、Mono 或者 .Net Standard(.Net Core&#xff…

Identity Server 4 - Hybrid Flow - 使用ABAC保护MVC客户端和API资源

这个系列文章介绍的是Identity Server 4 实施 OpenID Connect 的 Hybrid Flow. 保护MVC客户端: Identity Server 4 - Hybrid Flow - MVC客户端身份验证, Identity Server 4 - Hybrid Flow - Claims保护API资源(这里用到了RBAC: Role-based Access Control 基于角色的访问权限控…

【图论】【并查集】矩形(ssl 1222)

矩形 ssl 1222 题目大意: 有n个矩阵,现在将有重叠部分的两个矩阵合并成一个图形,问有多少个图形 原题: 题目描述 在一个平面上有n个矩形。每个矩形的边都平行于坐标轴并且都具有值为整数的顶点。我们用如下的方式来定义块。…

Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一)

图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图。那么如何在Asp.Net Core Web Api实现图片上传存储以及生成缩略图呢?今天我就使用MongoDB作为图片存储,然后使用SixLabors作为图片处理,通过一个As…

FFT算法学习笔记

写在前边 1.辣鸡RRRR_wys之前csdn的博客,千年不更。。。还很水。。。于是开了这个Blog。。。妄图拯救一下自己 2.最近接触了一些多项式理论。于是翘掉了愉快的高频自控,通过《算导》稍稍学习了一下 3.算法竞赛中,FFT主要解决多项式的乘法等问…

System.IO.Pipelines: .NET高性能IO

本文翻译自dotnet团队博客文章:https://blogs.msdn.microsoft.com/dotnet/2018/07/09/system-io-pipelines-high-performance-io-in-net/ System.IO.Pipelines是一个新的库,旨在简化在.NET中执行高性能IO的过程。它是一个依赖.NET Standard的库&#xff…

.NET+PostgreSQL实践与避坑指南

简介.NETPostgreSQL(简称PG)这个组合我已经用了蛮长的一段时间,感觉还是挺不错的。不过大多数人说起.NET平台,还是会想起跟它“原汁原味”配套的Microsoft SQL Server(简称MSSQL),其实没有MSSQL也没有任何问题,甚至没有Windows Se…

Jimu : .Net Core 分布式微服务框架介绍

一、前言近些年一直浸淫在 .Net 平台做企业应用开发,用过的 .Net 框架不多(具体数量不清,印象深刻的有 Asp.Net MVC,WPF,其他很多都是基于微软开发的框架做些封装而形成新的框架,大都是还没起好名就湮灭在历…

.NetCore2.1 WebAPI 根据swagger.json自动生成客户端代码

前言上一篇博客中我们可以得知通过Swagger插件可以很方便的提供给接口开发者在线调试,但是实际上Swagger附带的功能还有很多,比如使用NSwag生成客户端调用代码,进一步解放接口开发者。NSwag NSwag是一个发布在GitHub上的开源项目,…

使用.NetCore 控制台演示 熔断 降级(polly)

1、熔断降级的概念: 熔断:我这里有一根长度一米的钢铁,钢铁的熔点1000度(假设),现在我想用力把这根钢铁折弯,但是人的力有限达不到折弯的点,然后我使用火给钢铁加热,每隔…