范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

对领域模型和上下文边界分析来划分微服务的再思考

  在我前面关于中台和微服务架构规划方面的文章中,实际已经谈到基于企业架构规划并结合CRUD分析的思路来进行微服务模块的识别和拆分。很多人会认为这是一个偏传统的结构化的分析建模思想,而不是面向对象分析的思路。
  而今天当重新再回顾领域建模,子领域拆分和上下文边界划分的时候,再次看到实际前面谈到的企业架构和CRUD方法是有效的。在领域模型分析中,经常会用到的就是通过子领域的划分,通过上下文界限的划分来拆分微服务。
  因此今天还是重新对这个方法进行回顾和思考。领域模型和上下文边界
  在领域模型和领域驱动设计下首先要理解领域的概念,简单来说领域可以理解我们传统软件需求分析中的业务场景对应的业务域,每一个领域又可以分为问题域和解决方案域。
  领域驱动设计本身就是要完成从问题域到解决方案域的映射和抽象。而这个映射和抽象可以理解为领域分析的一个关键内容。
  领域本身分为了领域和子领域,而这些都属于问题域。而上下文边界划分则可以理解为解决方案域的一个关键内容。在领域驱动设计中首先要完成的就是上下文边界的划分,这本身符合我们传统软件分析设计方法中的子系统或组件划分思路。
  限界上下文定义了领域模型的边界,应该在团队组织、应用中特定部分的使用、代码库和数据库模式等物理表达等方面显式地设定边界。限界上下文的目的就是理清子域,然后区分这些子域那些是核心域、支撑子域和通用子域。一个领域模型涵盖了核心域、子域和限界上下文,其中核心域、子域也可以表达为一个子领域模型,这样一层层嵌套下去。
  微服务和界限上下文
  在前面已经谈到,可以将界限上下文对应到具体的微服务,微服务拆分的最小粒度就是界限上下文,但是多个界限上下文可以合并到一个微服务。
  那么界限上下文划分完成后,每个上下文边界里面应该包括哪些核心内容?简单来说至少应该包括三个方面的内容,即:功能:哪些业务功能要划分到该边界里面对象:领域对象划分,每个对象的Owner是哪个接口:对外暴露的接口能力
  当这些都基本定下来后,可以看到单个界限上下文是可以分配到独立的开发团队来完成的。即每个界限上下文从代码库,编译构建,数据库,开发,测试,部署,包括后续的运维都可以做到完全的独立。这个和单体到微服务拆分思想是一致的。通过事件风暴来划分上下文
  事件风暴是一项团队活动,领域专家与项目团队通过头脑风暴的形式,罗列出领域中所有的领域事件,整合之后形成最终的领域事件集合,然后对每一个事件,标注出导致该事件的命令,再为每一个事件标注出命令发起方的角色。
  命令可以是用户发起,也可以是第三方系统调用或者定时器触发等,最后对事件进行分类,整理出实体、聚合、聚合根以及限界上下文。
  在整个事件风暴方法中,有三个关键要素如下:事件 -> 某个动作的结果命令 -> 某个动作实体 -> 命令的触发者
  而整个分析流程可以简单总结为:
  首先是基于业务分析来识别关于的事件,同时识别和梳理出事件对应的命令,在事件和命令中都会附带有对应的领域对象和实体,因此进一步基于对象实体进行命令和事件的聚合。在完成聚合后再进一步梳理和划分上下文界限。
  网上有篇文章举了一个完整的例子大家可以参考:
  https://www.jianshu.com/p/96801c93a47d
  其中关键的三个步骤如下。
  识别事件和命令
  事件你可以理解为一个事物所编写出来的最终状态,例如订单已创建,支付已完成,商品已发货等即是关键的事件。而命令可以理解为具体的业务功能或操作,比如创建订单,检索商品,扣减库存等。
  可以看到事件和命令的识别和分析中,都可以识别到具体的领域对象。
  基于领域对象进行聚合
  如何进行聚合?简单来说仍然是通过识别和梳理出来的共性领域对象进行聚合。将对同一领域对象的所有命令和事件都聚合在一期。
  进行上下文边界的划分
  基于聚合完成的情况进行上下文边界的划分,这里实际上不同的领域对象如果属于同一个大类的业务场景,仍然是可以划分到一个上下文里面的。
  也就是不是简单的按聚合完成的领域对象划分上下文边界,很多和核心领域对象相关的附属对象也需要划分到同一个上下文的。
  比如电商里面的订单是一个大量的领域对象,可以划分为独立的上下文,但是对应购物车也是我们识别的对象,购物车本身同样属于产品订购场景,订单的扩展附属对象,因此需要将购物车也划分到订单上下文里面。
  对事件风暴方法的思考
  前面介绍了事件风暴方法,我简单说下我的结论,即对于全新的业务领域,或者架构人员原来没有接触过的领域,采用这种方法来进行上下文和边界划分完全行不通。特别是全新业务领域,本身整个业务流程,业务场景,业务模型又很复杂,关联依赖又很多的情况下更是很难采用。
  具体我想分析以下几个点。
  对非熟悉领域,事件风暴方法第一步就去识别事件的方法是是不科学的。事件本身是实体的状态,要识别事件首先就是要识别领域对象实体,而要识别实体本身又要要进行业务流程分析,通过业务流程分解到业务活动,通过业务活动识别业务操作命令,再来分析具体的实体对象。
  其次,该方法识别的事件,命令很可能不完整,无法覆盖完整的业务场景和流程。基于上面方法会导致一个错觉,即事件识别出来后简单的从事件来识别命令,这很容易到命令事件一对一的关系。举例来说订单已取消是一个事件,但是对应的命令不是简单的取消订单。取消订单有很多场景出现,比如用户自己取消订单,管理员取消订单,超时未支付系统自动取消订单。这些都会触发订单已取消的事件。
  第三按领域对象进聚合比较容易,但是聚合完成后不是每个领域对象就是一个上下文,即哪些领域对象应该整合到一起,划分到一个大的上下文里面。实际上在当前事件风暴公布的方法里面对这块并没有明确的描述。
  比如用户和会员是两个领域对象实体,那么用户和会员这两个聚合点是否应该划分到一个上下文边界里面,还是说分为两个上下文边界?具体的判断方法和准则是如何的?实际上对于事件风暴分析方法是无法给出明确思路的。而在传统方法里面我们往往是通过CRUD方法进行详细的耦合性和依赖分析,最终才能够确认是拆分还是合并。围绕核心领域展开
  对于领域模型中的领域可以分为核心域,支撑域和通用域,而对于支撑域和通用域都可以理解为对核心域业务流程执行的关键支撑。
  也就是说你将核心域关于业务梳理清楚,那么支撑域自然也就出来了。
  比如对于资产管理系统,核心域就是资产,所有业务全部围绕资产的全生命周期管理展开。而回到一个电商平台,核心域即订单,要给电商就是用户在网上下单,最终完成接收确认的闭环流程。
  基于这个思路回到电商平台,首要的分析思路仍然应该是找到核心域,再进行核心域进行全生命周期阶段展开,这个是识别大阶段和微服务划分的关键点。往往比单纯的事件风暴后,再聚合更加有效。比如电商核心业务场景和订单生命周期如下。
  当你对核心领域对象的生命周期阶段梳理清楚后,实际上已经可以明确的识别出关键的上下文边界和关键的领域对象。比如上图可以看到商品,订单,供应商,用户,库存都是关键的领域对象,相关的业务操作也围绕这些业务对象展开。
  也正是这个原因,我们强调要进行领域建模或微服务拆分,首先还是要熟悉你当前面对的业务领域,将关键的业务流程和业务对象全部搞清楚,这是进行详细的领域建模或微服务拆分的基础。
  一个好的最佳实践可以告诉你相同业务场景下面对相似的问题如何解决?但是一个好的方法论一定是告诉你当你面对一个全新的业务场景或未知领域的时候,如何去独立分析和解决问题。
  其次,还要强调一点。
  一个方法对于简单业务领域或场景有效,并不代表对复杂领域同样有效。同时对于简单领域有效的方法论你会发现,即使不用方法论的方法你同样可以很好的解决问题。
  而对于事件风暴的方法,实际上没有很好的解决上面的问题,即复杂的业务场景无法解决。简单的业务场景不用事件风暴也同样可以解决。事件驱动到命令驱动
  在事件风暴里面可以看到,核心是首先识别关键事件,该方法的一个指导思想就是不论你前端的业务流程或活动如何变,事件本身相对式最稳定的。但是却忽略了对于未知领域实际很难一开始就马上识别出关键的领域事件。
  但是对于事件风暴方法仍然可以有很多借鉴的地方,比如命令事件和实体三要素,比如基于实体进行的聚合操作等。
  对于一个全新的业务领域,最好的方法仍然是按部就班的基于业务流程和场景分析来梳理关键的业务活动,或者说基于面向对象的用例分析设计思路来进行。从事件驱动转到命令驱动的方式来进行分析和建模。
  命令驱动本质仍然是业务和用例驱动。
  即在进行业务流程和场景分析后,到了最底层即前面谈到的命令,命令更加类似于传统用例分析方法里面的用例建模,也类似于Scrum敏捷方法论里面的用户故事。
  但是这个粒度可能比命令粒度大,那么可以进一步拆分。用例到用例点的展开从用户故事到具体业务操作的展开
  最终我们形成的是所有业务操作或命令的合集,比如提交订单,取消订单,评价商品,查看物流状态,确认收到商品等。
  业务操作点最好是如上的标准动宾结构。
  动词(业务操作)+ 宾语(实体对象)
  从这个可以明确的看到一个业务命令实际包括了业务功能操作和业务对象实体两个方面的内容,而在前面进行上下文和微服务划分的时候就强调,最终拆分的微服务必须要进行边界确认的就是两个关键点。
  其一是业务功能是划分边界,其二是数据库表的Owner边界。一个经过拆分后的命令实际上同时涉及到两个方面的内容,但是并不代表业务功能和实体都属于同一个微服务或上下文。
  我们来举例说明下:
  比如原来的用例是用户提交订单,这个是要给独立的用例,经过分析还需要进一步拆分到具体的业务操作或关键用例点,那么就对该用户进一步拆分。
  提交订单-》(01新增订单, 02冻结库存)
  对于冻结库存是一个细化后的命令,但是该业务功能操作在订单中心完成,但是实际操作的实体对象则属于库存中心。即业务功能操作和业务对象本身是分离的。
  经过分析后可以得到命令和中心间的引用依赖图,如下:
  在我构建这个图的时候,完整的方法论思路还不足够体系,但是该图至少解决了两个关键的问题点,其一是命令包括的两个部分业务功能操作和实体对象分离,更加容易进行微服务划分,比如前面谈到的冻结库存,业务功能在订单微服务,但是库存对象在库存微服务。其二是基于业务功能场景的业务操作和底层的数据或业务服务能力分离,即更加容易去按SOA服务分层的方式去思考如果构建对外共性可复用能力。
  当上面这个图思考清楚后,实际你可以看到多个微服务之间的关键接口交互,或者说某个微服务究竟应该暴露哪些能力接口出来也清楚了。
  而简单的基于前面谈到的事件风暴方法并不有利于我们梳理微服务间的交互和集成关系,进而进一步的识别和定位API接口服务。
  再对上面谈的思路和方法进行总结,就是:
  首先基于你面对的业务场景分析核心域和核心领域对象的生命周期阶段,这个已经足够划分出关键的上下文和微服务边界,其次基于业务拆分细化分析详细的命令或叫业务功能操作,确定每一个业务功能操作的边界和数据交互边界。
  通过以上分析,我们基本完成微服务架构阶段三个关键输出。具体包含哪些业务功能实现
  该微服务为Owner的数据库表
  该微服务需要暴露哪些API接口能力
  以上三方面梳理清楚,基本就可以转到独立开发团队承接该微服务。从用例到操作点的细化分析
  当我们在谈用例或命令的时候可以看到,该用例是有明确业务含义并能够被用户所理解的一个概念,比如提交订单,付款订单等。
  但是任何一个用例的实现实际上又有一个细化的流程,在软件需求用例建模的时候可以看到一个完整的用例分析包括了业务基本流,扩展流,业务规则。当分析到具体的扩展流和业务规则的时候,你会发现更多细粒度的命令点或业务操作点。
  在早期我们进行SOA架构规划咨询项目的时候,往往就会基于业务流程的思路对详细的用例和用例操作点进行分析,在分析的过程中你就会发现一个订单系统中的业务用例点往往会出现会其他领域的领域对象之间的关联和引用依赖关系。
  如果按照前面谈到命令应该基于业务实现逻辑进行进一步的子命令的拆分,那么整体的构建逻辑就如下图的方式进行展开。
  也就是说如果仅仅是简单的分析到用例层级,那么很多内部的业务规则,扩展流,外部依赖点是无法发现的。因此用例应该进一步展开到上图方式的用例点,对于每个用例点仍然可以保留动宾结构来进行定义和描述。从领域对象到数据建模
  在领域建模和分析思路里面是领域对象,偏面向对象的分析思路。而在传统的结构化分析方法是构建概念模型,逻辑模型和物理模型。
  一个领域对象往往涉及到多个数据对象,一个数据对象本身又涉及到多张数据库表。
  比如对于用户这个领域对象,实际上涉及到用户基本信息,用户地址信息,用户银行账号信息,用户会员等级信息,用户记录变更历史信息等,所有的信息都围绕用户基本信息展开。
  以上所有扩展信息表现出一个关键点。
  即当用户基本信息不存在,或该用户消亡后,所有的扩展信息都不再存在。这和我们在进行领域建模的时候强调的实体对象和值对象差异分析的思路是一致的。
  对于商品信息也是同样的道理,比如商品包括了商品基本信息,详细规格参数信息,商品评论信息,商品可选规格型号SKU扩展信息等。这些信息同样是围绕商品主信息而存在,具备同样的数据生命周期。
  比如对于上面场景进行初步数据架构分析如下:
  在完成的数据架构分析你会看到存在聚合根,可以基于聚合根节点进行拆分。这个也是我们谈的数据库拆分的基础。
  而数据聚合根要给最大的特点就是将数据模型中的数据对象按类似上下文边界的方法分域后,你会看到各个域之间是很明确的单线连接关系。即按单线连接处剪开,那么形成多片完整的树叶结构。每片树叶仍然是一个完整的子树结构。
  所以不管是领域建模还是传统结构化分析思路都可以看到,最终还是殊途同归,核心不是简单的拆分,而是在拆分后的聚合,同时对于聚合后的内容划域。
  以上是个人对微服务拆分的一些点滴思考,还不完善供参考。

蓝盈莹感情失意,事业得意,爱情能否长久,和事业息息相关?以前,我一直以为相爱的人是可以走到最后的以为时间和距离不能成为恋人之间的阻碍但后来才发现,这世间,不是所有的相遇都恰逢其时,也不是所有的爱情都能开花结果在这熙熙攘攘的人群里,即便是再爱,也不要对错误的感情留恋,她的雷厉风行,成了爱情里的典范若你没有很好的家庭背景,你选择脚踏实地的努力还是自怨自艾若你被父亲抛弃,只能和母亲相依为命时,你选择憎恨还是感恩当你没有别人家的孩子有优势的时候,你选择创造属于自己的精彩还是一味的四年感情,四小时结束,毛晓彤看似神仙爱情,为何说分手就分手?张国荣说如果你觉得很累,及时道别并没有错。我正在放弃你,很慢,但很坚定。爱情就像是塔罗牌,有恶魔,也有太阳。而爱情除了会给你带来幸福感动陪伴,还会带来难过奔溃怀疑背叛。真爱难遇,小这对昔日恩爱情侣用亲身经历告诉你爱得再深,也不代表是对的人时有女子里这样一句话我一生渴望被收藏好,妥善安放,细心保存,免我惊,免我苦,免我四下流离,免我无枝可依。这或许就是我们一生都在寻寻觅觅渴望爱情的原因,因为只有真正爱你的人,才能细心经历多段感情至今单身,54岁周海媚被催婚?人到中年就该结婚?时有女子里有这样一句话我一生渴望被收藏好,妥善安放,细心保存,免我惊,免我苦,免我四下流离,免我无枝可依。或许每个人都想过有一个人,可以永远的成为自己的依靠,一起同甘共苦,相濡以沫分手才知他们相爱过再好的感情,也经不起这样的折腾惊艳你一时,温暖不了一世。听歌时,总是喜欢一边听歌一边看看热评,同一首歌千千万万的故事,就像同一款酒喝的人的心情不同,味道也会不同。安和桥中有一句歌词你是一位没有故事的女同学。我相张檬这个一手好牌打稀巴烂的女人,在人生里傻了三件事,值得深思杨天真在脱口秀大会传递过这样一个价值观女孩不要被标准化定义,不存在标准的美和丑,每个女孩都有自己闪亮的地方,自己喜欢自己就可以了,不用他们喜欢你,他们谁呀!22岁的杨天真早早就明白赵丽颖的成功,既不靠男人,也不是偶然,而是源于这一点说起娱乐圈的当红花旦,那一定非赵丽颖莫属。这些年,她一直活跃在荧屏,电影,综艺,电视剧,她都尝试了个遍。婚姻,爱情,事业,她都经营得一帆风顺,可以说,是妥妥的人生赢家。近日,工作室当你不会做饭的女朋友中第一次下厨,能做出多么惊人的黑暗料理?从小砖家就觉得会做饭的人都是很厉害的,色,香,味,俱全才能称的上是成功的菜,但是每个人第一次做饭的时候都是惨不忍睹的,做出的东西自己都不敢吃,今天砖家为大家带来的是当你的女朋友第一16年友情,4年婚姻,她嫁给朋友真的是嫁给爱情了吗?张爱玲在半生缘里写道不管你的条件有多差,总会有个人爱你。不管你的条件有多好,也总有个人不爱你。这就是现实的爱情,爱或不爱,都是世间常态。人生,最重要的事大概有两件,一是努力活着,二喜欢看韩剧的朋友们,知道为什么韩国演员演技很少有人诟病吗?韩国明星十三四岁就会开始练习生的苦难生涯,从身材样貌表情管理上雕琢外形,从唱歌跳舞表演台风采访等各方面加深训练,差不多可以的时候出道,到一定年纪就会着力找资源让明星转型,比如从舞台
谁说孙怡不会演戏,全靠老公上位婆婆扶持?被这部剧打脸了集言情穿越权谋为一体的古装剧今夕何夕,以7。0分获得观众好评。水墨元素与古装撞到一起,竟如此之美,画面唯美仙气飘飘令人赏心悦目。在这样的背景下,孙怡也将冬月赋予了仙气。首次出演古装拒绝困难户们,试试杨天真这招?拒绝这门学问,杨天真绝对是老艺术家。室友喊你帮她取快递,本周第6次。明明楼下就有快递柜和便利店提供代收服务同事又来拼单奶茶,经验告诉你,这次他依旧不会给钱想拒绝,又开不了口,总有人两女子溺亡水库我为你雪中送炭,你害我家破人亡远离朋友圈这5种人。写过很多情感话题,关于夫妻关系和亲子关系,很少写到朋友关系。今天写一篇。从一起刚刚发生的悲剧谈起。10月21日,江苏省南京市溧水区无想寺水库,两名女子跌落水中,副市长的女婿性侵杀人,背后故事催泪剜心守护不屈的小人物这个时代还会好吗?会的,我相信一定会的。因为有很多倔强的小人物。1。hr国庆长假和中秋佳节,迈着六亲不认的步伐走来了。我知道很多人都没心上班了,一天24小时掐着手指头,算什么时候十张钧甯独处是了解自己最佳途径十月中旬,我们在秋雨过后的上海见到了张钧甯。伴着窗外淅沥的雨声,她和我们分享了她这一年的私享时间。张钧甯的名字很难写,也经常有人念错。这是妈妈为她起的名字,甯(nng)是心灵平静的减肥不一定要饿肚子!10种吃饱还能瘦的食物排行榜快收下认真减过肥的人都知道,想瘦,没有不饿肚子的。很多人的一天可能是这样的早餐中餐晚餐但只要过了晚上9点,完全放弃抵抗夜宵点起来因为总是饿肚子,很多人的减肥计划就会陷入饿着暴食饿着的奇怪大张伟随便一张口都是百万级别的文案犀利的大老师又双叒叕出金句了!前段时间,大张伟在节目中分享自己的爱情观和看法,表示冷酷的人之所以一直冷酷,是因为没有碰见他喜欢的人!顽皮外表下藏着浪漫的灵魂,不愧是人间精品大老师!90后自驾西藏捡500多袋垃圾!背后藏着的残忍真相令人唏嘘相信不少朋友在假期旅途中,一路看到的可能是人山人海也可能是大美风光。说到旅途中看到的风景,有的人可能还会看到垃圾遍地。就在前不久,就有一条这样的热搜小伙自驾游西藏一路捡了500多袋切胃2个月后,杨天真当众扎针糖尿病正在威胁1。14亿中国人切胃手术2个月后,明星经纪人杨天真在社交平台分享了一段有点吓人的视频只见她咬住牙关紧闭双眼,用仪器往自己手指扎出一个小洞,顿时鲜血直流她不是有自虐倾向,她只是在检测血糖。杨天真说,凭借美食出圈的地名,你能说出来几个?在吃货眼里放眼各地全国皆可食用想要记住地方名字有多简单?当然靠美食不知道大家有没有过这样的经历如果有人跟你说起一个地名有时可能会觉得很陌生但要是以地名食物(例如扬州炒饭)的方式说起看脸的时代,什么才是美?这是个看脸的时代对吗?虽然不想承认,但答案似乎是肯定的。赵薇在国内第一部女性独白剧听见她说中首次作出了对这个问题的回答。她说这说法不对,不够全面。因为不光要看脸,还要看胸看腰看屁股