zoukankan      html  css  js  c++  java
  • 微服务设计读书笔记 (第三章 如何建模服务)

    ​ 在本章中,我们会讨论如何确定服务之间的边界,以及最大化微服务的好处,避开它的劣势。但是,首先我们需要有一个产品作为讨论的载体。

    什么样的服务是好服务

    ​ 松耦合和高内聚。如果这两点做不到,那么微服务也就没什么价值了。

    • 松耦合

    ​ 如果做到了服务之间的松耦合,那么修改一个服务就不需要修改另一个服务。使用微服务最重要的一点是,能够独立修改及部署单个服务而不需要修改系统的其他部分,这真的非常重要。

    ​ 一个松耦合的服务应该尽可能少地知道与之协作的那些服务的信息。这也意味着,应该限制两个服务之间不同调用形式的数量,因为除了潜在的性能问题之外,过度的通信可能会导致紧耦合。

    • 高内聚

    ​ 我们希望把相关的行为聚集在一起,把不相关的行为放在别处。为什么呢?因为如果你要改变某个行为的话,最好能够只在一个地方进行修改,然后就可以尽快地发布。

    ​ 找到问题域的边界可以确保相关的行为能放在同一个地方,并且它们会和其他边界以尽量松耦合的形式进行通信。

    限界上下文

    ​ 一个由显式边界限定的特定职责。

    ​ 任何一个给定的领域都包含多个限界上下文,每个限界上下文中的东西分成两部分,一部分不需要与外部通信,另一部分则需要。每个上下文都有明确的接口,该接口决定了它会暴露哪些模型给其他的上下文。

    • 共享的隐藏模型

    ​ 有时候,同一个名字在不同的上下文中有着完全不同的含义。比如,退货表示的是客户退回的一些东西。在客户的上下文中,退货意味着打印运送标签、寄送包裹,然后等待退款。在仓库的上下文中,退货表示的是一个即将到来的包裹,而且这个包裹会重新入库。退货这个概念会与将要执行的任务相关,比如我们可能会发起一个重新入库的请求。这个退货的共享模型会在多个不同的进程中使用,并且在每个限界上下文中都会存在相应的实体,不过,这些实体仅仅是在每个上下文的内部表示而已。

    • 模块和服务

    ​ 明白应该共享特定的模型,而不应该共享内部表示这个道理之后,就可以避免潜在的紧耦合风险。我们还识别出了领域内的一些边界,边界内部是相关性比较高的业务功能,从而得到高内聚。这些限界上下文可以很好地形成组合边界。

    ​ 一般来讲,微服务应该清晰地和限界上下文保持一致。熟练之后,就可以省掉在单块系统中先使用模块的这个步骤,而直接使用单独的服务。然而对于一个新系统而言,可以先使用一段时间的单块系统,因为如果服务之间的边界搞错了,后面修复的代价会很大。所以最好能够等到系统稳定下来之后,再确定把哪些东西作为一个服务划分出去。

    • 过早划分

    ​ 过早将一个系统划分成为微服务的代价非常高,尤其是在面对新领域时。很多时候,将一个已有的代码库划分成微服务,要比从头开始构建微服务简单得多。

    业务功能

    ​ 当你在思考组织内的限界上下文时,不应该从共享数据的角度来考虑,而应该从这些上下文能够提供的功能来考虑。首先要问自己“这个上下文是做什么用的”,然后再考虑“它需要什么样的数据”。

    逐步划分上下文

    ​ 一开始你会识别出一些粗粒度的限界上下文,而这些限界上下文可能又包含一些嵌套的限界上下文。举个例子,你可以把仓库分解成为不同的部分:订单处理、库存管理、货物接受等。当考虑微服务的边界时,首先考虑比较大的、粗粒度的那些上下文,然后当发现合适的缝隙后,再进一步划分出那些嵌套的上下文。

    关于业务概念的沟通

    ​ 修改系统的目的是为了满足业务需求。我们会修改面向客户的功能。如果把系统分解成为限界上下文来表示领域的话,那么对于某个功能所要做的修改,就更倾向于局限在一个单独的微服务边界之内。这样就减小了修改的范围,并能够更快地进行部署。

    ​ 微服务之间如何就同一个业务概念进行通信,也是一件很重要的事情。基于业务领域的软件建模不应该止于限界上下文的概念。在组织内部共享的那些相同的术语和想法,也应该被反映到服务的接口上。以跟组织内通信相同的方式,来思考微服务之间的通信形式是非常有用的。事实上,通信形式在整个组织范围内都非常重要。

    小结

    ​ 在本章中,你学到了什么是好的服务,以及如何在问题空间中寻找能达到高内聚低耦合的接缝。限界上下文是寻找这些接缝的一个非常重要的工具,通过将微服务与这些边界相匹配,可以保证最终的系统能够得到微服务提供的所有好处。我们也大概了解了一些进一步划分微服务的方法,后面的章节会深入讨论这个话题。

  • 相关阅读:
    Spring AOP日志实现(一)
    ArrayList和LinkedList的区别
    webmagic保存数据
    Java静态代码块、构造代码块执行顺序问题
    为Spring Cloud Ribbon配置请求重试(Camden.SR2+)
    centos关机与重启命令
    解决win环境下访问本机虚拟机中centos7 ftp服务器的问题
    【MongoDB异常】Exception authenticating MongoCredential解决方法
    mongodb解决只能本地连接不能远程连接问题
    Windows Server 2008 R2提示api-ms-win-crt-runtime-l1-1-0.dll 丢失解决方法
  • 原文地址:https://www.cnblogs.com/KQNLL/p/13760195.html
Copyright © 2011-2022 走看看