17、服务和数据在微服务各层的协作

在微服务架构中,服务和数据的协作是确保系统高效运行和可维护性的关键。本章详细探讨了微服务架构中的服务视图和数据视图,帮助我们理解在运行过程中这些服务和实体在各层是如何协作的。

1、服务视图

微服务内有许多不同类型的服务,它们的实现方式和职能各不相同。服务之间的调用、组合和封装关系,以及它们之间的依赖关系,是理解微服务协作的关键。

1.1、服务的类型

根据DDD分层架构,微服务内部主要有以下几类服务:

  1. facade接口服务:位于用户接口层,包括接口和实现两部分。用于处理用户发送的RESTful请求和解析用户输入的配置文件,并将数据传递给应用层。完成应用服务封装,将DO组装成DTO,并将数据传递给前端应用。
  2. 应用服务:位于应用层。用于表述应用和用户行为,负责服务的组合、编排和转发,处理业务用例的执行顺序和结果拼装,对外提供粗粒度的服务。
  3. 领域服务:位于领域层。封装核心业务逻辑,实现需要多个实体协作的核心领域逻辑,对多个实体或实体方法的业务逻辑进行组合或编排。
  4. 基础服务:位于基础层。提供基础资源服务(如数据库、缓存等),实现各层的解耦,降低外部资源变化对业务应用逻辑的影响。主要为仓储服务,通过依赖倒置原则提供基础资源服务。
1.2、服务的调用

微服务的服务调用主要包括三类应用场景:

  1. 微服务内跨层服务调用

    • 前端应用通过API网关调用facade接口服务,facade接口服务定向到应用服务。
    • 应用服务作为组织者和编排者,调用并组装领域服务或直接调用仓储服务。
  2. 微服务之间的服务调用

    • 应用服务通过API网关访问其他微服务的应用服务,采用同步方式实现数据强一致性。
    • 跨微服务的数据新增和修改操作需要关注分布式事务,保证数据的强一致性。
  3. 领域事件驱动

    • 微服务内的领域事件通过事件总线完成聚合之间的异步处理,微服务之间的领域事件通过消息中间件完成。
1.3、服务的封装与组合

微服务的服务是从领域层逐级向上封装、组合和暴露的:

  1. 基础层:主要服务形态是仓储服务,包括仓储接口和仓储实现两部分。仓储实现服务完成领域对象的持久化或提供数据初始化所需的PO数据。
  2. 领域层:负责表达领域模型业务概念、业务状态和业务规则,主要服务形态有实体方法和领域服务。实体采用充血模型,实体类内部实现所有业务逻辑,领域服务对多个实体或实体方法进行组合和编排。
  3. 应用层:主要面向前端应用和用户,通过服务组合和编排实现粗粒度的业务行为。应用服务负责服务的组合、编排和转发,处理业务用例的执行顺序和结果拼装。
  4. 用户接口层:完成DO和DTO的互转,通过facade接口服务将数据传递给应用层或获取应用服务的数据后进行数据组装,向前端提供数据服务。
1.4、两种分层架构的服务依赖关系

DDD分层架构有一个重要原则:每层只能与其下方的层发生耦合。分层架构可以分为两种:

  1. 松散分层架构:领域层的实体方法和领域服务可以直接暴露给应用层和用户接口层。只需要满足上层服务依赖下层的要求,可以跨层调用,无须逐级封装。
  2. 严格分层架构:任何层只能与其直接下方的层发生依赖,服务需要逐层组合和封装。虽然增加封装工作量,但服务边界清晰,服务的依赖关系相对可控。
2、数据视图

在DDD中,微服务内的数据对象主要包括数据持久化对象(PO)、领域对象(DO)、数据传输对象(DTO)和视图对象(VO)。这些数据对象在不同层次和阶段承担不同的职能。

  1. 数据持久化对象(PO):与数据库结构一一映射,是数据持久化过程中的数据载体。
  2. 领域对象(DO):微服务运行时核心业务对象的载体,包括实体或值对象。
  3. 数据传输对象(DTO):用于前端应用与微服务应用层或微服务之间的数据组装和传输,是应用之间数据传输的载体。
  4. 视图对象(VO):用于封装展示层指定页面或组件的数据。

这些数据对象的职责和转换过程如下:

  1. 基础层

    • DO和PO的映射关系,大多数情况下DO和PO是一一对应的,也有多对多情况。DO需要持久化时,先将DO转换为PO对象,由仓储实现服务完成数据库持久化操作。
    • 当DO需要构建和数据初始化时,由仓储实现服务先从数据库获取PO对象,将PO转换为DO后,再完成DO数据构建和初始化。
  2. 领域层

    • 主要是DO对象。DO是实体和值对象的数据和业务行为载体,承载着核心业务逻辑,多个依赖紧密的DO对象构成聚合。
  3. 应用层

    • 主要对象有DO和DTO对象。应用层进行服务组合和编排时,建议采用聚合根ID的引用方式,避免不同聚合之间的DO对象直接引用,避免聚合之间产生依赖。
  4. 用户接口层

    • 完成DO和DTO的互转,通过facade接口服务将数据传递给应用层或获取应用服务的数据后进行数据组装,向前端提供数据服务。

本章小结

本章分析了DDD分层架构下微服务的服务和数据协作关系。通过在每层定义不同职责的服务和数据对象,实现了聚合之间以及微服务各层之间的解耦。严格遵守各层服务和数据的职责要求,可以保证核心领域模型的稳定,实现解耦,同时灵活应对外部需求的快速变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51889.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Golang | Leetcode Golang题解之第301题删除无效的括号

题目&#xff1a; 题解&#xff1a; func checkValid(str string, lmask, rmask int, left, right []int) bool {cnt : 0pos1, pos2 : 0, 0for i : range str {if pos1 < len(left) && i left[pos1] {if lmask>>pos1&1 0 {cnt}pos1} else if pos2 <…

FFmpeg实战 - 解复用解码

文章目录 前置知识音视频基础概念解复用、解码的流程分析FFMPEG有8个常用库 常见音视频格式的介绍aac格式介绍h264格式介绍flv格式介绍mp4格式介绍 FFmpeg解码解封装实战数据包和数据帧&#xff08;AVPacket/AVFrame&#xff09;AVPacket/AVFrame的引用计数问题API介绍注意事项…

vue3实现elementui表格操作栏宽度自适应

根据表格的Table-column 属性&#xff0c; 我们可以在操作栏中添加 :render-header"renderHeader" 然后通过js获取当前操作栏存在多少个按钮&#xff0c;去动态计算需要设置列宽为多少&#xff1b; <el-table-column fixed"right" :label"t(tabl…

实习日志2之windows上大模型(qwen2-7b)部署

一、模型部署 1、下载ollama(大模型本地部署工具)&#xff0c;并安装 下载网址&#xff1a;https://ollama.com/ ollama是大模型部署方案&#xff0c;对应docker&#xff0c;本质也是基于docker的容器化技术。 2、下载大模型 在命令框&#xff0c;如windows系统在cmd窗口输…

详解方向导数

详解方向导数 flyfish 方向导数是描述了函数在某一特定方向上的变化率。具体来说&#xff0c;给定一个多元函数 f ( x , y , z , … ) f(x, y, z, \ldots) f(x,y,z,…) 和一个方向向量 v \mathbf{v} v&#xff0c;方向导数表示函数 f f f 沿着向量 v \mathbf{v} v 方向的…

笔试练习day1

目录 数字统计题目解析解法(枚举数字拆分)代码 两个数组的交集题目解析解法哈希表代码 点击消除题目解析解法栈代码 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 &#x1f412;&#x1f412;&#x1f412; 个人主页 &#x1f978;&#x1f978;&#x1f97…

C++ //练习 16.5 为6.2.4节(第195页)中的print函数编写模板版本,它接受一个数组的引用,能处理任意大小、任意元素类型的数组。

C Primer&#xff08;第5版&#xff09; 练习 16.5 练习 16.5 为6.2.4节&#xff08;第195页&#xff09;中的print函数编写模板版本&#xff0c;它接受一个数组的引用&#xff0c;能处理任意大小、任意元素类型的数组。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&a…

SQL中有多少Statements

SQL&#xff08;Structured Query Language&#xff09;是一种用于管理和操作关系型数据库的标准编程语言。SQL语句的种类繁多&#xff0c;它们被设计来执行不同的数据库操作&#xff0c;如数据查询、数据更新、数据定义&#xff08;如表和索引的创建&#xff09;等。由于SQL语…

开源AI智能名片小程序源码在对立型定位策略中的应用与深入探索

摘要&#xff1a;在当今数字化营销风起云涌的时代&#xff0c;开源AI智能名片小程序源码作为技术创新的前沿阵地&#xff0c;为中小企业及后发创业品牌提供了实现差异化竞争与市场突破的利器。本文旨在深入探讨开源AI智能名片小程序源码如何有效融入对立型定位策略之中&#xf…

程序员面试中的“八股文”:敲门砖还是绊脚石?

在现代技术行业中&#xff0c;“八股文”成为了程序员面试中的常见问题。“八股文”究竟能否在实际工作中发挥应有的作用&#xff0c;成了一个备受争议的话题。许多IT从业者都提出疑问&#xff1a;程序员面试到底考察的是什么&#xff1f;是工作能力、工作经验&#xff0c;还是…

二进制部署k8s集群之master节点和etcd数据库集群(上)

目录 1.操作系统初始化配置 2.升级Linux内核 3.部署docker引擎 4.部署etcd集群 4.1 了解etcdctl工具对etcd做增删改查 4.2 通过etcdctl工具实现数据库的备份和恢复 5.部署Master组件 6.部署 Worker Node 组件 二进制搭建 Kubernetes v1.20 k8s集群master01&#xff1a…

【Cyber RT】Apollo Cyber RT安装, 环境搭建,test ok

一、下载源码 克隆Apollo 源码仓库 git clone https://gitee.com/ApolloAuto/apollo.git (耗时30min) 二、启动Apollo Docker 开发容器 进入到Apollo源码根目录,执行下述命令以启动Apollo Docker开发容器 cd apollo ./docker/scripts/dev_start.sh 如果只是使用Cyber…

经典文献阅读之--GraphAD(端到端自动驾驶的交互场景图)

Tip: 如果你在进行深度学习、自动驾驶、模型推理、微调或AI绘画出图等任务&#xff0c;并且需要GPU资源&#xff0c;可以考虑使用UCloud云计算旗下的Compshare的GPU算力云平台。他们提供高性价比的4090 GPU&#xff0c;按时收费每卡2.6元&#xff0c;月卡只需要1.7元每小时&…

Elasticsearch模糊查询之Wildcard

{“wildcard” : { “LPR.keyword” : { “wildcard” : “${Keyword}”} }},你的示例中使用了 wildcard 查询&#xff0c;它适用于模糊搜索&#xff0c;允许使用通配符&#xff08;* 和 ?&#xff09;来匹配字段值。你使用了 keyword 子字段来确保精确匹配&#xff0c;这是一…

使用IPIDEA海外代理助力宠物跨境电商1.1

3.如何获取具体分类的数据&#xff1f; 以前我们做选品&#xff0c;通常会招聘多个运营专员&#xff0c;每隔几小时去亚马逊平台上查看猫狗商品数据&#xff0c;然后人工把数据一条一条复制粘贴下来。通常一遍做下来&#xff0c;1-2小时就过去了&#xff08;根据数据样本的大小…

typescript 定义类型

type infoType string; let name: infoType "全易"; let location: infoType "北京"; // let age: infoType 18; // 报错 infoType string&#xff5c;number 就不报错了 let job: infoType "开发"; let love: infoType "吃喝玩乐&q…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 围棋的气(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试D卷目录,全、新、准,题目覆盖率达 95% 以上,支持题目在线…

Spring-原理篇-DispatcherServlet 初始化 怎么和IOC进行了打通?

委托模式的体现&#xff0c;在初始化醒目的时候Spring MVC为我们提供了一个DispatcherServlet&#xff0c;映射了所有的路径&#xff0c;所有的请求都会先到达这里然后被转发到具体的Controller 进行处理&#xff0c;此文来探索一下&#xff0c;DispatcherServlet 初始化的时候…

Spring Cloud Security

Spring Cloud Security是什么 Spring Cloud Security是一个为Spring Cloud应用程序提供安全性的框架。它基于Spring Security&#xff0c;并集成了额外的功能来帮助开发人员保护微服务架构中的应用程序。Spring Cloud Security提供了认证和授权的功能&#xff0c;可以轻松地将安…

Hive之扩展函数(UDF)

Hive之扩展函数(UDF) 1、概念讲解 当所提供的函数无法解决遇到的问题时&#xff0c;我们通常会进行自定义函数&#xff0c;即&#xff1a;扩展函数。Hive的扩展函数可分为三种&#xff1a;UDF,UDTF,UDAF。 UDF&#xff1a;一进一出 UDTF&#xff1a;一进多出 UDAF&#xff1a…