设为首页 加入收藏

TOP

微服务架构设计基础之领域驱动设计(一)
2019-09-17 16:58:59 】 浏览:52
Tags:服务 架构 设计 基础 领域 驱动

DDD早于微服务「出道」十年,这两个「忘年交」的软件设计哲学是如何相爱相杀的?

背景

微服务现在可以说是软件研发领域无人不提的话题,然而业界流行的对比多数都是所谓的Monolithic(单体应用),而大量的系统在十几年前都已经是以SOA(面向服务架构)为基础的分布式系统了,那么微服务作为新的架构标准与SOA有什么差异点呢?其本质区别在于设计原理,微服务是去中心化设计,SOA是「集成」形成中心设计;

另外,笔者认为以下几点并不是微服务和SOA的区别点:

  • CI/CD:持续集成、持续部署本身与敏捷、DevOps是交织在一起的,CI\CD更倾向于软件工程的领域,与微服务无关;

  • 基于容器还是虚拟机:Docker、虚拟机、物理机等是物理介质的一种实现方式,与微服务无关;
  • 微服务周边生态:比如日志平台、调用链系统?更多的是研发本身对于效率提高的自驱力,而与使用何种架构方式无关;
  • 通讯协议:微服务的推荐通讯协议是RESTful,而传统的SOA是SOAP。不过基于轻量级的RPC框架Dubbo、Thrift、gRPC来实现微服务也很多;在Spring Cloud中也有Feign框架将标准RESTful转为代码的API这种仿RPC的行为,这些通讯协议不是区分微服务架构和SOA架构的核心差别;

    当然,软件工程(DevOps)、基础设施(容器化)、软件开发模式(敏捷开发)的变革有利的推进了微服务架构的大行其道。而微服务架构是一种架构风格、架构理念,其中的「微」更体现了它的精髓在切分。在实际微服务的落地过程中证明,如果切分是错误的,你得不到微服务承诺的「低耦合、自治、易维护」之类的优势,并且还会比单体架构拥有更多的麻烦。那么如何切分呢?其实并不是一些新的方法论,而是都提出很多年的架构设计方法,也称它们为微服务设计基础或架构模型:领域驱动设计和立方体模型。

领域驱动设计

2004年,Eric Evans 发表了Domain Driven Design(领域驱动设计,DDD)。领域驱动设计已经问世十几年,从Eric Evans出版的著作「领域驱动设计」一书中对领域驱动做了开创性的理论阐述,在软件设计领域中,DDD可以称得上是步入暮年时期了。遗憾的是,国外软件圈享有盛誉并行之有效的设计方法学,国内大多数的技术人员却并不了解,也未曾运用到项目实践中。直到行业内吹起微服务的热风,人们似乎才重新发现了领域驱动设计的价值,并不是微服务拯救了领域驱动设计,是因为领域驱动设计一直在顽强的成长,其设计开放的设计方法体系,虽然从来不曾在国内大行其道,但却发挥着巨大的价值。表面上看确实是因为微服务,领域驱动设计才又开始出现在大众视野里。

领域驱动设计的意义

当然,领域驱动设计并非「银弹」,不是能解决所有疑难杂症的「灵丹妙药」,学习并应用它的意义在于:

  • 一套完整的模型驱动的软件设计方法,用于简化软件项目的复杂度,它能带给你从战略设计到战术设计的规范过程,使得你的设计思路能够更加清晰,设计过程更加规范;
  • 一种思维方式和概念,可以应用在处理复杂业务的软件项目中,加快项目的交付速度;
  • 一组提炼出来的原则和模式,可以帮助开发者开发优雅的软件系统、促进开发者对架构与模型的精心打磨,尤其善于处理系统架构的演进设计、有助于提高团队成员的面向对象设计能力与架构设计能力;
  • 领域驱动设计与微服务架构天生匹配,无论是在新项目中设计微服务架构,还是将系统从单体架构演进到微服务设计,都可以遵循领域驱动设计的架构原则。
    当然,领域驱动能给我们带来很多收获,但如果你是属于以下几种情况的某种,那么你确实不需要学习领域驱动设计了:

  • 如果你是独当一面的架构师,并能设计出优雅的软件架构
  • 如果你是高效编码的程序员,并只想踏踏实实的写代码
  • 如果你是前端的设计人员,并奉行「用户体验至上」的理念
  • 如果你负责的软件系统并不复杂,二三人便可轻松维护

    DDD的关键概念

一个软件系统的诞生,一定是为了解决我们遇到的某个问题。比如一家企业的一直采用线下销售产品,耗费大量的财力和物力,希望可以在线上销售自己的产品,用于实现在线销售销售产品的目的,那么就诞生了一个电商系统。通常最初设立的目标或要解决的问题就是一个软件项目的出发点,明确我们要做什么。比如一个电商、一个论坛、一个支付平台等。

下文将从领域、问题域、领域模型、设计、驱动这几个词语的含义和联系的角度去阐述DDD是如何融入到软件开发的。要理解什么是领域驱动设计,首先要理解什么是领域,什么是设计,什么是驱动,什么驱动什么。

什么是领域/子领域(Domain/Subdomain)

领域是与某个特定问题相关的知识和行为。比如支付平台就属于特定的领域,只要是这个领域,都会有账户、会记、收款、付款、风控等核心环节。所以,同一个领域的系统都具有相同的核心业务,他们要解决的问题的本质是一致的。一个领域本质上可以理解为就是一个问题域,只要是同一个领域,那问题域就相同。所以,只要我们确定了系统所属的领域,那这个系统的核心业务,即要解决的关键问题、问题的范围边界就基本确定了。

在日常开发中,我们通常会将一个大型的软件系统拆分成若干个子系统。这种划分有可能是基于架构方面的考虑,也有可能是基于基础设施的。在DDD中,我们对系统的划分是基于领域(基于业务)的。比如上文提到支付平台是一个领域,而账户、会记、收款、付款等则为子领域。一个领域由众多子领域聚集而形成。

当然,问题随之而来:

  • 哪些概念应该建模在哪些子系统里面?
  • 有时可能会发现一个领域概念建模在子系统A中是可以的,而建模在子系统B中也合情合理。
  • 各个子系统之间的应该如何集成?
  • 有人可能会说,这不简单得就像客户端调用服务端那么简单吗?问题在于,两个系统之间的集成涉及到基础设施和不同领域概念在两个系统之间的翻译,稍不注意,这些概念就会对我们精心创建好的领域模型造成污染。

DDD中,有标准方法解决上述问题,就是限界上下文(Bounded Context)和上下文映射图。在一个领域/子域中,我们会创建一个概念上的领域边界,在这个边界中,任何领域对象都只表示特定于该边界内部的确切含义。这样的边界便称为限界上下文。限界上下文和领域具有一对一的关系。从物理层面讲,一个限界上下文最终可以是一个Jar/War文件,甚至可以是一个Package中的所有对象。但是,技术本身并不是用来界分限界上下文。

上图引自《实现领域驱动设计》。通常情况下,一个领域有且只有一个核心问题,我们称之为该领域的「核心域」。在核心域、通用子域、支撑子域梳理的同时,会定义出子域中的「限界上下文」及其关系,用它来阐述子域之间的关系。界限上下文可以简单理解成一个子系统或组件模块。

什么是设计(Design)

DDD中的设计主要指领域模型的设计。DDD是一种基于模型驱动开发的软件开发思想,强调领域模型是整个系统的核心,领域模型也是整个平台的核心价值。每一个领域都有一个对应的领域模型,领域模型能够很好的解决负责的业务问题。所以领域模型的设计和架构设计同等重要。

什么是驱动(Driven)

DDD中,总是以领域为边界,分析领域中的核心问题(核心关注点)。然后设计对应的领域模型,通过领域模型驱动代码的实现。而数据库设计、持久化技术这些都不是DDD的核心,属于外围的东西。与数据库

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇卸载(uninstalled)Mac os Jenkins.. 下一篇Activiti6.0 工作流引擎 websocke..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目