建模:确定服务的边界——《微服务设计》读书笔记

什么样的服务才是好的服务?

高内聚、松耦合的服务才是好的服务。简而言之,就是把相关性强的放在一起,相关性不强的分开,物以类聚,人以群分,服务的划分也是这样。这就需要确定什么要放在一起,什么是要分开的,这个寻找的过程就是确定服务边界的过程。

限界上下文

限界上下文确定了这个边界内它所承担的职责。

Evans在《领域驱动设计》中作喻:细胞之所以会存在,是因为细胞膜定义了什么在细胞内,什么在细胞外,并且确定了什么物质可以通过细胞。这是限界上下文的绝好比喻。

任何一个给定的领域都包含多个限界上下文。限界上下文中包含了一些内容(或者叫模型),它们的相关性较高,一部分需要与外部通信,一部分不需要与外部通信,每个限界上下文都有明确的接口,该接口决定了它会暴露哪些模型给其他的上下文。外部想与限界上下文通信,需要使用模型和它的显式限界(接口)进行通信。这样做可以得到高内聚,从而很好地形成组合限界。

限界与限界之间,也会存在共享模型,如下所示,仓库和财务都需要库存信息,但不能把仓库所有的库存信息都给财务,因为有些信息对于财务是并没有用的,同时也不能让财务伸到仓库内部去取数据,这样有可能会破坏限界上下文的完整性,因此,我们提供了一个共享模型——库存项。

这些模块限界就可以成为绝佳的微服务候选,一般来说,微服务应清晰地和限界上下文保持一致。

如何确定限界上下文

    1.推荐使用领域来表分解限界上下文

如果把系统分解成为限界上下文来表示领域的话,那么对于某个功能所做的修改,就更倾向于在一个单独的微服务限界之内。另外,服务之间应该共享相同的术语,也应该反映到服务的接口上。

2.应从限界上下文提供的功能来考虑,而不是数据

只考虑数据和模型,不考虑上下文的功能,很容易导致“贫血”,所以要先问“这个上下文是做什么用的“,再考虑它”需要什么样的数据“。

3.不要过早划分上下文

对于一个新系统而言,可以先使用一段时间的单块系统,因为如果服务之间的限界搞错了,后面修复的代价就会很大,所以最好能够等到系统稳定下来之后,再确定把哪些东西作为一个服务划分出去。

4.不要排斥嵌套上下文

一开始,你会识别一些粗粒度的限界上下文,而这些限界上下文可能又包含一些嵌套的限界上下文。如下所示:使用这些嵌套的上下文不直接对外可见,对于外界来说,它们用的还是仓库的功能,但发出的请求其实被透明地映射到了两个或更多有服务上。

当然,根据每个团队的情况不同,我们也可以将仓库的内的上下文再隔离出来,如下所示:

  5.谨慎根据技术边界来确定上下文

一般而言,我们建议按照业务的垂直划分来建立上下文,而不是按照技术的分层来确定上下文,比如,你如果将DAO、BLL、UI层分成3个不同的服务,那么当你需要变更业务的时候,你需要频繁地同时修改两个服务,这样显然是不合理的。但也不是说这样划分总是不合理,如果一个组织想达到某个性能目标,这样划分反而更合理。

参考

《微服务设计》(Sam Newman 著 / 崔力强 张骏 译)

时间: 2024-10-13 01:05:34

建模:确定服务的边界——《微服务设计》读书笔记的相关文章

Chris Richardson微服务翻译:微服务介绍

作者简介:Chris Richardson,世界著名的软件架构师,经典著作<POJOS IN ACTION>的作者,cloudfoundry.com 的创始人 微服务目前正受到大量的关注,成为文章.博客.会议讨论的热点.与此同时,也有人质疑微服务并非新事物,只是SOA(Service Oriented Architecure)的二度封装.无论是追捧还是质疑,微服务架构拥有巨大的优势,尤其是让敏捷开发和复杂的企业应用支付成为可能. 本系列包含7篇文章,介绍了微服务架构的各个因素,了解微服务模型的

JHipster创建微服务及相关微服务架构组件介绍

参考链接: jhipster官网 jdl官方语法文档 JHipster中文文档-CSND博客 在线使用jhipster创建应用 在线使用jdl生成器创建数据表和相应服务端代码 一.创建微服务 微服务是一种JHipster应用程序,它没有前端(必须在网关)上生成Angular前端),并且可以与JHipster Registry一起配置,发现和管理. 创建微服务应用 安装: 安装Java 8 from the Oracle website. 安装Node.js from the Node.js we

SpringBoot + Kubernetes云原生微服务实践 - (6) 微服务测试设计和实践

微服务测试设计和实践 微服务测试的最大挑战:依赖.解决方案是采用分而治之的策略:a.先针对每一个微服务进行隔离测试,在对每一个微服务进行测试的时候再按照分层的方式进行隔离测试:测试过程中采用mock等技术来隔离依赖简化测试:b.在确保每个微服务通过隔离测试后,再进行整个应用的端到端集成测试 微服务测试分类和技术 Spring(Boot)应用分层 controller 服务的对外接口层,负责接收请求和发送响应 中间涉及到消息,一般是json跟对象间的转换,术语叫做序列化,一般由框架封装 控制器需要

微服务集成——《微服务设计》读书笔记

一.理想的集成应该是什么样的? 1.避免破坏性修改 如果在一个微服务的响应中添加一个字段,服务的消费方不应该受到影响. 2.保证API的技术无关性 微服务之间的通信应该是与技术无关的. 3.使服务的消费方易于使用 如果消费方使用该服务比登天还难,那么无论该微服务多漂亮都没用任何意义.但同时,易于使用的服务可能内部封装了很多细节,这会增加耦合. 4.隐藏内部实现细节 消费方与服务方的内部细节应该是分开的,如果与细节绑定,则意味着改变服务内部的一些变化,消费方也要跟着修改,这会增加修改的成本. 二.

[从0到1搭建ABP微服务] - 搭建Business微服务

简介 互联网产品主要分为两大类,分别是B端产品和C端产品.B端产品主要管业务(Business)代表系统有ERP.WMS.CRM等,C端产品主要管消费者(Consumer)代表主要就是各种电商网站如淘宝.京东等.本篇文章将基于ABP框架搭建一个Business微服务,后续我会逐渐添加一些实用的业务功能到Business服务中. 新建项目 在MicroServices目录中创建一个新的 asp.net core 项目Business.Host 空项目结果如下: DDD分层 在空项目中使用DDD设计

《用消息服务来提高微服务的可靠性》

前言: 过去,我们很容易通过:取出裸机服务器.安装所有必需的软件.添加所有应用代码.将数据加载上去的一系列流程,来部署单体应用程序(monolithic application).由于一切组件都集中在一台服务器上,因此这种应用不但能够处理较大的流量,并且非常容易管理与部署. 然而,此类应用存在的大问题便是效率低下.例如,您必须事先估算峰值时的负载,才能配上足够性能的服务器.但是具有此类配置服务器的资源又会在正常负载下处于闲置状态,甚至在小负载时造成大量的浪费. 此外,我们可能需要痛苦地通过手动操

响应式web设计读书笔记

1.媒体查询可以在链接link标签和具体的CSS中使用: 2.通过<link>标签的 media 属性为样式表指定设备类型和其他条件  中间用and和()来分隔,如下 <link rel="stylesheet" media="screen and (orientation: portrait) and (min-width: 800px)" href="800wide-portrait-screen.css" /> 3.

实现领域驱动设计 读书笔记 1-3章

前言 大事拆分为小事,小事抓住重要事,重要事中做好基础事,基础事中坚持规矩办事.--于18年2月杭州滨江出差时发的一个朋友圈 最近换了一个项目在做,有用到ddd架构,从此结缘ddd,遂翻书以作深入理解 1.什么是DDD,为什么要是使用它? 2.领域 子域 和限界上下文 3.上下文映射图 原文地址:https://www.cnblogs.com/jdzhang/p/8684828.html

《微服务设计》读书笔记大纲

cha1:微服务的概念--<微服务设计>读书笔记 cha2:微服务架构师的职责--<微服务设计读书笔记> cha3:建模:确定服务的边界--<微服务设计>读书笔记 cha4:微服务集成--<微服务设计>读书笔记 服务的协作:服务间的消息传递--<微服务设计>读书笔记 cha5:拆分:分解单块系统--<微服务设计>读书笔记 cha6:部署:持续集成(CI)与持续交付(CD)--<微服务设计>读书笔记 cha7:测试--<

微服务架构设计基础之领域驱动设计

DDD早于微服务「出道」十年,这两个「忘年交」的软件设计哲学是如何相爱相杀的? 背景 微服务现在可以说是软件研发领域无人不提的话题,然而业界流行的对比多数都是所谓的Monolithic(单体应用),而大量的系统在十几年前都已经是以SOA(面向服务架构)为基础的分布式系统了,那么微服务作为新的架构标准与SOA有什么差异点呢?其本质区别在于设计原理,微服务是去中心化设计,SOA是「集成」形成中心设计: 另外,笔者认为以下几点并不是微服务和SOA的区别点: CI/CD:持续集成.持续部署本身与敏捷.D