首页 > 其他分享 >为什么微服务要选用ddd

为什么微服务要选用ddd

时间:2023-07-23 10:22:06浏览次数:40  
标签:架构 边界 领域 选用 设计 服务 ddd DDD

进入微服务架构时代以后,微服务确实也解决了原来采用集中式架构的单体应用的很多问题,比如扩展性、弹性伸缩能力、小规模团队的敏捷开发等等。

但在看到这些好处的同时,微服务实践过程中也产生了不少的争论和疑惑:微服务的粒度应该多大呀?微服务到底应该如何拆分和设计呢?微服务的边界应该在哪里?

可以说,很久以来都没有一套系统的理论和方法可以指导微服务的拆分,包括微服务架构模式的提出者Martin Fowler在提出微服务架构的时候,也没有告诉我们究竟应该如何拆分微服务。

于是,在这段较长的时间里,就有不少人对微服务的理解产生了一些曲解。有人认为:“微服务很简单,不过就是把原来一个单体包拆分为多个部署包,或者将原来的单体应用架构替换为一套支持微服务架构的技术框架,就算是微服务了。” 还有人说:“微服务嘛,就是要微要小,拆得越小效果越好。”

但我想,这两年,你在技术圈中一定听说过一些项目因为前期微服务拆分过度,导致项目复杂度过高,无法上线和运维。

综合来看,我认为微服务拆分困境产生的根本原因就是不知道业务或者微服务的边界到底在什么地方。换句话说,确定了业务边界和应用边界,这个困境也就迎刃而解了。

那如何确定,是否有相关理论或知识体系支持呢?在回答这些问题之前,我们先来了解一下领域驱动设计与微服务的前世今生。

2004年埃里克·埃文斯(Eric Evans)发表了《领域驱动设计》(Domain-Driven Design –Tackling Complexity in the Heart of Software)这本书,从此领域驱动设计(Domain Driven Design,简称DDD)诞生。DDD核心思想是通过领域驱动设计方法定义领域模型,从而确定业务和应用边界,保证业务模型与代码模型的一致性。

但DDD提出后在软件开发领域一直都是“雷声大,雨点小”!直到Martin Fowler提出微服务架构,DDD才真正迎来了自己的时代。

有些熟悉DDD设计方法的软件工程师在进行微服务设计时,发现可以利用DDD设计方法来建立领域模型,划分领域边界,再根据这些领域边界从业务视角来划分微服务边界。而按照DDD方法设计出的微服务的业务和应用边界都非常合理,可以很好地实现微服务内部和外部的“高内聚、低耦合”。于是越来越多的人开始把DDD作为微服务设计的指导思想。

现在,很多大型互联网企业已经将DDD设计方法作为微服务的主流设计方法了。DDD也从过去“雷声大,雨点小”,开始真正火爆起来。

DDD是一种处理高度复杂领域的设计思想,它试图分离技术实现的复杂性,并围绕业务概念构建领域模型来控制业务的复杂性,以解决软件难以理解,难以演进的问题。DDD不是架构,而是一种架构设计方法论,它通过边界划分将复杂业务领域简单化,帮我们设计出清晰的领域和应用边界,可以很容易地实现架构演进。

 

DDD与微服务的关系

DDD是一种架构设计方法,微服务是一种架构风格,两者从本质上都是为了追求高响应力,而从业务视角去分离应用系统建设复杂度的手段。两者都强调从业务出发,其核心要义是强调根据业务发展,合理划分领域边界,持续调整现有架构,优化现有代码,以保持架构和代码的生命力,也就是我们常说的演进式架构。

DDD主要关注:从业务领域视角划分领域边界,构建通用语言进行高效沟通,通过业务抽象,建立领域模型,维持业务和代码的逻辑一致性。

微服务主要关注:运行时的进程间通信、容错和故障隔离,实现去中心化数据管理和去中心化服务治理,关注微服务的独立开发、测试、构建和部署。

 总体来说,DDD可以给你带来以下收获:

  1. DDD是一套完整而系统的设计方法,它能带给你从战略设计到战术设计的标准设计过程,使得你的设计思路能够更加清晰,设计过程更加规范。
  2. DDD善于处理与领域相关的拥有高复杂度业务的产品开发,通过它可以建立一个核心而稳定的领域模型,有利于领域知识的传递与传承。
  3. DDD强调团队与领域专家的合作,能够帮助你的团队建立一个沟通良好的氛围,构建一致的架构体系。
  4. DDD的设计思想、原则与模式有助于提高你的架构设计能力。
  5. 无论是在新项目中设计微服务,还是将系统从单体架构演进到微服务,都可以遵循DDD的架构原则。
  6. DDD不仅适用于微服务,也适用于传统的单体应用。

标签:架构,边界,领域,选用,设计,服务,ddd,DDD
From: https://www.cnblogs.com/15078480385zyc/p/17574741.html

相关文章

  • 微服务拆分需要考虑哪些因素?
    微服务拆分需要考虑哪些因素?理论上一个限界上下文内的领域模型可以被设计为微服务,但是由于领域建模主要从业务视角出发,没有考虑非业务因素,比如需求变更频率、高性能、安全、团队以及技术异构等因素,而这些非业务因素对于领域模型的系统落地也会起到决定性作用,因此在微服务拆分时我......
  • java游戏服务器2023年7月22日
    name卡牌军团放置卡牌游戏开发语言:javamysql通信http账号服务器提供验证等功能中心服务器跨服功能排行榜公会......
  • 验证码识别服务2Captcha框架
    2Captcha是一个自动验证码识别服务,主要用于解决各种互联网服务中的验证码问题。在许多网站注册账户或进行敏感操作时,为了验证用户是真实的而不是自动化程序,会出现验证码。用户必须正确输入验证码,才能继续使用网站的功能。该框架的目标是帮助客户自动化解决验证码问题。客户可以通......
  • Linux 网络基础 2 三次握手 三次挥手 多进程 多线程服务器
    1.包裹函数对服务器客户端等函数进行报错处理以及简化处理比如bindinttcp4bind(shortport,constchar*IP){structsockaddr_inserv_addr;intlfd=Socket(AF_INET,SOCK_STREAM,0);bzero(&serv_addr,sizeof(serv_addr));if(IP==NULL){//......
  • “三feng云”“免费虚拟主机““免费云服务器”
    “三feng云”“免费虚拟主机““免费云服务器”控制台链接:https://www.sanfengyun.com/control/#/freeServerList1.点击管理面板进入管理界面2.点击基本信息查看服务器配置3.点击安装操作系统安装操作系统,设置登录密码。支持linux、Windows4.流量统计查看访问流量情况5.......
  • 关于 SAP Fiori Launchpad 工作所依赖的 OData 服务
    Thelaunchpadandlaunchpaddesignerneedareverseproxytodirectthebrowserrequeststoeitherthefront-endsysteminwhichtheJavaScriptsourcesarestored,ortotheSAPGatewaysysteminwhichtheODataservicesarelocated.Launchpad和Launchpa......
  • C#原生Socket服务器与客户端的实现
    上个项目中用到了Socket通讯,项目中直接借助SuperSocket实现,但是我觉得这毕竟是一个我没接触过的东西,所以也顺便学习了一下原生socket的使用,做了一个socket服务器与客户端的开发.本人菜鸟一枚,只做了一个简单的实现,希望有看到我博客的大佬不吝指点,抱拳!socket通讯......
  • k8s 学习笔记之搭建 nginx 服务测试搭建的环境
    服务部署接下来在kubernetes集群中部署一个nginx基础程序,测试集群是否正常工作。#部署nginx[root@master~]#kubectlcreatedeploymentnginx--image=nginx:1.14-alpine#暴露端口[root@master~]#kubectlexposedeploymentnginx--port=80--type=NodePort#......
  • mysql 服务卸载
    如何卸载MySQL服务作为一名经验丰富的开发者,我将帮助你学习如何卸载MySQL服务。在开始之前,让我们先了解整个卸载过程的步骤。下面的表格将展示每个步骤和需要执行的任务。步骤任务代码说明1停止MySQL服务sudoservicemysqlstop停止运行中的MySQL服务2......
  • DDD架构为什么应该首选六边形架构?
    一、传统分层架构分层架构的一个重要原则是:每层只能与位于其下方的层发生耦合。分层架构分两种:一种是严格分层架构,规定某层只能与直接位于其下方的层发生耦合;另一种是松散分层架构,允许任意上方层与任意下方层发生耦合。下图是一个典型的DDD传统分层架构。以上分层架构中各层......