当DDD遇上微服务

DDD与微服务是可以相通的,其关键在于Bounded Context。

分布式系统的定义

在谈论这个之前,我们需要就什么是分布式系统达成一致。在我看来,判断一个系统是否是分布式的,其标准是看系统中是否存在跨进程通信。是进程决定了协作与通信的方式,从而引申出两种具有本质区别的编程模型:

  • 进程内编程模型
  • 跨进程编程模型

它们之间的区别在于组件之间的调用方式。进程内的组件调用是非常简单的,就Java而言,各个驻留于同一个JVM的对象与变量都放在堆内存或者栈内存中,对象的调用(包括方法的调用)就是一种内存的寻址。Java语言通过new关键字创建实例,从而获得该实例的指针,以便于对该实例的属性与方法进行调用。

跨进程组件之间的调用方式与进程内调用有着本质的。虽然跨进程通信机制存在各种不同的实现,但它们要考量的因素都是相同的,需要考虑:

  • 进程间的通信协议
  • 如何寻址
  • 消息的序列化与反序列化

除此之外,在资源管理、事务一致性以及部署方面,都会因为跨进程通信的原因而产生巨大的差别。

显然,跨进程通信固有的复杂度带来了编程模型的改变,但它能够更加有效地利用硬件资源,却是分布式系统的主要目标。因此,在IT发展的当前历史背景下,我们将进程作为边界来定义分布式系统是非常有意义的。

说明:不同的语言平台,进程的概念有细微差别,通信机制自然也有所不同。Java进程等同于操作系统的进程,但Erlang与Go的进程概念则不相同,要更加轻量级。

跨进程组件之间的调用方式其实是对通信机制的一种抽象,它其实又包含了:

  • 进程间通信机制(如共享内存、管道、Socket)
  • 结构化通信机制(如RPC)
  • 中间件通信机制(分布式对象如CORBA、组件中间件如EJB、消息中间件、面向服务与REST)

讨论C4模型的Container

Simon Brown提出了自己的C4模型,如下图所示:

我们对Container的划分,可以将进程作为划分的边界,即我认为的“物理边界”。所以Container在架构中除了可以作为逻辑视图的组成元素之外,也可以视为物理视图的一部分。

无独有偶,Alistair Cockburn提出的六边形架构(又名port-adapter模式)在边界含义上与Container是与之呼应的。下图中外部六边形的边界就是一个物理边界,按照之前的分析,我们可以将其视为进程边界。

微服务与Bounded Context

微服务作为一个可以独立部署的微小服务,天生就是一个在物理上隔离的自治服务。从物理视图的角度看,一个微服务就是C4模型中的Container,也就是六边形架构中的六边形。如果我们将六边形架构与DDD的Bounded Context对应起来,那么就可以引入DDD的战略设计来划分服务边界,从而帮助我们进行微服务设计了。

一个典型的Bounded Context,可以具有自己的领域模型,访问专有的数据库,且可以引入“依赖注入”来满足Uncle Bob所谓的Clean Architecture思想。下图所示的Bounded Context的架构,不正是可以表现为一个微服务吗?

Context Map对微服务的阐释

思考DDD中的Bounded Context,可以重点把握以下两点:

  • Bounded Context与Domain之间的关系
  • Context Map

倘若我们认为Bounded Context与Domain之间存在对应关系,就说明可以从业务架构的层面来设计微服务。通过用例、通用语言或者其他手段,都可以帮助我们识别Bounded Context,进而得到相对合理的服务边界。

若要判断微服务的设计是否合理,则可以通过DDD的Context Map进一步验证和判别Bounded Context的划分,并理清楚它们之间的关系。

Eric Evans在DDD一书中列出了九种Context Map,基本上可以归类为:

  • 团队之间的协作方式
  • 进程之间的集成方式

为什么说Bounded Context之间的关系可以理解为是团队之间的协作方式呢?理论根据来自康威定律,即:

设计一个系统(此处泛指更广泛的系统,而不仅仅是信息系统)的任何组织都必然会产生一个其结构是该组织通信结构副本的设计。

一个Bounded Context可能会映射到一个开发团队,所以讨论Bounded Context之间的关系,也可以视为是讨论团队之间的关系。至于进程之间的集成方式,无论是引入ACL(防腐层)还是OHS(开放主机服务),目的都是在实现进程间通信的同时,更好地做到Bounded Context之间的松散耦合。以微服务观之,就是要满足服务边界足够的自治性。

故而当DDD遇到微服务,其实有许多玄妙的相似之处值得深究。它们之间或许可以碰撞出感情的火花,也未可知呢。

原文发布时间为:2017-12-22

本文作者:张逸

时间: 2024-09-21 20:24:07

当DDD遇上微服务的相关文章

API网关遇上容器服务

在API经济和微服务的背景下,如何对服务的API进行管理是大家都很感兴趣的话题.本文通过利用阿里云的容器服务和API网关,构建一个完整的基于Docker的具有API管理功能的服务. API管理 假定我们需要这么一个经典的后端服务,访问如下API接口的时候返回Hello World: $ curl http://apisvc.hostxx/api <p>Hello World</p> 这个服务推出后广受欢迎,但是烦恼总是伴随幸福不期而至: 对API进行计费怎么做? 外界访问API的流

微服务的兴起,对开发者而言是机遇OR糟遇!

问题描述 到底是机遇还是糟遇?我的叔叔是一位架构师非常有远见,我从他那里取了些经,与各位分享!他说从整体上来看未来开发者将是对社会更具贡献的人,但与时代脱节也必将被时代淘汰!建议就是有自己擅长的语言,并且能够长久的锻炼自己写代码的精炼程度.那如何跟的上时代呢?叔叔说,按国外的经验来看,确实将来coding哥会因为云平台发展而遭遇就业危机.目前国内云发展主要方向是容器技术与微架构!那怎样加强coding哥竞争力呢?由于容器技术是可以将环境和应用进行打包,可重复.跨平台使用,就主要了解一下微服务吧!

微服务(Microservices)—Martin Flower【翻译】【转载】

本文转载自:http://www.cnblogs.com/liuning8023/p/4493156.html ---------------------------------------------------------------------------- 原文是 Martin Flower 于 2014 年 3 月 25 日写的<Microservices>. 本文内容 微服务 微服务风格的特性 组件化(Componentization )与服务(Services) 围绕业务功能的组

PPmoney的微服务之路

除了技术内容的分享,敖小剑也提炼了很多在实现微服务过程中团队.管理方面的经验,全文较长,特将这些观点放在文前: 当你推进微服务框架的时候,你不是简单的推进微服务框架,而是推翻整个公司的开发流程. 微服务架构真正成功之处是在于拥抱一个小型.跨智能团队,鼓励扁平.自我管理的组织. 微服务团队应该按照[敖小剑1] [敖小剑2] 业务而不是按照技术来划分组织. 先把自身打造好,然后再孵化满足要求的新型业务开发团队. 资金.技术.专家,缺一不可. 放弃项目思维,引入产品思维. 以下是敖小剑的分享全文. 今

微服务实战:从架构到部署

本文讲的是微服务实战:从架构到部署[编者的话]在这篇文章里, 计划涵盖微服务架构(MSA)的核心架构概念,以及如何在实践中使用这些架构理论. 如今,微服务"Microservices"已经成为软件架构领域最流行的热词之一.市面上也有很多与微服务的基础知识以及优点相关的学习资料,但是关于如何在真实的企业场景中应用微服务的资料还是不多. 在这篇文章里, 我计划涵盖微服务架构(MSA)的核心架构概念,以及你如何在实践中使用这些架构理论. 单体架构 企业软件设计需要满足多种多样的业务需求.因此

谢康 | 同程旅游微服务最佳实践

本文首发胖波聊架构界,微信公众号:xiaobo2as 本文概要 导言 微服务拆分的四个维度 微服务应该如何维护版本 如何从单体架构平滑过渡到微服务 结语 一.导言 同程微服务从立项到实施推广已经走过了整整两个年头,从最初的简单粗糙到今天的精细完善,接入服务数量也实现了从1到10,000+的增长. 微服务开发团队和大家一起踩过了无数的坑,最终打造了今天的DSF2.0平台.回顾爬坑记录,现整理一些爬坑心得体验供大家参考,也斗胆提出一些最佳实践以抛砖引玉. 下文将从开发者角度对微服务如何拆分, 版本管

从事件和DDD入手来构建微服务

领域驱动设计(Domain-Driven Design,DDD)是一项很伟大的技术,它拉近了设计与程序实际所服务的领域,但是通常我们会关注结构,从而太早地做出决策,这并非DDD的本意.相反,在领域中,我们应该从事件开始,Russ Miles描述了在构建微服务时,采用"事件优先"的方式所具有的优势. Miles认为除了关注结构之外,我们还过多地关注了通用语言(ubiquitous language),尤其是在领域对象方面更是如此.更糟糕的是,我们还会着手创建一些跨领域边界重用的库,这些库

元数据驱动的微服务架构(上)

本次分享有两个部分: 微服务架构需要元数据 介绍微服务与元数据的关系. 一.微服务架构需要元数据 企业IT架构已经发展了多个阶段,一方面是服务化架构的发展,在SOA阶段主要解决应用间集成问题,但随着企业业务的发展,单个应用逐渐成为"巨石型"应用,难以扩展也难以维护. 微服务架构应运而生,微服务架构专注于单个应用的内部,将"巨石"应用拆分成为多个微服务,以微服务为单独单元开发运营.另一方面是模型化架构式的发展,模型驱动工程也在不断发展,从MDA(模型驱动架构)全面的完

云上Docker的Spring Cloud微服务应用实践分享

本文整理自2017云栖大会-上海峰会中阿里云高级技术专家李荣陆的分享讲义,讲义主要介绍了云上Docker的Spring Cloud微服务应用实践的契机,过程,和对未来的展望.