微服务依赖管理 - 治理还是领域驱动设计?

2024-02-09

背景:由于长期的单体式痛苦,一家采用联邦模式的国际公司正在转型为微服务。能够快速部署的自治团队是非常理想的。尽管理论上如此,但服务确实相互依赖以获得更高的功能,但它们是自治的(独立开发和部署)。由于这是联邦模式和分散控制,我们不能像联合国那样施加严格的规则。由于不同国家生产的多个版本,如果没有一个治理平台来管理其他依赖关系,我们预计会出现无法控制的混乱。

我们将需要协作的微服务集称为“兼容性集”。可以部署服务,但可能无法满足其兼容性集中的更高功能。例如,MicroService A-4.3 是完全自主、部署和运行良好的。然而,为了满足 BusinessFunctionality 8.6,它必须与 MicroService B-5.4 和 MicroService C-2.9 配合使用。它们一起(A-4.3、B-5.4 和 C-2.9)形成“兼容性集”

解决这个困境有两种方法。现实生活中的微服务,橡胶上路,从经验中学习开始......

方法1)治理平台

基本原理: 100 多个国家/地区的国际公司的联邦模式。这意味着中央IT可以制定模型,但各个国家可以选择自己的命运——而且他们经常这样做。它经常陷入混乱,中央 IT 团队陷入困境。 DDD 是理想世界的解决方案,在该理想世界中,版本不一致不会破坏功能,例如发布不适合兼容性集的服务,单独而言无可指责,但它们一起崩溃或导致有缺陷或不一致的功能。

  • 没有同质性,甚至没有术语标准化
  • 开发人员技能混合,许多是初级人员,许多人正在学习反应式编程和云原生技术
  • 有界上下文在很大程度上依赖于共享词汇,它可能会变得微妙,但在运行多个版本的国际化、混合技能、碎片化场景中,这是不可能强制执行和天真的假设
  • 在这样的异构系统中,单一业务模型的标准化是不现实的(但理想)

当中央 IT 部门对这种混乱负有责任时,他们该怎么办?

实施治理平台创建微服务治理系统或框架来实施依赖关系管理。它通过清单在设计和运行时验证和强制执行对特定微服务的依赖关系,并执行一些检查和平衡以验证所提供的服务实现 - “兼容性集”。

方法 2)领域驱动设计(DDD)DDD 是对不断发展的领域进行建模,领域专家(通常是业务利益相关者,或者可能是分析师)将与开发人员一起设计系统。在每个领域内,都会形成一种普遍存在的语言,因此在该上下文中,相同的单词始终表示相同的事物。需要认识到的一件重要的事情是,在系统的某个部分中,“订单”可能意味着一件事,例如可能意味着产品列表。在系统的另一部分,“订单”可能意味着其他东西,它可能意味着发生的金融交易。这就是您描述的模型可能失败的地方,如果我的服务需要获取订单列表,也许有一种功能可以提供订单列表,但它们是哪些订单?产品清单还是金融交易?尝试协调尽可能多的开发人员都使用相同的语言是一项不可能完成的任务,注定会失败。

在 DDD 中,DDD 并没有尝试在系统级别进行管理并强制每个服务使用相同的订单定义,而是接受了协调涉及大量开发人员的大型部署的固有复杂性,并允许每个团队独立工作,根据需要与其他团队进行协调,而不是通过某些集中的依赖管理系统。 DDD 中使用的术语是有界上下文,其中在一个上下文中,顺序意味着一件事,而在另一个有界上下文中,顺序可以意味着另一件事。这些上下文可以真正自主地运行——您将您的服务描述为自治的,但是如果它们必须通过注册并向中央注册表提供依赖项来将其顺序定义与整个系统相匹配,那么它们实际上与系统的其余部分紧密耦合。系统及其所认为的订单是什么——您最终会遇到单体应用的所有痛苦耦合,以及构建分布式系统的所有痛苦,并且如果您尝试采用这种方法,您将不会意识到微服务的许多好处方法。

因此,基于 DDD 的方法不会尝试采取严厉的方法在系统级别强制执行依赖项或功能,相反,它允许各个团队在不需要中央协调的情况下工作,如果服务 A 需要与服务 B 交互,那么管理服务 A 的团队将与管理服务 B 的团队合作,他们可以在有界上下文之间构建接口,并就该接口的语言达成一致。这些团队需要管理彼此之间的依赖关系,在系统级别,事情可能保持相当不透明/不强制执行。

我们经常看到人们实施“微服务”,但最终得到的系统与整体系统一样,甚至更不灵活,而且往往更脆弱。也称为“Minilith”或“Monolith 2.0”微服务需要对架构和软件开发流程进行彻底的重新思考,不仅需要允许服务自治和独立管理,还需要团队独立,而不是集中管理。集中管理系统中的依赖项和功能可能会成为成功构建基于微服务的系统的阻碍。

诚邀明智而务实的评论...

方法 1(治理)是务实和战术性的,旨在解决非常现实的挑战。问题是——这会破坏企业的长期战略DDD模式吗?

方法 2 (DDD) 是理想且令人向往的,但并没有解决我们现在必须应对的真正挑战。

意见?想法?评论?


我见过跨国公司试图在一个项目上进行合作(或者由中央 IT 团队控制),这简直就是一场噩梦。这个回答对于我个人读到和看到的内容来说是非常主观的,所以这只是我的意见,可能不是每个人的意见。一般来说,Stack Overflow 上不鼓励提出广泛的问题,因为它们会吸引高度固执己见的答案。

我想说 DDD 可能不是答案。您需要大量开发人员来接受 DDD 理念。如果您没有这种支持(除非您拥有一支由非常自我激励的人员组成的团队),您将看到开发人员尝试在现有数据库的基础上构建新系统。

我还认为微服务不是答案 https://plainoldobjects.com/2016/03/01/thoughts-on-if-you-cant-build-a-well-structured-monolith-what-makes-you-think-microservices-is-the-answer/。使用微服务来发挥其优势的公司本质上是利用微服务将代码划分为小型的、单独运行的服务/应用程序堆栈,每个服务/应用程序只执行一项工作。这些微服务(从我见过的成功案例来看 https://www.infoq.com/news/2015/12/microservices-spotify)往往是松散耦合的。我想,如果您有大量高度耦合的服务,那么您仍然会遇到单体应用的意大利面条般的情况,但是通过网络传播 https://en.wikipedia.org/wiki/Fallacies_of_distributed_computing.

听起来您只需要一个架构良好的系统,专为您的特定需求而设计。我同意使用 DDD 会很棒,但是对于跨国项目来说这是一个现实的目标吗?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

微服务依赖管理 - 治理还是领域驱动设计? 的相关文章

  • DDD和应用层

    我在DDD中添加 Stateful Stateless WebService等是应用层 应用服务 吗 从下面的链接来看 这似乎是正确的 第二个问题 我创建了一个存储库类 所有涉及存储库的方法调用都应该包装在应用程序服务中吗 或者我可以直接在
  • Spring MVC - 从另一个休息服务内部调用休息服务

    目前 我在从一个 REST 服务内部调用另一个 REST 服务时遇到了一个非常奇怪的问题 我真的可以帮忙找出我做错了什么 首先 了解一些背景 我有一个 Web 应用程序 它调用 REST 服务来创建用户帐户 为了便于说明 端点是 local
  • 使用 Application Load Balancer 在 aws ECS 上进行服务发现

    我想问一下 您是否有一个微服务架构 基于Spring Boot 涉及Amazon Elastic Container Service ECS 和Application Load Balancer ALB 服务发现是由平台自动执行的 还是需要
  • 使用 Google Cloud Functions 实现微服务的 API 网关

    Inputs 例如 我们有一些服务 账户服务 产品服务 支付服务 每项服务都是一个单独的 Google Cloud Function 每个服务都有自己的 HTTP API 例如 账户服务有 https REGION FUNCTIONS PR
  • NPM5,package-lock.json 与 package.json 有什么区别?

    将NPM更新到版本5后 我发现package lock json包含 package json 的文件 这两个文件有什么区别 有什么优点package lock json package json 文件 列出您的项目所依赖的包 允许您使用语
  • 有界上下文、子域和通用语言

    a 对于包含两个或多个子域的 BC 存在概念重叠的可能性 甚至更糟糕的是 相同的概念 由其中几个子域使用 可能会被每个子域以不同的方式解释 理解 无论如何 如果 BC 确实包含许多子域 它是否应该提供几种通用语言 每个子域一种 或者所有子域
  • Spring Boot - 微服务之间如何通信?

    我目前正在开发一个 Spring Boot 微服务项目 我创建了服务 每个服务都单独运行 这样 我需要一些服务来与其他服务进行通信 我怎样才能做到这一点 我看到一些关于此的博客使用 Netflix Eureka 云服务器来实现这一点 有什么
  • Heroku 负载均衡器与 Netflix zuul

    根据这个答案https stackoverflow com a 41811770 2849613 https stackoverflow com a 41811770 2849613我想获得更多有关 Heroku 上微服务最佳实践的信息 问
  • 有丰富的领域模型示例吗? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个简单的示例来说明使用富域模型的好处 理想情况下 我想要一个之前和之后的代码列表 应该尽可能
  • 如何根据操作系统系列拥有不同的依赖关系

    我正在编写一个跨平台库 它具有特定于平台的依赖关系 一个用于类 UNIX 平台 一个用于 Windows 这些板条箱仅在特定平台上编译 因此我不能正常地将它们全部添加到依赖项下 在我实际使用的 Rust 代码中cfg属性 例如 cfg un
  • 使用流程管理器(又名 saga)在同一有界上下文中跨聚合根实现最终一致性

    假设您的有界上下文中有两个聚合 它们之间存在一些约束 使用 DDD 这些内部聚合约束不能在同一事务中强制执行 即聚合边界是事务边界 您是否会考虑使用 Microsoft CQRS 旅程中所谓的 流程管理器 来协调同一有界上下文中的两个聚合
  • 领域驱动设计:处理原子操作和事务

    必须保证每个聚合内部的一致性 在存储库中执行此操作很容易 因为我始终可以使用数据库或框架中的事务 我对存储库之外发生的事情表示怀疑 一项服务可能需要使用多个聚合来处理请求 在服务处理过程中或在保留聚合时可能会出现问题 如果服务处理过程中出现
  • 无法访问集群端点,请检查是否存在连接/防火墙/DNS 问题

    我目前正在研究云技术 在我当前的一个项目中 我在 Azure 中创建了服务结构集群 然后我尝试通过 Windows PowerShell 连接到集群 我收到错误 无法访问集群端点 请检查是否存在连接 防火墙 DNS 问题 请告诉我如何解决上
  • Spring OAuth2 Keycloak Kubernetes 内部/外部访问

    我在 Kubernetes 集群内配置了 Keycloak 10 0 3 服务器 keycloak 服务器必须处理外部用户的身份验证 使用外部 url 并处理用于 Spring 微服务通信的 oauth2 令牌 然后Web应用程序Sprin
  • 断路器和隔板式有什么区别?

    在微服务开发过程中 我们可以在Spring Boot中同时使用两者吗 这些都是从根本上不同的图案 The 断路器模式在消费者上实现 以避免压垮可能难以处理呼叫的服务 可以找到 Spring 中的示例实现here http www vinsg
  • 寻找领域事件的例子

    有谁知道在哪里可以找到域事件实现的示例代码 如乌迪 达汉 http www udidahan com in 领域事件 救赎 http www udidahan com 2009 06 14 domain events salvation 在
  • Swift 包管理器:“多个目标名为...”

    我正在尝试构建一个服务器端 Swift Web 应用程序 我的应用程序的基础框架将是Kitura https www kitura io来自IBM 此外 我还想利用AWS SDK Swift https github com noppoMa
  • 将 F# 类型保存到数据库

    A lot http gorodinski com blog 2013 02 17 domain driven design with fsharp and eventstore f 文章数推荐 http fsharpforfunandpr
  • 您可以在 setuptools 中设置 Python 2 和 3 的条件依赖关系吗?

    当发布同时支持 Python 2 和 3 的 Python Egg 时 您能否指定根据您使用的版本而变化的依赖项 例如 如果您使用dnspython对于 Python 2 有一个 Python 3 版本 称为dnspython3 你能写你的
  • 依赖解析算法

    我正在编写一个包管理器 为此我希望依赖项解析尽可能强大 每个包都有一个版本列表 每个版本包含以下信息 具有可比性的 ID 依赖关系 软件包列表以及每个软件包的一组可接受的版本 冲突 软件包列表以及每个软件包的一组与该版本一起导致问题的版本

随机推荐

  • 如何让 Docker 容器在本地主机上运行时相互通信?

    我的 MacBook 上有一个完全本地运行的 Web 应用程序 Web 应用程序有一个前端 Angular Javascript 和一个实现 RESTful API 的后端 Python Django 我对后端进行了 Docker 化 使其
  • Google App Engine Servlet 中的 ResourceBundle 未按预期工作

    有人可以帮助我理解为什么使用国际化ResourceBundle在 Google App Engine Servlet 中的工作方式与在命令行 Java 应用程序中的工作方式不同吗 以下片段 ResourceBundle resource e
  • 如何查看本地文件系统上的 Jenkins 服务器控制台输出?

    我正在使用 Jenkins Active Directory 插件 多次尝试后仍无法登录 错误消息显示 If you are a system administrator and suspect this to be a configura
  • Octave 中的 1-of-K 编码

    我正在尝试在 Octave 中获取整数向量的二进制 K 编码 我有一个向量y say y 1 2 3 1 3 我想要一个矩阵 Y 1 0 0 0 1 0 0 0 1 1 0 0 0 0 1 我可以手动构造一个 K 矩阵 Y Y Y y 1
  • 如何在opencv或emgu cv中检测三角形边缘?

    我使用Emgu CV 我想检测图片中的两个锐点 首先我将图像转换为灰度 然后调用cvCanny 然后调用FindContours 但只找到一个轮廓 没有找到三角形 Code public static void Do Bitmap bitm
  • 组合的解解析器/解析器生成器

    是否有一个解析器生成器也实现了相反的方向 即从相同的语法规范中解析域对象 又名漂亮打印 据我所知 ANTLR不支持这个 我已经用 Java 和 Kotlin 实现了一组可逆解析器组合器 解析器几乎是用 LL 1 风格编写的 它提供了解析方法
  • Visual Studio 中 ASP.NET Core 项目的“REST API 客户端”选项?

    我已经在 Azure 中启动并运行了 ASP NET REST API 从 Visual 中较旧的 NET 4 5 项目中 我使用此菜单选项生成了一个客户端 但是当我创建一个新的 ASP NET Core ASP NET 5 项目 并且想要
  • WCF WebService - 有没有办法确定客户端收到响应?

    假设我有一个 WCF 服务 客户端可以使用该服务从某个服务器端消息队列接收消息 举个例子 假设数据表中有一个服务器端电子邮件队列 ID MESSAGE TEXT SENT 1 Hi N 2 A 2nd Msg N 让我们将我们的服务定义为
  • C 中的“CALLBACK”声明有什么作用?

    我正在查看一些代码SDL http www libsdl org库并遇到了这样声明的函数 LRESULT CALLBACK WndProc HWND hwnd UINT msg WPARAM wParam LPARAM lParam 现在
  • Apigee - 配置 API 代理时出现问题

    我正在寻找一种方法将客户的 WCF 服务公开为 REST 服务 并创建所有安全堆栈以支持声明 oauth 身份验证和授权 我正在研究两种不同的方法来做到这一点 创建一个新的 REST 服务 它将充当代理 将我的 WCF 服务公开为 REST
  • 使用 PHP 根据 Schematron 验证 XML

    有很多关于 Schematront 的资源 但是我找不到任何相关内容或有关如何根据 Schematront sch 文件验证 xml 的示例 Anyone 我已经发现 1 或 2 个非常旧的类会返回错误 所以如果有人知道如何做到这一点 请提
  • Google Play 服务过期错误

    我的 google play service 有问题 我正在使用 Google API 进行 oAuth2 身份验证和日历 Gmail 信息 昨天一切正常 但今天他告诉我 我需要更新版本的 Google PLay 服务 Android St
  • 客户我的帐户订单历史记录中不显示自定义订单状态

    在 WooCommerce 中 我制作了 2 个自定义订单状态 第一个是 运输状态 另一个是 批准状态 在我将一些订单状态更改为这两个新状态 分别是shipping or approved 客户无法在其订单历史记录页面查看此订单 这是我的代
  • git merge --strategy 与 --strategy-option

    git merge 选项有什么区别 strategy option short X and strategy short s 有很多关于合并策略 https stackoverflow com questions 366860 when w
  • switch 因被 JSHint 忽略而失败

    我正在运行我的代码JSHint http www jshint com 我遇到了这个错误 预计break之前的声明case 在这段代码中 switch true Renames skill1 abc to section 8 1 body
  • 如何向远程服务器添加 ssh 密钥? [关闭]

    Closed 这个问题是与编程或软件开发无关 help closed questions 目前不接受答案 在我的 VPS 中 运行ssh add l它返回 The agent has no identities 但我已经跑了cat ssh
  • 如何在 Ruby 中删除字符串中的最后一个元音?

    如何定义字符串中的最后一个元音 例如 我有一个词 经典 我想找到单词 class 的最后一个元音ic 是字母 i 并删除最后一个元音 我在想 def vowel str result new str split i new length 1
  • 解决方法:汇总下游测试结果

    据我所知 聚合下游测试结果 功能并没有按预期工作 并且很难找到有用的文档 我想实现非常相似的功能 Job Build触发工作T1 T2并行 其中T1FindBugs T2PMD 场景一 立刻T1 and T2已完成 我可以使用 加入 插件来
  • 如何使用参数传递对函数的引用? [复制]

    这个问题在这里已经有答案了 可能的重复 如何在 JavaScript 函数调用中预先设置参数 部分功能应用 https stackoverflow com questions 321113 how can i pre set argumen
  • 微服务依赖管理 - 治理还是领域驱动设计?

    背景 由于长期的单体式痛苦 一家采用联邦模式的国际公司正在转型为微服务 能够快速部署的自治团队是非常理想的 尽管理论上如此 但服务确实相互依赖以获得更高的功能 但它们是自治的 独立开发和部署 由于这是联邦模式和分散控制 我们不能像联合国那样