写点什么

论领域驱动设计在微服务开发中的作用

  • 2016-02-17
  • 本文字数:1536 字

    阅读完需:约 5 分钟

在近期于德国柏林举办的 microXchg 大会上,来自 innoQ 的 Michael Plöd 在一场演讲中谈到了如何在开发微服务的过程中使用领域驱动设计(DDD)的话题。在他看来,微服务与DDD 之间的联系不仅仅只限于界限上下文(Bounded Context)的概念而已,虽然界限上下文确实是一种可用于定义微服务粒度的基础工具,但其他一些概念也同样重要。相应地,DDD 也并非只单纯地代表实体、值对象与repository 等概念而已。

Plöd 是 innoQ 的首席顾问。他相信,在创建微服务的过程中,DDD 可以在以下 4 个主要领域发挥作用:

  • 战略设计 —— 这一阶段的主要工作就是界限上下文的设计,但上下文图(Context Map)与其他模式也同样十分重要。
  • 内部构建块 —— 在设计一个界限上下文的内部结构时将用到 DDD 中的多种战术模式,例如实体、聚合以及 repository。
  • 大比例结构(Large-scale Structure),通过有序演化与职责层模式创建结构。
  • 精炼 —— 通过精炼方法,从一个已经成熟的系统中提炼出一个核心领域

任何一个具有高复杂度的业务领域都由一个或多个界限上下文组成,每个上下文负责领域中的一部分内容。每个界限上下文都包含用于描述领域的模型,同时也定义了这些模型所代表的意义的边界。以一个客户对象为例,每个界限上下文都是按照独有的模型与视角来定义这个客户对象的。在 Plöd 看来,这一特性对于开发独立的微服务能够起到重要的促进作用。

上下文图描述了系统中的所有界限上下文,以及他们之间的相互关联及上下文之间的契约。Plöd 相信,对于已有打算进行微服务转型的组织来说,上下文图将带来极大的便利。不仅如此,上下文图还能够作为今后的转型过程中的一个良好的起点。以下是界限上下文之间常见的关系模式:

  • 共享内核模式(Shared Kernel) —— 它表示两个上下文或模型之间共享某个领域的一个子集,包括代码在内。Plöd 提示,这种模式将增加系统的依赖。
  • 客户 / 供应商模式(Customer / Supplier) —— 某个上下文将扮演客户的角色,它将从另一个扮演供应商角色的上下文中请求特性。
  • 防崩溃层(Anticorruption layer, ACL )—— 某个客户端将利用转换器(translator),将其自身的模型与其他模型进行隔离。在将系统转型为微服务或自包含系统(Self-Contained,SCS)架构时,这是一种非常有趣的选择,ACL 将表现为一个系统的护罩,以抵御来自外部的侵扰。

在 DDD 的各种内部构建块中,Plöd 特别提到了聚合的重要性。聚合是由多个领域对象构成的一个逻辑组,其中的对象将作为一个整体进行处理。聚合中的某个实体将成为聚合根,它负责接收所有外部请求,并负责整个聚合的生命周期。

对于僵硬的架构或是过于复杂的系统来说,可以选择创建一个跨界限上下文的大比例结构,让这个结构随着对于高层次概念的理解不断加深而逐渐进化。Plöd 表示,这一点也是微服务架构的核心思想之一,微服务的设计应当是可以不断进化的。职责层模式是另一种在界限上下文之内创建一个内部结构的结构模式,其思想是按照职责进行结构的创建,而微服务的结构也可以应用相同的概念进行设计。

在将某个遗留系统转型至微服务或是自包含系统架构时,精炼方法能够帮助开发者从一个现有的一体性系统中提炼出微服务。首先要辨别并提炼出核心领域,然后再通过迭代方法找出子领域,将其从核心领域中提取出来,最后再进行一些内部的清理与重构工作。Pödl 特别强调了为核心领域的业务功能与细节实现文档化的重要性。如果对于业务功能没有一个清晰的愿景及深刻的理解,就会增加无法发现最佳的界限上下文的风险。

Pödl 在演讲的最后回顾了以上概念,并在总结陈述中表示微服务与 DDD 能够很好地结合在一起。但他同时也提示,开发者应当具有大局观,而不是将注意力仅仅放在界限上下文中。

查看英文原文: Using Domain-Driven Design When Creating Microservices

2016-02-17 18:003779
用户头像

发布了 428 篇内容, 共 200.4 次阅读, 收获喜欢 39 次。

关注

评论

发布
暂无评论
发现更多内容

自媒体平台数据统计分析爬虫之【趣头条】模拟登陆分析详解及数据统计接口详解

ucsheep

接口 爬虫 趣头条 模拟登录

神策大数据技术直播系列课第二季,开讲啦

神策技术社区

大数据 性能优化 大前端 工程师 事件分析

直播预告 | 数据操作加速器,CloudQuery v1.3.5 发布

BinTools图尔兹

sql 编辑器 数据治理 数据安全 数据库管理工具

畅想数据湖

数据社

数据仓库 数据湖 ETL ELT

简单快速搭建,全新语聊方案

anyRTC开发者

ios android 音视频 WebRTC RTC

情指勤指挥调度平台搭建,公安局情报指挥系统

NA公链(Nirvana)解决的六大问题在众多公链中脱颖而出NAC公链

区块链第一资讯

网络连接总超时?从四层模型上解析网络是怎么连接的

京东科技开发者

计算机网络 服务器 域名

超详细!手把手带你快速入门 GitHub!

JackTian

git GitHub 开源

技术杂谈 | Flutter 的性能分析、工程架构与细节处理

有道技术团队

flutter

20天内看完这套GitHub标星18k+的Android资料,含泪整理面经

欢喜学安卓

android 程序员 面试 移动开发

2021出海社交必看:产品、技术、运营指南

拍乐云Pano

音视频 RTC 社交APP出海 出海社交 社交泛娱乐

“数字云南”建设成效逐渐显现 区块链财政电子票据带来民生与环保效益

CECBC

区块链

量化策略软件搭建,马丁策略交易软件开发

力扣(LeetCode)刷题,简单题(第14期)

不脱发的程序猿

面试 LeetCode 28天写作 算法攻关 3月日更

2021年DevOps的四大趋势

禅道项目管理

DevOps 工具 趋势 Redis开发与运维

云原生数据库风起云涌,华为云GaussDB破浪前行

华为云开发者联盟

数据库 架构 云原生 华为云 GaussDB

别再说你不懂规则引起啦

比伯

Java 编程 程序员 架构 计算机

Spark性能调优-Shuffle调优及故障排除篇

五分钟学大数据

大数据 spark 3月日更

2021年Android面试心得,大厂面经合集

欢喜学安卓

android 程序员 面试 移动开发

用 WebRTC 打造一个音乐教育 App,要解决哪些音质难题?

阿里云CloudImagine

音视频 WebRTC 在线教育 RTC

IAP:物联网终端软件升级技术

华为云开发者联盟

IoT LiteOS iap 物联网终端 OTA

终于知道为啥网页不让我复制粘贴了!

华为云开发者联盟

js 代码 button事件 复制粘贴 输入框

MoviePy - 中文文档(一个专业的python音视频编辑库)教程

ucsheep

Python 音视频 视频剪辑 Moviepy 视频合成

Python OpenCV 彩色图像与灰度图像的转换

梦想橡皮擦

3月日更

10种下载YouTube视频的方法-包含网站软件插件app等

Space空间

软件 网站 下载youtube视频

美女师姐说给你听!我成为蚂蚁安全工程师的初体验

DT极客

音视频开发——通信直播协议和视频推流丨RTMP-RTSP

Linux服务器开发

音视频 WebRTC ffmpeg 直播推流 SRS流媒体服务器

开抢| 华为开发者大会2021(Cloud)早鸟票来了!

华为云开发者联盟

华为 开发者

2021最新分享支付宝/美团/拼多多面经总结

比伯

Java 编程 架构 面试 程序人生

golang设置时区的多种方式

happlyfox

学习 3月日更 Go 语言

论领域驱动设计在微服务开发中的作用_语言 & 开发_Jan Stenberg_InfoQ精选文章