USDT自动充值

菜宝钱包(caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

作者 | Sam Newman、Leandro Guimar es

译者 | 平川

服务迁徙不是一个小更改。你必须搞清晰它是否真的能解决你的问题,否则你可能会建立一个会杀死你的、乱糟糟的实体。单体有差别类型,其中一些可能是有用的,足以知足营业需求。单体不是一个应该被杀死的敌人。微服务关乎自力部署。有一些剖析和增量更改模式可以辅助你评估并迁徙到微服务架构。当你更先使用微服务时,你会意识到随之而来的是一系列异常庞大的挑战。以是不应该将微服务作为默认选择。你得仔细思量它们是否适合你。

本文基于 Sam 在伦敦 QCon 大会上的演讲纪录,由 Leandro Guimar es 整理,并由 Sam 审阅。

在伦敦 QCon 大会上,我谈到了单体剖析模式以及我们若何杀青微服务。我喜欢把它们比作令人讨厌的水母,由于它们是一种乱糟糟的实体,会刺痛甚至可能杀死我们。这在通常的企业微服务迁徙中很常见。

许多组织正在履历某种数字化转型。随便看下当前的任何数字化转型,我们都市发现微服务的身影。我们知道,数字化转型是一件大事,由于现在任何机场候机室都有大型 IT 咨询公司的广告推销数字化转型,包罗德勤、DXC、埃森哲等公司。微服务异常盛行。

不外,在谈及微服务时,我关注的是效果,而不是我们用来实现它们的手艺。我们选择微服务架构的缘故原由有许多,但我频频提到的一个缘故原由是其自力部署的属性。有一个功效,一个我们想要改变系统行为的更改。我们想要尽快实现这个更改。

图 1:微服务方式示意图

将微服务架构与单体做下对照。我们以为,单体是一个单一的、无法透视的块,我们无法对它作出任何更改。单体被以为是我们生涯中最糟糕的器械,是难以脱节的沉重负担。我以为这异常不公平。最终,“单体”一词在已往两三年里取代了我们之前使用的“遗留问题(legacy)”一词。这是一个基本性问题,由于有些人更先将单体视为遗留问题,是需要移除的器械。我以为这异常不合适。

1

单体的类型

单体有多种形式和规模。在讨论单体应用程序时,我主要是将单体作为部署单元来讨论。思量下经典的单体,它是将所有代码打包在单个历程中。它可能是 Tomcat 中的一个 WAR 文件,也可能是一个基于 PHP 的应用程序,所有代码都打包在一个可部署单元中,该单元会与数据库通讯。

这种单体类型可以看作是一个简朴的漫衍式系统。漫衍式系统是由多台通过非本地 *** 相互通讯的盘算机组成的系统。在这种情形下,所有的代码都打包在一个历程中,主要的是,所有数据都保留在于一个运行在差别机械上的大型数据库中。把所有数据都放在一个数据库中,未来会给我们带来许多痛苦。

图 2:模块化单体

我们还可以思量下单历程单体的一种变体,称为模块化单体。这种模块化单体使用了关于结构化编程的前沿头脑(诞生于 20 世纪 70 年月初,几十年后,我们中的一些人仍在起劲掌握这些头脑!)。如图 2 所示,我们将单历程单体应用程序剖析为模块。若是我们准确地划分了模块界限,我们就可以自力地处置每个模块。然则,本质上,部署历程仍然是静态链接的方式:我们必须链接好所有模块才气举行部署。好比一个 Ruby 应用程序,它由许多 GEM 文件、NuGet 包或通过 Maven 组装的 JAR 文件组成。

虽然我们仍然是单体部署,但模块化单体有一些显著的利益。把代码剖析成模块确实可以让我们在一定程度上自力地完成事情。它可以利便差其余团队一起事情,并处置系统的差别方面。我以为这是一个被严重低估的选项。这其中存在的问题是,人们往往不善于界说模块界限――更确切地说,纵然他们善于界说模块界限,他们也不善于保持这些界限。遗憾的是,结构化编程或模块化的观点往往会遭遇“泥球”问题。

对于我服务过的许多组织来说,使用模块化单体比使用微服务架构会更好。在已往的三年里,我对我一半的客户说过:“微服务不适合你。“有些客户甚至听了我的话。对于它们中的许多来说,一种可以界说模块界限的好方式就足以知足它们的需要。他们可以获得一个对照简朴的漫衍式系统,以及一定程度上自力、自主地事情。

图 3:模块化单体的一种变体

模块化单体也有变体。图 3 看起来有点新鲜,但这是我多次提出的建议,稀奇是对于初创公司,我通常以为,他们更好不要着急上微服务。如图 3 所示,我们使用了模块化单体,并将后台单个的整体数据库举行了剖析,这样就可以单独存储和治理每个模块的数据。

虽然这看起来很新鲜,但归根结底这是一种对冲架构。人们认识到,剖析单体架构时最难题的事情之一是处置数据层。若是我们能提前设计好与这些模块相关联的自力数据库,以后迁徙到单独的微服务就会更容易。若是我正在处置模块 C,我对与模块 C 关联的数据具有完全的所有权和控制权。当模块 C 酿成一个单独的服务时,迁徙它应该会更容易。

当我还在 ThoughtWorks 事情时,我的一位老同事 Peter Gillard-Moss 第一次向我展示了这种模式。这是他为我们正在开发的一个内部系统设计的。他说,“我以为这能行。我们不确定我们是否想要提供服务,以是也许它应该是一个单体。”

我说,“试一试。看看会发生什么。“约莫 6 年已往了,去年我和 Peter 谈过,ThoughtWorks 仍然没有改变架构。它仍然运行得很欢快。他们让差其余人处置差其余模块,纵然是在这个级别上将数据星散开来,也给他们带来了伟大的利益。

图 4:漫衍式单体

现在,我们来看看最糟糕的单体――漫衍式单体。我们的应用程序代码现在运行在相互通讯的自力历程上。不管出于什么缘故原由,我们都必须将整个系统作为一个单元同步部署。经常,这种情形的泛起是由于我们弄错了服务界限。我们将营业逻辑胡乱地放在了差其余层上。我们没有遵从关于耦合和内聚的要点,现在,我们的结账逻辑漫衍在服务栈中 15 个差其余地方。我们要做任何事情,都必须协调多个团队。若是组织中存在大量的横切更改,通常解释组织界限或服务界限界说的纰谬。

漫衍式单体的问题在于,它本质上是一个加倍漫衍式的系统,然则对于所有相关的设计、运行和操作挑战,我们仍然需要单体需要的那些协调流动。我想在线部署,但我不能。我必须等你完成更改,但你也完不成,由于你在等别人。现在,我们一致同意:“好吧,7 月 5 日,我们将一起上线。每个人都准备好了吗?三、二、一,部署。“固然,一切都很顺遂。对于这类系统,我们从来没有遇到过任何问题。

若是一个组织有一位 *** 的公布协调司理或这方面的其他职位,那么他们可能有一个漫衍式单体。协调漫衍式系统的同步部署一点都不好玩。我们最终会支出更高的更改成本。部署的局限会大许多,可能会有更多的地方失足。这种难以避免的协调流动,不只存在于公布流动中,而且存在于一样平常部署流动中。

稍微看下精益生产的内容就会发现,削减交接是优化生产力的要害。守候别人为我做点什么只会发生虚耗。这会导致生产力瓶颈。为了更快地交付软件,削减交接和协调异常要害。遗憾的是,漫衍式单体往往会缔造出不得不举行协调的环境。

有时,我们的问题不在于服务界限在那里。有时,它完全是始于我们开发软件的方式。有些人从基本上误解了公布序列。公布序列一直被以为是一种治疗性的公布手艺,而不是一种进取性的流动。我们会选择像公布序列这样的器械来辅助组织转向连续交付。公布序列的观点以定期为基础,也许每周围,软件的所有部门已经准备就绪。若是软件还没有准备好,它就会被推迟到下一个公布序列。对许多组织来说,这是向前迈出了一步。我们应该缩小公布序列之间的距离,最终完全消除。然而,有太多的组织在接纳了公布序列就再也没有继续前进。

当若干团队都朝着统一个公布序列而起劲时,所有已经准备好的软件都市在这个公布序列中交付――突然之间,我们会一次性部署大量的服务。这是真正的问题所在。当实践公布序列时,最主要的一件事是,至少要将这些公布序列剖析,使它们成为团队公布序列。允许差其余团队放置自己的公布序列。最终,我们应该甩掉这些序列。它们应该只是迈向连续交付的一个步骤。

遗憾的是,一些营销迅速的优秀成果已经将公布序列作为交付软件的最终方式。我们知道他们已经这么做了,由于许多公司组织里挂着的 SAFe 图解上都印着“公布序列”的字样。这不是好事。不管是对于 SAFe,照样你遇到的任何其他问题,公布序列始终都是一种解救手艺,是自行车的辅助轮。我们应该向着连续交付继续前进。问题是,若是我们使用这些公布序列时间太长,最终的架构就会是一个漫衍式单体,由于我们已经习惯了将所有服务部署在一起。要注意这一点。这可能不会在一夜之间发生。我们可以从支持自力部署的架构更先,但若是我们使用公布序列太久,我们的架构就会更先围绕这些公布实践聚合在一起。

归根结底,漫衍式单体是一个问题,由于它同时具有漫衍式系统的所有庞大性和单个部署单元的瑕玷。我们应该跨越它,寻找更好的事情方式。漫衍式单体是一件很棘手的事情,关于若何处置这种情形的建议已经有许多。有时,准确的谜底是将其合并回单历程单体。然则,若是现如今我们有一个漫衍式单体,更好的设施是弄清晰为什么我们会有这样的单体,而且在添加任何新服务之前,着手让架构中的某些部门可以自力部署。在这种情形下,添加新服务很可能会增添我们开展事情的难度。

2

若何将单体迁徙到微服务架构

我们使用微服务架构是由于它具有自力部署的特征。我们希望能够在不改变其他任何器械的情形下将服务的更改部署到产物中。这是微服务的黄金规则。在演讲或文章中,这似乎很容易。在现实生涯中,要做到这一点要难题得多,尤其是思量到大多数人并非从零更先。绝大多数人都以为他们的系统太大了,想把它分成更小的部门。他们想知道从那里更先。

领域驱动设计(DDD)有一些很好的方式可以辅助我们找出服务界限。当与研究微服务迁徙的组织互助时,我们通常是从在现有的单体应用程序架构上执行 DDD 建模演习更先。我们这样做是为了弄清晰单体应用内部发生了什么,并从营业域的角度确定事情单元。

只管单体看起来像一个伟大的盒子,但当我们应用 DDD,并将逻辑模子投射到该单体上时,我们意识到,其内部被组织成订单治理、PDF 渲染、客户端通知等内容。虽然代码可能没有围绕这些观点举行组织,但从用户或营业领域模子的角度来看,这些观点存在于代码中。这些营业领域的界限(DDD 中通常称为“有界上下文”)就成为我们剖析的单元,缘故原由我这里就不展开讨论了。

图 5:找出单体中的剖析和依赖项单元

首先要做的是问下从那里更先,什么事情可以优先处置,我们的事情单元是什么。在图 5 所示的初始单体中,我们有订单治理、发票和通知。DDD 建模演习将使我们领会它们之间的关系。希望我们能得出一个有向无环图,来形貌这些差别功效之间的依赖关系。(若是我们获得是一个依赖关系的循环图,我们就得做更多的事情。)我们可以看到,在这个单体中,有许多器械都依赖于向客户发送通知的能力。那似乎是领域的焦点部门。

3

检查点:对于我遇到的问题,微服务是合适的解决方案吗?

我们可以更先问问题了,好比我们应该先提取什么。我可以完全从这个角度来看问题。我们可能会看到,通知被许多功效使用――若是微服务更好,那么提取系统中许多部门都在使用的器械将使更多的器械变得更好。也许我们应该从那里更先。然则,看看所有的入站依赖关系。由于有太多的部门需要通知功效,以是我们很难将其从现有的单体架构中剥离出来。在这个单体系统中,像结账或订单治理之类的观点似乎加倍自力。它们可能是更容易剖析的器械。决议从哪一部门更先,从基本上讲是一种渐进式剖析方式。

首先要记着,单体并不是敌人。我希望人人都好好地思索一下。人们将任何单体系统都视为问题。在已往几年里,我看到的最令人担忧的事情之一是,微服务现在似乎成了许多人的默认选择。

有人可能记得一句老话:“没有人会由于购置 IBM 产物而被开除。”意思是,由于其他人都在买 IBM 产物,你也可以买――若是你买的器械不适合你,那也不是你的错,由于人人都在这么做。你没必要冒险。现在每个人都在做微服务,我们也面临同样的问题。每个人都吵着要做微服务。这对我很有利益:我写关于该主题的书,但对你可能不是好事。

从基本上说,这取决于我们想要解决什么问题。我们想要到达而在当前的架构下无法到达的目的是什么?也许微服务是谜底,或者其他什么器械才是谜底。明白我们想要到达的目的至关主要,否则,我们将很难确定若何迁徙我们的系统。我们正在做的事情将改变我们剖析系统的方式,以及我们若何确定事情的优先级。

微服务迁徙不像一个开关,没有开 / 关切换。这更像是转动一个旋钮。在接纳微服务的历程中,我们转动一下旋钮,增添一两个服务。我们想看看一个服务若何发挥作用,它是否提供了我们需要的器械,是否解决了我们的问题。若是是,而且我们也满足,我们就可以继续转动旋钮。

不外,我看到许多人都市转动旋钮,增添 500 项服务,然后插上耳机,检查音量。这是让鼓膜破碎的好方式。我们不知道我们将要面临什么问题,那些问题在开发人员的笔记本电脑上碰不到。它们会在生产环境中泛起。当我们从提供一个单体系统转为一次性提供 500 个服务时,所有的问题都市同时泛起。不管我们最后是提供一项、两项照样五项服务,照样像 Monzo 那样拥有 800 项或 1500 项服务,我们都必须从一个小转变更先。我们需要选择一些服务来启动迁徙。让它们在生产环境中运行,积累履历,并尽快把这种履历付诸实践。通过逐步调整,以渐进的方式建立和公布新的微服务,我们可以更好地发现和处置泛起的问题。每个项目将要面临的问题都市有所差别,这取决于许多差其余因素。

我们想要从单体系统中提取一些功效,让它与单体系统的剩余部门通讯并集成,而且要尽快完成。我们不想再举行大爆炸式的重写了。我们已往是每年向用户公布软件,由于有一个为期 12 个月的窗口期,以是我们可以这样说:“现有的系统太糟糕了,现在已经无法使用了,然则我们另有 12 个月的时间来公布下一个版本。若是我们起劲,完全可以重写系统,我们不会再犯已往犯过的错误,现有的功效一个都不会少,而且还会有更多的新功效,一切都市很好。”

当每年公布一次软件时,我们从来没有那样做。当人们期望每月、每周或天天公布软件时,我不知道该若何证实其合理性。套用 Martin Fowler 的话来说,“若是你要举行大爆炸式的重写,你唯一能确定的就是大爆炸。”我喜欢动作片中的爆炸排场,但不喜欢我的 IT 项目里泛起这种情形。我们需要从差其余角度思索若何做出这些更改。

4

部署来自单体的第一个微服务

我是架构增量演进的忠实拥护者。我们不应该以为我们的架构是一成不变的。我们需要有一些模式来辅助我们以渐进的方式向微服务转变。

我们首先看下应用程序模式 Strangler Fig,它以一种植物命名,这种植物在树冠上生根,然后卷须向下缠绕在树干上。绞杀榕(strangler fig)靠自身无法爬到林冠层以获得足够的阳光,以是它不像通俗树木一样从一棵小树苗逐步长大,而是包裹在现有的植物体上。它依赖于现有的树的高度和气力。随着时间的推移,这些绞杀榕发展起来,变得越来越大,能够自力生计了。若是下面的树死了,腐烂了,就只剩下绞杀榕和一根空心的柱子。这些器械看起来就像蜡滴在其他树上――看起来真的很令人不安。

然则作为应用程序迁徙计谋的一种模式,这种头脑是有用的。我们找一个现有的系统(它完成我们想要它做的所有事情,即现有的单体应用程序),然后更先围绕它封装出我们的新系统。在这里,就是我们的微服务架构。实现 Strangler Fig 应用程序有两个要害。第一个是资产捕捉,即确定把哪些功效迁徙到微服务架构的历程。然后我们需要举行转接。以前对于单体应用程序的挪用得转接到新功效上。若是功效没有迁徙,挪用就不需要转接;异常简朴。

有些人对若何转移功效感应疑心。若是我们真的够幸运的话,也许可以简朴地复制代码。若是结账服务的代码在单体代码库中一个叫“结账”的漂亮盒子中,我们就可以剪切并粘贴到新服务中。我以为,若是代码库是这种状态,那你可能不需要任何辅助。更大的可能是,我们将不得不快速浏览系统,想法 *** 所有与结账相关的代码。我们可能会做一些重构前的流动。也许我们可以重用这些代码,但在这种情形下,那将是复制粘贴,而不是剪切粘贴。我们想把这个功效留在这个单体应用中,缘故原由我将在后面讨论。更常见的情形是,人们会举行一些重写。

实现 Strangler Fig 的方式有许多种。让我们来看一种简朴的方式。

假设我们有一个基于 HTTP 的单体系统。这可能是一个无头应用程序。我们可以在用户界面的后台使用 API Boundary 阻挡挪用。我们需要的是可以将挪用重定向的器械,因此,我们将使用某种 HTTP 署理。对于这类架构,HTTP 协议异常有用,这是由于它异常适合透明地重定向挪用。通过 HTTP 提议的挪用可以被转接到许多差其余地方。有许多软件可以帮你做到这一点,而且异常简朴。

图 6:HTTP 署理阻挡对单体的挪用,增添了一个 *** 跃点

首先要做的是,在上游流量和下游单体系统之间放置一个署理,其余什么都不用做。我们将把这个署理部署到生产环境中。此时,它还没有转接任何挪用。我们可以看下它在生产环境中是否有用。我们要忧郁的一件事是 *** 质量,由于我们增添了一个 *** 跃点。通常是直接挪用单体系统,但现在通过我们的署理。在这种情形下,延迟是杀手。通过署理转接只会给现有的挪用增添几毫秒的开销――少于 10 毫秒就很棒。若是分外增添一个 *** 跃点增添了 200 毫秒的延迟,我们就需要暂停微服务迁徙,由于我们另有其他需要首先解决的大问题。

准备好署理之后,我们接下来将处置新的结账服务。我们将其部署到生产环境中。纵然它功效还不全,也没什么问题,由于它还没有被使用。我们要在脑海中将部署到生产环境和使用这两个观点离开。更先接纳微服务后,我们希望定期地将功效部署到生产环境中,以确保我们的部署机制能够正常事情。在添加功效时,我们可以单独测试新服务。我们还没有把它公布给用户,但它已经在生产环境中了。我们可以将它毗邻到我们的仪表板上,确保日志聚合正常,或者做其他我们想做的事。

,

Usdt第三方支付接口

菜宝钱包(www.caibao.it)是使用TRC-20协议的Usdt第三方支付平台,Usdt收款平台、Usdt自动充提平台、usdt跑分平台。免费提供入金通道、Usdt钱包支付接口、Usdt自动充值接口、Usdt无需实名寄售回收。菜宝Usdt钱包一键生成Usdt钱包、一键调用API接口、一键无实名出售Usdt。

,

要害是我们只对一个服务举行操作。我们甚至可以将谁人服务的提取历程剖析为许多小步骤:建立服务框架、实现方式、在生产环境中测试它,然后部署公布版本。准备就绪之后,当我们以为新实现已经等同于旧系统时,我们只需重新设置署理,将挪用从旧的单体功效转到新的微服务。

事到如今,你可能以为现在应该从这个单体中删除旧功效。先别这么做!若是新建立的微服务在生产环境中泛起问题,我们有一种异常快的解救手艺:我们只需还原署理设置,将流量转到原功效所在的单体上。不外,要想实现这一点,我们必须思量数据的作用――这点我们稍后讨论。

我们希望,将这个功效提取成微服务是一种真正的重构,改变代码的结构而不是行为。在功效上,微服务应该等同于单体中的统一功效。我们应该能够在它们之间切换,直到微服务正常事情为止。

若是我们想要保留切换的能力,那么在迁徙完成、我们不再需要这种切换能力之前,我们就不应该添加新的功效或更改现有的功效。

在许多情形下,这项简朴的 Strangler Fig 手艺都出奇的好。这个例子使用了 HTTP,然则我也看过使用 FTP 的情形。我已经用新闻阻挡器做到了这一点。我在上传牢固文件时就这么做了:我们插入牢固文件,在新服务中剔除我们希望去掉的内容,然后把剩下的内容通报下去。

图 7:微服务架构的有向无环图

5

使用“抽象分支“模式来逐步完成单体迁徙

Strangler Fig 对于结账或订单治理等功效异常有用,这些功效在我们的挪用客栈中处于更高的位置,如图 7 所示的依赖关系图。然则,进入单体系统的挪用没有哪个是为了获得像忠诚奖励积分或给客户发送通知这样的能力。进入单体的挪用是“下订单”或“付款”。只是作为这些操作的副作用,我们可能会奖励积分或发送电子邮件。因此,我们无法在单体系统的外围阻挡对忠诚奖励积分或通知的挪用。那是在单体系统内部完成的。

假设我们要把通知功效提取出来。我们必须提取这块功效,并用一种增量的方式阻挡这些入站链接,这样我们就不会损坏系统的其余部门。

一种名为“抽象分支”的手艺可以很好地完成这项事情。在基于主干的开发环境中,抽象分支是一种经常讨论的模式,这是一种很好的软件开发方式。在这种情形下中,抽象分支作为一种模式也很有用。我们在现有的单体系统中建立了一个空间,统一功效的两种实现可以在其 *** 存。在许多方面,这是里氏替换原则的一个例子。这是对完全相同的抽象做的一个自力实现。对于本例,我们将从现有代码中提取通知功效。

图 8:用于迁徙到一个微服务的抽象分支

通知代码散布在我们的系统中。我们要做的第一件事是为新服务 *** 所有这些代码。我们将把服务隐藏在抽象点后面。我们希望结账代码和订单代码通过一个明确的抽象点来接见这个功效。早先,我们有一个通知抽象的实现――它封装了单体中当前所有与通知相关的功效。我们的所有挪用――到 *** TP 库、到 Twilio、发送 *** S――都被打包到这个实现中。

此时,我们所做的只是在代码中建立了一个很好的抽象点。我们可以停了。我们已经厘清了我们的代码库,并使其更容易测试,这已经是改进了。这是一种很好的老式重构。我们也缔造了一个机会来更改结账或订单使用的通知功效的实现。我们可以用几天或几周的时间来完成这项重构事情,同时做一些其他的事情,好比现实公布特征。

接下来,我们更先建立通知服务的新实现。这可以分成两个部门。我们已经在单体中实现了新接口,但这只是挪用另一部门(新建的通知微服务)的客户端代码。部署这些实现很平安,由于它们还没有被使用。我们更频仍地集成代码,削减合并事情,并确保一切事情正常。

一旦单体内部挪用新服务的代码和单体外部的通知服务可以正常事情,我们所需要做的就是切换我们正在使用的抽象实现。我们可以使用特征开关、文本文件、专用工具,或者任何我们希望使用的方式。我们还没有删除旧功效,以是若是有问题,我们可以轻松切回旧功效。同样,这个服务的迁徙被剖析成许多小步骤,我们试图通过所有这些步骤尽快将其部署到生产环境。

一切事情正常之后,我们就可以选择清算代码了。若是不再需要这个功效,我们可以删除其特征标识,甚或删除旧代码。现在删除旧代码很容易了,由于我们已经花了一些时间将所有代码整理好。我们删除了谁人类,它消逝了。我们把单体变小了,每个人都对自己感应满足。

6

并行运行验证微服务迁徙

就代码重构而言,我强烈推荐 Michael Feathers 的著作《修改代码的艺术》。他对遗留代码的界说是没有测试代码的代码。关于若何在不损坏现有系统的情形下,在代码库中找出并建立这些抽象,这本书提供了许多好主意。纵然你不使用微服务,仅仅建立这个抽象点就可能会使你的代码处于更好、更可测试的状态。

我已经强调过,不要太早删除旧实现。保留两种实现有许多利益。它为我们若何部署和上线软件提供了有趣的方式。当挪用进入抽象点时,它可以触发对这两个实现的挪用。这叫做并行运行。这可以辅助我们确保新的微服务实现功效上等价。我们运行该功效的两个副本,然后对照效果。

要做这个对照,只需运行这两个实现并对照效果。我们必须指定其中之一作为真相泉源,由于我们不希望把两者串联起来:例如,在发送通知时,我们只想发送一封邮件,效果却发了两封。并行运行是一种适用而直接的实时对照,不仅是功效等价性的对照,而且包罗可接受的非功效等价性对照。我们不仅要测试是否建立了准确的电子邮件,并将其发送到准确的虚拟 *** TP 服务器,而且还要测试新服务的响应速度是否同样快,或者错误率在可接受局限之内。

通常,我们信托旧的功效实现,并使用其效果。我们将它们并行运行一段时间,若是新实现提供了可接受的效果,我们最终将处置掉旧的。

GitHub 可以帮我们做这件事。他们建立了一个名为 GitHub Scientist 的库,这是一个很小的 Ruby 库,用于封装差其余抽象并对它们举行评分。在重构应用程序中的要害代码路径时,我们可以使用它来举行实时对照。GitHub Scientist 已经被移植到了许多差其余语言上,令人费解的是,Perl 有三种差其余移植:显然,在 Perl 社区,并行运行是一件很主要的事情。关于若何在应用程序内部并行运行,已经有许多很好的建议。

7

将部署与公布星散:基本性的改变

从基本上说,我们需要将部署的观点与公布的观点星散开来。传统上,我们以为这两种流动是一回事,部署软件和向生产环境用户公布软件是一回事。这就是为什么每个人都畏惧生产环境会发生什么事情,这就是生产环境成为一个封锁环境的缘故原由。

我们可以把这两个观点离开。将某样器械部署到生产环境中与将它公布给我们的用户是不一样的。这个想法是人们现在所说的“渐进式交付”的基础,这是一个涵盖了一系列差别手艺的总称,包罗金丝雀公布、蓝 / 绿部署、抹黑启动等。我们可以快速推出软件,但不必向任何客户公然。我们可以把它放到生产环境中,在那里测试,然后自己蒙受泛起的任何问题。

若是我们将部署与公布离开,那么部署的风险就会小许多。我们就会加倍勇敢地举行更改。我们将能够更频仍地公布,而且公布的风险将更低。

RedMonk 团结创始人 James Governor 在公司的博客上对渐进式交付做了很好的论述。该文探讨了渐进式交付,其中最主要的结论是,自动部署与自动公布不是一回事,而且你可以控制公布流动若何发生。

8

用微服务方式迁徙简朴的数据接见

我们将现有的单体应用程序和数据锁定在系统中,如图 9 所示。我们已经决议提取结账功效,然则它需要接见数据。

图 9:重新服务接见旧数据

选项一是直接接见单体的数据。若是我们仍然在测试并在单体中的结账功效和微服务里的结账功效之间举行切换,我们会希望这两种实现之间具有数据兼容性和一致性,这种方式可以保证这一点。这在短时间内是可以接受的,但它违反了数据库的黄金规则之一:不共享数据库。这不是可以历久依赖的器械,由于它会导致基本性的耦合问题。我们希望保持自力部署的能力。

图 10:重新服务直接接见旧数据

如图 10 所示,我们有一个 Shipping 服务和数据库,我们允许其他人接见我们的数据。我们已经向外部公然了内部实现细节。这使得 Shipping 服务的开发人员很难知道哪些内容可以平安地更改。哪些数据要共享,哪些数据要隐藏,并没有做区分。

20 世纪 70 年月,David Parnas 提出了“信息隐藏”的观点,我们就是以此为基础思量模块剖析。我们希望在模块或微服务的界限内隐藏尽可能多的信息。若是我们建立一个界说优越的服务接口来共享数据,而不是直接公然数据库,那么这个接口就让 Shipping 服务的开发人员可以明确知道这个左券以及他们可以向外界公然什么。只要遵守该左券,开发人员就可以在 Shipping 服务中做任何他们想做的事情。也就是说,这些服务可以自力演进和开发。不要直接接见数据库,除非是在极其特殊的情形下。

抛开直接接见,我们有两种选择:要么接见别人的数据,要么保留自己的数据。对于这个例子,如果我们已经确定新开发的结账微服务已经足够好,可以作为我们的真相泉源。

此时,若是我们想要使用别人的数据,那么这可能意味着数据属于单体,我们必须向单体请求数据。我们在单体上建立某种显式的服务接口(在我们的示例中是一个 API),通过它获取我们想要的数据。

图 11:新开发的微服务使用单体显式提供的一个服务接口

我们是结账服务,而不是订单服务,但我们可能需要订单数据。订单功效存在于单体中,因此我们将从那里获取数据。这样来说,我们需要在单体上界说服务接口以公然差其余数据集,而且,在这样做时,我们可以看到其他实体从单体中显现出来。我们可能会发现,订单服务正守候着从单体中喷发出来,就像《异形》中的异形幼体,在影戏中,单体是由 John Hurt 饰演的,它会死去。

另一种选择是保留服务自己的数据――在本例中,是单体数据库中的结账数据。至此,我们必须把数据移到一个结账数据库,这真的很难。从现有系统(尤其是关系数据库)中提取数据会带来许多贫苦。我们将看一个简朴的例子,看看它带来的挑战。我将带人人深入领会一下,若何处置毗邻。

9

最后的挑战:处置毗邻操作

图 12:在线销售光盘的单体

图 12 形貌了一个现有的、在线销售光盘的单体应用程序。(你可以看出我这个例子已经用了多久了。)Catalog 功效知道某些器械多少钱,并将信息存储在 Line Items 表中。Finance 功效治理我们的财政买卖,并将数据存储在 Ledger 表中。我们要做的其中一件事是,天生一个每周销量前 10 的专辑列表。在这种情形下,我们需要做一个简朴的毗邻操作。我们从 Ledger 表上查出 10 个最脱销的。我们凭据行和其他器械来限制这个查询。这样我们就能获得 ID 列表了。

图 13:在线销售光盘的微服务架构

在进入微服务领域后,我们需要在应用层执行毗邻操作。我们从 Finance 数据库中提取财政买卖数据。关于我们出售的物品的信息则存在于 Catalog 数据库中。为了天生销量前 10 名列表,我们必须从 Ledger 表中提取最脱销商品的 ID,然后转到 Catalog 微服务,查询所销售商品的信息。我们已往在关系层中执行的毗邻操作转移到了应用程序层。

延迟可能会变得令人震惊。现在,我不是做一个一次往返的毗邻操作,而是要挪用 Finance 服务获取销量前 10 的 ID,然后挪用另一个 Catalog 服务请求这 10 个 ID 的信息,然后 Catalog 服务从 Catalog 数据库中取得这些 ID,然后我们才获得响应。图 13 说明晰这个历程。

图 14:微服务架构会导致更多的跃点和延迟

我们还没有涉及到像缺乏数据完整性这样的问题(在这种情形下,关系型数据库若何实现引用完整性)。

10

小结

若是你想深入研究诸如处置延迟和数据一致性之类的问题,我在《从单体到微服务》一书中举行了深入的论述。

无论你是否决议继续自己的微服务迁徙之旅,我都建议你仔细思量下,自己正在做什么以及为什么要这样做。不要把注意力都放在建立微服务上。相反,你要清晰自己想要到达的效果。你以为微服务会带来什么效果?专注于这一点――你可能会发现,你可以在不进入庞大的微服务天下的情形下实现同样的效果。

作者简介:

Sam Newman 是一名自力照料,专门辅助人们快速交付软件。他在云盘算、连续交付和微服务方面做了大量事情,稀奇关注若何更轻松地将可以事情的软件部署到生产环境中。在已往几年里,他一直在探索微服务架构的特征。

环球UG声明:该文看法仅代表作者自己,与本平台无关。转载请注明:usdt otc(www.caibao.it):若何通过剖析和增量更改将单体迁移到微服务?
发布评论

分享到:

usdt第三方支付(www.caibao.it):美国交通平安机构考察底特律特斯拉撞车事故
1 条回复
  1. 皇冠官网手机版
    皇冠官网手机版
    (2021-03-27 00:09:07) 1#

    联博统计www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。老粉手动点赞

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。