热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

具有Istio服务网格的微服务的高级流量共享模式

微服务使我们可以更快地发展并缩短实现价值的时间。但是,我们不能天真地快速行动并破坏事物。我们需要一种方法来降低进行更改的风险,并在此过程中更安全地将新更改引入生产。一种有助于降低将

微服务使我们可以更快地发展并缩短实现价值的时间 。 但是,我们不能天真地快速行动并破坏事物 。 我们需要一种方法来降低进行更改的风险,并在此过程中更安全地将新更改引入生产。 一种有助于降低将变更投入生产的风险的强大模式是将生产流量隐藏到测试集群或我们的软件的新版本中, 然后在将实时流量(即客户流量)定向到其之前对它进行测试,以检查是否存在问题。 这样,我们就可以将真实生活的用例发送给我们的代码,使使用情况变得晦涩难懂,从而使非生产模拟中的测试可能无法捕获。 我在上一篇文章中介绍了Istio Service Mesh如何具有很好的功能来镜像流量 。 实际上,关于Istio和Service Mesh , 实际上我有很多话要说 ,所以请随时关注@christianposta ,以了解最新信息。 现在进入主要课程:

遮挡交通的问题

当我们将实时生产流量屏蔽到测试群集或生产中的黑暗群集时,我们将面临一些挑战。 首先,我们如何在不影响生产服务的关键路径的情况下将流量发送到该群集? 我们是否需要从这些请求中过滤出个人信息? 我们如何包含测试集群以不干扰实时协作者服务? 如果我们的服务对数据进行更改,我们如何隔离这些更改而不影响生产?

这些都是真正的挑战,可以用作不尝试屏蔽流量的原因。 恕我直言,遮蔽是执行安全释放的一种较重要且功能强大的技术,因此,让我们看一下解决其中一些问题的几种模式。 模式如下所示:

  • 在不影响关键路径的情况下将流量引导到测试集群
  • 将流量注释为阴影流量
  • 阴影后将实时服务流量与测试群集进行比较
  • 为某些测试配置文件提供协作服务
  • 综合交易
  • 虚拟化测试集群的数据库
  • 实现测试集群的数据库

让我们深入。

在不影响关键路径的情况下将流量引导到测试集群

可以说这是最重要的部分。 如果我们不能可靠地屏蔽流量并将其发送到测试集群而不影响生产流量 ,那么我们应该停止。 我们不能为自己的想法而牺牲生产的可靠性和可用性。 通常,我们将使用代理来屏蔽此流量。 Envoy代理是可用于此目的的代理。 Istio是一个服务网格,它使用Envoy作为启用此功能的默认代理。 有关更多信息,请参见Istio镜像任务 。 因此,基本上,服务网格(Istio)已位于生产流量的关键路径之间(以实现弹性,安全性,策略制定,路由控制等),并且还可能将流量隐藏在测试集群中。 实际上,这就是我们在上一个博客中进行的深入研究 。 重要的是,流量是异步镜像的,并且与生产流量不在带内。 任何响应都将被忽略。

具有Istio服务网格的微服务的高级流量共享模式

对于熟悉所谓的“企业集成模式”(感谢Gregor Hophe! )的读者,您会注意到这种“镜像”的东西确实是一种味道或电线EIP 。

将流量注释为阴影流量

另一个重要的考虑因素是确定已镜像的流量。 我们需要能够分辨实时生产流量和用于测试目的的流量。 使用Istio / Envoy,被阴影的流量会自动附加其他上下文注释,以表示被镜像/阴影的流量。 例如,当反射镜Istio流量, 其附加 -shadowHostAuthority报头。 对于某些实现,这是当前存在的问题,因为-shadow将添加到主机的末尾,因此foobar:8080Host标头将以这样的标头结尾: foobar:8080-shadow从技术上讲不是有效的HTTP 1 。X。 通过Envoy中的此修复程序 , -shadow后缀将添加到主机名,因此foobar:8080变为foobar-shadow:8080

具有Istio服务网格的微服务的高级流量共享模式

阴影后将实时服务流量与测试群集进行比较

一旦我们可以可靠地屏蔽流量,就可以做一些有趣的事情。 我们可能希望将流向测试集群的流量与从实时生产集群中看到的预期行为进行比较。 例如,我们可能希望将请求结果与预期结果的任何偏差或API合约的破损进行比较,以实现向后和向前的兼容性。 我们可以插入一个负责这种流量协调的代理,并准备进行有趣的比较。 Twitter Diffy是在Twitter和其他地方的生产中被使用了一段时间的代理服务器之一。 它基本上需要镜像流量(由于Istio和Envoy,我们已经有了镜像流量),并调用实时服务和新服务并比较结果。 通过首先调用实时服务的两个实例,检测噪声,然后忽略这些部分以进行测试,它可以检测结果中的“噪声”并忽略该噪声(例如,时间戳,单调递增的计数器等)。服务。

具有Istio服务网格的微服务的高级流量共享模式

Diffy还有一个很棒的网页/仪表板,用于查看通话结果,通话结果以及基于某些特征的过滤。 最后,Diffy有一个不错的管理控制台,用于查看有关呼叫比较的指标和统计信息。

具有Istio服务网格的微服务的高级流量共享模式

非常感谢Prashant Khanduri , Puneet Khanduri和Alex Soto 在此提供的演示 。 留在寻找出这个演示的视频,我继续打造出来。

为某些测试配置文件提供协作服务

当我们部署服务的新版本并将流量镜像到测试群集时,我们需要注意对其余环境的影响。 我们的服务通常需要与其他服务协作(查询数据,更新数据等)。 如果与其他服务的协作只是读取GET请求,并且这些协作者能够承担额外的负载,则这可能不是问题。 但是,如果我们的服务更改了合作者中的数据,则需要确保将这些调用定向到测试双打,而不是实际的生产流量。 您可以为部署创建不同的安装配置,以注入这些配置。 例如,我们注入test.prod.com而不是live.prod.com用于下游服务。 如果在Kubernetes上部署,则可以使用不同的Config Maps进行控制。 另一个有趣的方法是使用Hoverfly或Microcks等工具部署虚拟化的测试双打。 借助这些服务虚拟化工具,您可以策划预期的请求/响应对,并引导将这些值变异为返回预期响应的这些代理的流量。

具有Istio服务网格的微服务的高级流量共享模式

综合交易

在许多情况下,我们服务的新版本将需要更改其本地数据存储中的数据。 它可能会向协作服务发出呼叫以更改数据,但也许我们不能(或不应)使用先前的技术(服务虚拟化)对这些呼叫进行存根。 另一种方法是更明确地注释我们的调用(如在我们以前的模式中添加-shadow ),以指示这些请求应导致“综合交易”……即,这些交易不是真实交易,应采取任何撤销交易的补偿措施在请求结束时。 我们可以在请求中添加标头,甚至可以使其成为请求主体的一部分,以表明某个事务是“合成的”事实。 在执行此操作时,我们将指示参与服务按正常方式处理请求(包括所有数据操作),然后在提交之前回滚事务。 请注意,这对于事务性数据存储很好,但可能不适用于其他事务。 在这些情况下,如果您已经有了工作单元的概念,则可以在其上附加综合语义。 否则,最好不要尝试没有隔离和丢弃更改的合成交易。

具有Istio服务网格的微服务的高级流量共享模式

这种方法对于执行包括数据存储在内的请求的完整路径很有用,以获得更好的计时保真度,数据干扰/不匹配问题,而双重测试可能无法解决。

这种方法的最大缺点是它是按惯例实现的,很难执行。 它可以与您拥有并控制的服务一起使用,但可能无法扩展到许多参与的协作者。 您可能不想尝试在所有服务上强制执行此约定,并且让一个服务无法正确实现此回滚功能,从而使所有内容混乱。 在严格控制和协调部署中使用此模式。

虚拟化测试集群的数据库

在针对镜像流量进行测试时,我们已经开始涉及与处理数据有关的问题。 通常,如果您的测试集群使用数据存储,并且测试服务以某种形式更新/插入/变异数据,则需要隔离这些更改。 我们只看了回首带有标头或嵌入标志等的任何更改,但这并非总是如此。

镜像流量时解决数据问题的另一种方法是对测试集群使用可替代数据存储。 您可以站起来一个空的数据存储,并用测试数据填充它,然后对它运行阴影流量。 但是,如果您使用的是Diffy(如上所述),则在响应比较中可能会收到很多误报,因为测试集群中的数据正在使用测试数据,而实时服务正在使用生产数据。 解决此问题的一种好方法是虚拟化数据层。 我们让测试集群使用一个数据存储,该数据存储向自己提供与生产数据存储相同的数据。

具有Istio服务网格的微服务的高级流量共享模式

当我们这样做时,我们可以拥有生产数据的当前一致视图,并且还可以在不影响生产数据存储的情况下写入数据存储。 我们可以使用JBoss Teiid之类的工具轻松完成此操作。 Teiid具有适用于所有类型的数据存储系统的连接器,包括RDBMS,No-SQL系统,平面文件,hadoop,salesforce等,并且可以为我们的测试集群虚拟化它们。 在执行此操作时,无论何时进行写操作,此突变数据都可以进入一次性数据库中,但是您的服务却毫无头绪(也不用担心)。 我有一系列博客, 这些博客最值得注意的是关于微服务迁移的这篇博客文章 。

实现测试集群的数据库

最后,作为先前数据虚拟化技术的扩展的另一种方法是完全实现数据存储。 这样,我们测试集群的数据存储与生产集群的数据存储基本相同,并通过流处理不断进行更新。 这种工作方式是我们使用( CDC-更改数据捕获 )从生产数据库中捕获更改,然后将这些更改发送到新数据库。 一些数据存储允许将其作为内置的复制机制(例如MySQL从站或其他东西),但是很多时候这些都是只读的。 您可以使用像Debezium这样的Change Data Capture工具来构建一个简单的CDC系统,以使您的测试数据存储具有生产数据库的完全复制副本并不受惩罚地使用它。 Debezium 提供了用于不同数据存储的连接器,并从那些数据库中获取更改事件(即,读取事务日志)并将这些更改流式传输到Apache Kafka 。 从那里,您可以使用任何流处理工具将这些流具体化到测试数据库中。 FWIW, 上面提到的Teiid即将具有此功能。

具有Istio服务网格的微服务的高级流量共享模式

此外,如果您已经拥有数据流管道,使用事件驱动的体系结构或使用某种基于事件的数据机制,则此“物化”测试数据库将成为更好的选择。

摘要

在实践中,将生产流量镜像到我们的测试群集(无论该群集存在于生产环境还是非生产环境中)是降低新部署风险的非常有效的方法。 像Twitter和Amazon这样的大型webop公司已经这样做了多年。 这种方法伴随着一些挑战,但是正如上面的模式所讨论的那样,存在着不错的解决方案。 如果您认为我错过了某些事情,或者觉得我没有涉及到一个令人讨厌的问题,请与我联系 ,我将很高兴与您讨论并将其添加到此博客的更新中。 谢谢!

翻译自: https://www.javacodegeeks.com/2018/02/advanced-traffic-shadowing-patterns-microservices-istio-service-mesh.html


推荐阅读
  • PDO MySQL
    PDOMySQL如果文章有成千上万篇,该怎样保存?数据保存有多种方式,比如单机文件、单机数据库(SQLite)、网络数据库(MySQL、MariaDB)等等。根据项目来选择,做We ... [详细]
  • MySQL中的MVVC多版本并发控制机制的应用及实现
    本文介绍了MySQL中MVCC的应用及实现机制。MVCC是一种提高并发性能的技术,通过对事务内读取的内存进行处理,避免写操作堵塞读操作的并发问题。与其他数据库系统的MVCC实现机制不尽相同,MySQL的MVCC是在undolog中实现的。通过undolog可以找回数据的历史版本,提供给用户读取或在回滚时覆盖数据页上的数据。MySQL的大多数事务型存储引擎都实现了MVCC,但各自的实现机制有所不同。 ... [详细]
  • 熟练掌握Spring Cloud,终于成为Java工程师的面试门槛 ... [详细]
  • 本文是一位90后程序员分享的职业发展经验,从年薪3w到30w的薪资增长过程。文章回顾了自己的青春时光,包括与朋友一起玩DOTA的回忆,并附上了一段纪念DOTA青春的视频链接。作者还提到了一些与程序员相关的名词和团队,如Pis、蛛丝马迹、B神、LGD、EHOME等。通过分享自己的经验,作者希望能够给其他程序员提供一些职业发展的思路和启示。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Windows下配置PHP5.6的方法及注意事项
    本文介绍了在Windows系统下配置PHP5.6的步骤及注意事项,包括下载PHP5.6、解压并配置IIS、添加模块映射、测试等。同时提供了一些常见问题的解决方法,如下载缺失的msvcr110.dll文件等。通过本文的指导,读者可以轻松地在Windows系统下配置PHP5.6,并解决一些常见的配置问题。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文由编程笔记小编整理,介绍了PHP中的MySQL函数库及其常用函数,包括mysql_connect、mysql_error、mysql_select_db、mysql_query、mysql_affected_row、mysql_close等。希望对读者有一定的参考价值。 ... [详细]
  • MACElasticsearch安装步骤及验证方法
    本文介绍了MACElasticsearch的安装步骤,包括下载ZIP文件、解压到安装目录、启动服务,并提供了验证启动是否成功的方法。同时,还介绍了安装elasticsearch-head插件的方法,以便于进行查询操作。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • 如何在php中将mysql查询结果赋值给变量
    本文介绍了在php中将mysql查询结果赋值给变量的方法,包括从mysql表中查询count(学号)并赋值给一个变量,以及如何将sql中查询单条结果赋值给php页面的一个变量。同时还讨论了php调用mysql查询结果到变量的方法,并提供了示例代码。 ... [详细]
  • 添加环境光使正方体显示更真实
    本文介绍了如何给正方体添加环境光以使其显示更真实。通过在代码中加入环境光的计算,可以让物体的背光部分不再完全黑色,从而增加物体的真实感。代码中使用了顶点属性、光照颜色、光照方向、环境光等参数来计算物体的漫反射,并将计算结果与顶点颜色相乘得到最终的颜色。通过调整环境光的参数,可以达到不同的光照效果。 ... [详细]
  • Title: Extracting Title, Keywords, and Summary from Content
    Summary: This task requires extracting the title, keywords, and summary from a given content. The title should be more than 30 characters long, the keywords should be at least 10, and the summary should be between 150 and 200 words. ... [详细]
  • Vue基础一、什么是Vue1.1概念Vue(读音vjuː,类似于view)是一套用于构建用户界面的渐进式JavaScript框架,与其它大型框架不 ... [详细]
author-avatar
单身男人adgjm
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有