Servicemesh的背景
- 1: (2018)令人兴奋微服务的2.0技术栈
- 2: (2018)后 Kubernetes时代的微服务
- 3: (2020)用Istio进行微服务和服务网格的解释
- 4: (2021)分布式系统在 Kubernetes 上的进化
1 - (2018)令人兴奋微服务的2.0技术栈
内容出处
Excited about a ‘2.0’ tech stack for microservices
https://blog.christianposta.com/microservices/microservices-2-0/
作者 Christian Posta 发表于 2017年
2 - (2018)后 Kubernetes时代的微服务
内容出处
作者 Bigin Ibryam
后 Kubernetes时代的微服务
在Kubernetes诞生的前几年微服务还是分布式系统最流行的架构风格。但Kubernetes和云原生运动已经改变了应用程序设计和开发的方方面面。在本文中,我要质疑微服务的一些理念,指明它们在后Kubernetes时代不会再像以前那样强大。
https://cloudnative.to/blog/microservices-post-kubernetes/
译者 殷龙飞 发表于 2018年9月7日
关键要点
- 微服务架构仍然是分布式系统最流行的架构风格。 但 Kubernetes 和云原生运动已经在很大程度上重新定义了应用程序的设计和开发。
- 在云原生平台上,服务的可观察性是不够的。更基本的先决条件是通过实施健康检查,对信号做出反应,声明资源消耗等,使微服务自动化。
- 在后 Kubernetes 时代,服务网格技术将完全取代使用库来实现操作网络问题(例如 Hystrix 断路器)。
- 微服务现在必须通过从多个维度实现幂等性来设计用于“恢复”。
- 现代开发人员必须精通编程语言以实现业务功能,并且同样精通云原生技术以满足非功能性基础架构级别要求。
微服务炒作开始于一堆关于组织结构、团队规模、服务规模、重写和抛出服务而不是修复、避免单元测试等的极端想法。根据我的经验,大多数这些想法被证明是错误的,不实用的或者至少不通用。 如今,大多数剩余的原则和实践都是如此通用和松散地定义,以至于它们可能在未来许多年内都会成立,而在实践中却没有多大意义。
在Kubernetes诞生的前几年微服务还是分布式系统最流行的架构风格。但Kubernetes和云原生运动已经改变了应用程序设计和开发的方方面面。在本文中,我要质疑微服务的一些理念,指明它们在后Kubernetes时代不会再像以前那样强大。
不仅可观察,而且还有自动化服务
可观察性从一开始就是微服务的基本原则。 虽然对于一般的分布式系统来说它是正确的,但今天(特别是在 Kubernetes 上),它的很大一部分是平台级别的开箱即用(例如进程运行状况检查、CPU 和内存消耗)。最低要求是应用程序以 JSON 格式登录控制台。 从那时起,平台可以跟踪资源消耗、请求跟踪、收集所有类型的指标、错误率等,而无需太多的服务级别开发工作。
在云原生平台上,可观察性是不够的。更基本的先决条件是通过实施健康检查,对信号做出反应,声明资源消耗等使微服务自动化 。可以将几乎任何应用程序放入容器中运行。但是要创建一个容器化的应用程序,可以通过云原生平台自动化和协调编排,需要遵循一定的规则。遵循这些 原则和模式 ,将确保生成的容器在大多数容器编排引擎中表现得像一个优秀的云原生公民,允许以自动方式对它们进行调度、扩展和监控。
我们希望平台不必观察服务中发生的情况,而是希望平台检测异常情况并按照声明进行协调。无论是通过停止将流量导向服务实例、重启、向上和向下扩展,还是将服务迁移到另一个健康主机,重试失败的请求或其他,这都无关紧要。如果服务是自动化的,则所有纠正措施都会自动发生,我们只需要描述所需的状态,而不是观察和反应。服务应该是可观察的,但也可以在没有人为干预的情况下通过平台自动进行整改。
智能平台和智能服务,但有正确的责任
在从 SOA 转向微服务世界的过程中, “智能端点和哑管”的概念是服务交互的另一个根本转变。在微服务领域,服务不依赖于集中式智能路由层的存在,而是依赖于拥有某些平台级功能的智能端点。这是通过在每个微服务中嵌入传统 ESB 的一些功能并转换到没有业务逻辑元素的轻量级协议来实现的。
虽然这仍然是在不可靠的网络层(使用 Hystrix 等库 ) 实现服务交互的流行方式 ,但现在,在后 Kubernetes 时代,它已经完全被服务网格技术所取代 。有趣的是,服务网格甚至比传统的 ESB 更智能。网格可以执行动态路由、服务发现、基于延迟的负载平衡、响应类型、指标和分布式跟踪、重试、超时,你能想到的这里都有。
与 ESB 的不同之处在于,与服务网格不同的是,只有一个集中路由层,每个微服务通常都有自己的路由器—— 一个带有附加中央管理层的代理逻辑的 sidecar 容器。 更重要的是,管道(平台和服务网格)没有任何业务逻辑;它们完全专注于基础架构方面,使服务专注于业务逻辑。 如图所示,这代表了 ESB 和微服务学习的演变,以适应云环境的动态和不可靠特性。
SOA vs MSA 与 CNA
查看服务的其他方面,我们注意到云原生不仅影响端点和服务交互。Kubernetes 平台(包含所有其他技术)还负责资源管理、调度、部署、配置管理、扩展、服务交互等。而不是再次将其称为“智能代理和哑管”,我认为它更好地描述作为一个具有正确职责的智能平台和智能服务。这不仅仅是关于端点;它是一个完整的平台,可以自动化业务功能服务的所有基础架构方面。
不要面向失败而设计,要面向恢复设计
在基础架构和网络本身不可靠的云原生环境中运行的微服务必须针对故障进行设计。 这毫无疑问。 但是平台检测到并处理了越来越多的故障,并且从微服务中捕获故障的量较少。相反,考虑通过从多个维度实现幂等性来设计您的恢复服务。
容器技术、容器编排器和服务网络可以检测并从许多故障中恢复:无限循环——CPU 分配、内存泄漏和 OOM——运行状况检查、磁盘占用——配额、fork 炸弹——进程限制、批量处理和进程隔离——内存限制、延迟和基于响应的服务发现、重试、超时、自动扩展等等。更不用说,过渡到无服务器模型,服务只需要在几毫秒内处理一个请求,而垃圾收集、线程池、资源泄漏也越来越不需要关心。
通过平台处理所有这些以及更多内容,将您的服务视为一个密封的黑盒子,它将多次启动和停止,使服务能够重新启动。您的服务将按比例放大和缩小倍数,通过使其无状态,使其可以安全地进行扩展。假设许多传入请求最终会超时,使端点具有幂等性。假设许多传出请求将暂时失败,平台将为您重试它们,确保您使用幂等服务。
为了适合云原生环境中的自动化,服务必须是:
- 幂等重启(服务可以被杀死并多次启动)。
- 幂等扩展/缩小(服务可以自动扩展到多个实例)。
- 幂等服务生产者(其他服务可能会重试调用)。
- 幂等服务使用者(服务或网状网可以重试传出调用)。
如果您执行上述操作一次或多次时服务的行为始终相同,那么平台将能够在没有人为干预的情况下从故障中恢复您的服务。
最后,请记住,平台提供的所有恢复只是本地优化。正如 Christian Posta 所说的那样 ,分布式系统中的应用程序安全性和正确性仍然是应用程序的责任。 整个业务流程范围的思维模式(可能跨越多个服务)对于设计整体稳定的系统是必要的。
混合开发职责
越来越多的微服务原则被 Kubernetes 及其补充项目实施和提供。因此,开发人员必须精通编程语言以实现业务功能,并且同样精通云原生技术以满足非功能性基础架构级别要求,同时完全实现功能。
业务需求和基础架构(操作或跨功能需求或系统质量属性)之间的界限总是模糊不清,并且不可能采取一个方面并期望其他人做另一个方面。 例如,如果在服务网格层中实现重试逻辑,则必须使服务中的业务逻辑或数据库层使用的服务具有幂等性。 如果在服务网格级别使用超时,则必须同步服务中的服务使用者超时。如果必须实现服务的重复执行,则必须配置 Kubernetes 作业执行。
展望未来,一些服务功能将作为业务逻辑在服务中实现,而其他服务功能则作为平台功能提供。虽然使用正确的工具来完成正确的任务是一个很好的责任分离,但技术的激增极大地增加了整体的复杂性。在业务逻辑方面实现简单的服务需要很好地理解分布式技术堆栈,因为责任分散在每一层。
据 证实 Kubernetes 是可以扩展到数千个节点、数万个 pod 和数百万的 TPS。您的应用程序大小、复杂性,或者说是引入“云原生”复杂性的关键性因素,我还不清楚。
结论
有趣的是,微服务运动如何为采用 Docker 和 Kubernetes 等容器技术提供了如此大的动力。 虽然最初是推动这些技术发展的微服务实践,但现在 Kubernetes 定义了微服务架构的原则和实践。
最近的一个例子,我们距离接受函数模型作为有效的微服务原语并不远,而不是将其视为纳米服务的反模式。我们并没有充分的理由质疑云原生技术对于中小型案例的实用性和适用性,而是因为兴奋而有些不经意地跳了起来。
Kubernetes 拥有 ESB 和微服务的许多知识,因此,它是最终的分布式系统平台。 它是架构风格的技术,而不是相反的方式。无论好坏,时间会证明一切。
关于作者
Bilgin Ibryam (@bibryam)是 Red Hat 的首席架构师,提交者和 ASF 成员。 他是一名开源传播者,博客作者,《Camel Design Patterns》 和 《Kubernetes Patterns》 书籍的作者。 在他的日常工作中,Bilgin 喜欢指导编码和领导开发人员成功构建云原生解决方案。 他目前的工作重点是应用程序集成、分布式系统、消息传递、微服务、devops 和一般的云原生挑战。 你可以在 Twitter、Linkedin 或他的 博客 上找到他 。
3 - (2020)用Istio进行微服务和服务网格的解释
内容出处
Microservices and Service Mesh with Istio, Explained
https://hackernoon.com/microservices-and-service-mesh-with-istio-explained-eo1e3u7s
作者 Sudip Sengupta 发表于2020年7月
4 - (2021)分布式系统在 Kubernetes 上的进化
内容出处
The Evolution of Distributed Systems on Kubernetes
https://www.infoq.com/articles/distributed-systems-kubernetes/
分布式系统在 Kubernetes 上的进化
本文翻译自 Bilgin Ibryam 的文章 The Evolution of Distributed Systems on Kubernetes。
https://cloudnative.to/blog/distributed-systems-kubernetes/
备注:内容有删减,只摘抄了分布式系统发展和servicemesh关系的部分内容
在 3 月份的 QCon 上,我做了一个关于 Kubernetes 的分布式系统进化的演讲。首先,我想先问一个问题,微服务之后是什么?我相信大家都有各自的答案,我也有我的答案。你会在最后发现我的想法是什么。为了达到这个目的,我建议大家看看分布式系统的需求是什么?以及这些需求在过去是如何发展的,从单体应用开始到 Kubernetes,再到最近的 Dapr、Istio、Knative 等项目,它们是如何改变我们做分布式系统的方式。我们将尝试对未来做一些预测。
现代分布式应用
为了给这个话题提供更多的背景信息,我认为的分布式系统是由数百个组件组成的系统。这些组件可以是有状态的、无状态的或者无服务器的。此外,这些组件可以用不同的语言创建,运行在混合环境上,并开发开源技术、开放标准和互操作性。我相信你可以使用闭源软件来构建这样的系统,也可以在 AWS 和其他地方构建。具体到这次演讲,我将关注 Kubernetes 生态系统,以及你如何在 Kubernetes 平台上构建这样一个系统。
我们从分布式系统的需求讲起。我认为是我们要创建一个应用或者服务,并写一些业务逻辑。那从运行时的平台到构建分布式系统,我们还需要什么呢?在底层,最开始是我们要一些生命周期的能力。当你用任一语言开发你的应用时,我们希望有能力把这个应用可靠地打包和部署、回滚、健康检查。并且能够把应用部署到不同的节点上,并实现资源隔离、扩展、配置管理,以及所有这些。这些都是你创建分布式应用所需要的第一点。
第二点是围绕网络。我们有了应用之后,我们希望它能够可靠地连接到其他服务,无论该服务是在集群内部还是在外部。我们希望其具有服务发现、负载均衡的能力。为了不同的发布策略或是其他的一些原因的我们希望有流量转移的能力。然后我们还希望其具有与其他系统进行弹性通信的能力,无论是通过重试、超时还是断路器。要有适当的安全保障,并且要有足够的监控、追踪、可观察性等等。
我们有了网络之后,接下来就是我们希望有能力与不同的 API 和端点交互,即资源绑定–与其他协议和不同的数据格式交互。甚至能够从一种数据格式转换成另一种数据格式。我还会在这里加入诸如过滤功能,也就是说,当我们订阅一个主题时,我们也许只对某些事件感兴趣。
你认为最后一类是什么?是状态。当我在说状态和有状态的抽象时,我并不是在谈论实际的状态管理,比如数据库或者文件系统的功能。我要说的更多是有关幕后依赖状态的开发人员抽象。可能,你需要具有工作流管理的能力。也许你想管理运行时间长的进程或者做临时调度或者某些定时任务来定期运行服务。也许你还想进行分布式缓存,具有幂等性或者支持回滚。所有这些都是开发人员级的原语,但在幕后,它们依赖于具有某种状态。你想随意使用这些抽象来创建完善的分布式系统。
我们将使用这个分布式系统原语的框架来评估它们在 Kubernetes 和其他项目上的变化情况。
单体架构——传统中间件功能
假设我们从单体架构以及如何获得这些能力开始。在那种情况下,首先是当我说单体的时候,在分布式应用的情况下我想到的是 ESB。ESB 是相当强大的,当我们检查我们的需求列表时,我们会说 ESB 对所有有状态的抽象有很好的支持。
使用 ESB,你可以进行长时间运行的流程的编排、分布式事务、回滚和幂等。此外,ESB 还提供了出色的资源绑定能力,并且有数百个连接器,支持转换、编排,甚至有联网功能。最后,ESB 甚至可以做服务发现和负载均衡。
它具有围绕网络连接的弹性的所有功能,因此它可以进行重试。可能 ESB 本质上不是很分布式,所以它不需要非常高级的网络和发布能力。ESB 欠缺的主要是生命周期管理。因为它是单一运行时,所以第一件事就是你只能使用一种语言。通常是创建实际运行时的语言,Java、.NET 或者其他的语言。然后,因为是单一运行时,我们不能轻松地进行声明式的部署或者自动调配。部署是相当大且非常重的,所以它通常涉及到人机交互。这种单体架构的另一个难点是扩展:“我们无法扩展单个组件。”
最后却并非最不重要的一点是,围绕隔离,无论是资源隔离还是故障隔离。使用单体架构无法完成所有这些工作。从我们的需求框架来看,ESB 的单体架构不符合条件。
云原生架构——微服务和 Kubernetes
接下来,我建议我们研究一下云原生架构以及这些需求是如何变化的。如果我们从一个非常高的层面来看,这些架构是如何发生变化的,云原生可能始于微服务运动。微服务使我们可以按业务领域进行拆分单体应用。事实证明,容器和 Kubernetes 实际上是管理这些微服务的优秀平台。让我们来看一下 Kubernetes 对于微服务特别有吸引力的一些具体特性和功能。
从一开始,进行健康状况探测的能力就是 Kubernetes 受欢迎的原因。在实践中,这意味着当你将容器部署到 Pod 中时,Kubernetes 会检查进程的运行状况。通常情况下,该过程模型还不够好。你可能仍然有一个已启动并正在运行的进程,但是它并不健康。这就是为什么还可以使用就绪度和存活度检查的原因。Kubernetes 会做一个就绪度检查,以确定你的应用在启动期间何时准备接受流量。它将进行活跃度检查,以检查服务的运行状况。在 Kubernetes 之前,这并不是很流行,但今天几乎所有语言、所有框架、所有运行时都有健康检查功能,你可以在其中快速启动端点。
Kubernetes 引入的下一个特性是围绕应用程序的托管生命周期——我的意思是,你不再控制何时启动、何时关闭服务。你相信平台可以做到这一点。Kubernetes 可以启动你的应用;它可以将其关闭,然后在不同的节点上移动它。为此,你必须正确执行平台在应用启动和关闭期间告诉你的事件。
Kubernetes 流行的另一件特性是围绕着声明式部署。这意味着你不再需要启动服务;检查日志是否已经启动。你不必手动升级实例——支持声明式部署的 Kubernetes 可以为你做到这一点。根据你选择的策略,它可以停止旧实例并启动新实例。此外,如果出现问题,可以进行回滚。
另外就是声明你的资源需求。创建服务时,将其容器化。最好告诉平台该服务将需要多少 CPU 和内存。Kubernetes 利用这些信息为你的工作负载找到最佳节点。在使用 Kubernetes 之前,我们必须根据我们的标准将实例手动放置到一个节点上。现在,我们可以根据自己的偏好来指导 Kubernetes,它将为我们做出最佳的决策。
如今,在 Kubernetes 上,你可以进行多语言配置管理。无需在应用程序运行时进行配置查找就可以进行任何操作。Kubernetes 会确保配置最终在工作负载所在的同一节点上。这些配置被映射为卷或环境变量,以供你的应用程序使用。
事实证明,我刚才谈到的那些特定功能也是相关的。比如说,如果要进行自动放置,则必须告诉 Kubernetes 服务的资源需求。然后,你必须告诉它要使用的部署策略。为了让策略正确运行,你的应用程序必须执行来自环境的事件。它必须执行健康检查。一旦采用了所有这些最佳实践并使用所有这些功能,你的应用就会成为出色的云原生公民,并且可以在 Kubernetes 上实现自动化了(这是在 Kubernetes 上运行工作负载的基本模式)。最后,还有围绕着构建 Pod 中的容器、配置管理和行为,还有其他模式。
我要简要介绍的下一个主题是工作负载。从生命周期的角度来看,我们希望能够运行不同的工作负载。我们也可以在 Kubernetes 上做到这一点。运行十二要素应用程序和无状态微服务非常简单。Kubernetes 可以做到这一点。这不是你将要承担的唯一工作量。可能你还有有状态的工作负载,你可以使用有状态集在 Kubernetes 上完成此工作。
你可能还有的另一个工作负载是单例。也许你希望某个应用程序的实例是整个集群中应用程序的唯一一个实例–你希望它成为可靠的单例。如果失败,则重新启动。因此,你可以根据需求以及是否希望单例至少具有一种或最多一种语义来在有状态集和副本集之间进行选择。你可能还有的另一个工作负载是围绕作业和定时作业–有了 Kubernetes,你也可以实现这些。
如果我们将所有这些 Kubernetes 功能映射到我们的需求,则 Kubernetes 可以满足生命周期需求。我通常创建的需求列表主要是由 Kubernetes 今天提供给我们的。这些是任何平台上的预期功能,而 Kubernetes 可以为你的部署做的是配置管理、资源隔离和故障隔离。此外,除了无服务器本身之外,它还支持其他工作负载。
然后,如果这就是 Kubernetes 给开发者提供的全部功能,那么我们该如何扩展 Kubernetes 呢?以及如何使它具有更多功能?因此,我想描述当今使用的两种常用方法。
进程外扩展机制
首先是 Pod 的概念,Pod 是用于在节点上部署容器的抽象。此外,Pod 给我们提供了两组保证:
- 第一组是部署保证 – Pod 中的所有容器始终位于同一个节点上。这意味着它们可以通过 localhost 相互通信,也可以使用文件系统或通过其他 IPC 机制进行异步通信。
- Pod 给我们的另一组保证是围绕生命周期的。Pod 中的所有容器并非都相等。
根据使用的是 init 容器还是应用程序容器,你会获得不同的保证。例如,init 容器在开始时运行;当 Pod 启动时,它按顺序一个接一个地运行。他们仅在之前的容器已成功完成时运行。它们有助于实现由容器驱动的类似工作流的逻辑。
另一方面,应用程序容器是并行运行的。它们在整个 Pod 的生命周期中运行,这也是 sidecar 模式的基础。sidecar 可以运行多个容器,这些容器可以协作并共同为用户提供价值。这也是当今我们看到的扩展 Kubernetes 附加功能的主要机制之一。
为了解释以下功能,我必须简要地告诉你 Kubernetes 内部的工作方式。它是基于调谐循环的。调谐循环的思想是将期望状态驱动到实际状态。在 Kubernetes 中,很多功能都是靠这个来实现的。例如,当你说我要两个 Pod 实例,这系统的期望状态。有一个控制循环不断地运行,并检查你的 Pod 是否有两个实例。如果不存在两个实例,它将计算差值。它将确保存在两个实例。
这方面的例子有很多。一些是副本集或有状态集。资源定义映射到控制器是什么,并且每个资源定义都有一个控制器。该控制器确保现实世界与所需控制器相匹配,你甚至可以编写自己的自定义控制器。
当在 Pod 中运行应用程序时,你将无法在运行时加载任何配置文件更改。然而,你可以编写一个自定义控制器,检测 config map 的变化,重新启动 Pod 和应用程序–从而获取配置更改。
事实证明,即使 Kubernetes 拥有丰富的资源集合,但它们并不能满足你的所有不同需求。Kubernetes 引入了自定义资源定义的概念。这意味着你可以对需求进行建模并定义适用于 Kubernetes 的 API。它与其他 Kubernetes 原生资源共存。你可以用能理解模型的任何语言编写自己的控制器。你可以设计一个用 Java 实现的 ConfigWatcher,描述我们前面所解释的内容。这就是 operator 模式,即与自定义资源定义一起使用的控制器。如今,我们看到很多 operator 加入,这就是第二种扩展 Kubernetes 附加功能的方式。
接下来,我想简单介绍一下基于 Kubernetes 构建的一些平台,这些平台大量使用 sidecar 和 operator 来给开发者提供额外的功能。
什么是服务网格?
让我们从服务网格开始,什么是服务网格?
我们有两个服务,服务 A 要调用服务 B,并且可以用任何语言。把这个当做是我们的应用工作负载。服务网格使用 sidecar 控制器,并在我们的服务旁边注入一个代理。你最终会在 Pod 中得到两个容器。代理是一个透明的代理,你的应用对这个代理完全无感知–它拦截所有传入和传出的流量。此外,代理还充当数据防火墙。
这些服务代理的集合代表了你的数据平面,并且很小且无状态。为了获得所有状态和配置,它们依赖于控制平面。控制平面是保持所有配置,收集指标,做出决定并与数据平面进行交互的有状态部分。此外,它们是不同控制平面和数据平面的正确选择。事实证明,我们还需要一个组件-一个 API 网关,以将数据获取到我们的集群中。一些服务网格具有自己的 API 网关,而某些使用第三方。如果你研究下所有这些组件,它们将提供我们所需的功能。
API 网关主要专注于抽象我们服务的实现。它隐藏细节并提供边界功能。服务网格则相反。在某种程度上,它增强了服务内的可见性和可靠性。可以说,API 网关和服务网格共同提供了所有网络需求。要在 Kubernetes 上获得网络功能,仅使用服务是不够的:“你需要一些服务网格。”
未来云原生趋势–生命周期趋势
在接下来的部分,我列出了一些我认为在这些领域正在发生令人振奋的发展的项目。
我想从生命周期开始。通过 Kubernetes,我们可以为应用程序提供一个有用的生命周期,这可能不足以进行更复杂的生命周期管理。比如,如果你有一个更复杂的有状态应用,则可能会有这样的场景,其中 Kubernetes 中的部署原语不足以为应用提供支持。
在这些场景下,你可以使用 operator 模式。你可以使用一个 operator 来进行部署和升级,还可以将 S3 作为服务备份的存储介质。此外,你可能还会发现 Kubernetes 的实际健康检查机制不够好。假设存活检查和就绪检查不够好。在这种情况下,你可以使用 operator 对你的应用进行更智能的存活和就绪检查,然后在此基础上进行恢复。
第三个领域就是自动伸缩和调整。你可以让 operator 更好的了解你的应用,并在平台上进行自动调整。目前,编写 operator 的框架主要有两个,一个是 Kubernetes 特别兴趣小组的 Kubebuilder,另一个是红帽创建的 operator 框架的一部分–operator SDK。它有以下几个方面的内容:
Operator SDK 让你可以编写 operator – operator 生命周期管理器来管理 operator 的生命周期,以及可以发布你的 operator 到 OperatorHub。如今在 OperatorHub,你会看到 100 多个 operator 用于管理数据库、消息队列和监控工具。从生命周期空间来看,operator 可能是 Kubernetes 生态系统中发展最活跃的领域。
网络趋势 - Envoy
我选的另一个项目是 Envoy。服务网格接口规范的引入将使你更轻松地切换不同的服务网格实现。在部署上 Istio 对架构进行了一些整合。你不再需要为控制平面部署 7 个 Pod;现在,你只需要部署一次就可以了。更有趣的是在 Envoy 项目的数据平面上所正在发生的:越来越多的第 7 层协议被添加到 Envoy 中。
服务网格增加了对更多协议的支持,比如 MongoDB、ZooKeeper、MySQL、Redis,而最新的协议是 Kafka。我看到 Kafka 社区现在正在进一步改进他们的协议,使其对服务网格更加友好。我们可以预料将会有更紧密的集成、更多的功能。最有可能的是,会有一些桥接的能力。你可以从服务中在你的应用本地做一个 HTTP 调用,而代理将在后台使用 Kafka。你可以在应用外部,在 sidecar 中针对 Kafka 协议进行转换和加密。
另一个令人兴奋的发展是引入了 HTTP 缓存。现在 Envoy 可以进行 HTTP 缓存。你不必在你的应用中使用缓存客户端。所有这些都是在 sidecar 中透明地完成的。有了 tap 过滤器,你可以 tap 流量并获得流量的副本。最近,WebAssembly 的引入,意味着如果你要为 Envoy 编写一些自定义的过滤器,你不必用 C++ 编写,也不必编译整个 Envoy 运行时。你可以用 WebAssembly 写你的过滤器,然后在运行时进行部署。这些大多数还在进行中。它们不存在,说明数据平面和服务网格无意停止,仅支持 HTTP 和 gRPC。他们有兴趣支持更多的应用层协议,为你提供更多的功能,以实现更多的用例。最主要的是,随着 WebAssembly 的引入,你现在可以在 sidecar 中编写自定义逻辑。只要你没有在其中添加一些业务逻辑就可以了。
智能的 sidecar 和愚蠢的管道
如果更深入地看,那可能是什么样的,你可以使用一些高级语言编写业务逻辑。是什么并不重要,不必仅是 Java,因为你可以使用任何其他语言并在内部开发自定义逻辑。
你的业务逻辑与外部世界的所有交互都是通过 sidecar 发生的,并与平台集成进行生命周期管理。它为外部系统执行网络抽象,为你提供高级的绑定功能和状态抽象。sidecar 是你不需要开发的东西。你可以从货架上拿到它。你用一点 YAML 或 JSON 配置它,然后就可以使用它。这意味着你可以轻松地更新 sidecar,因为它不再被嵌入到你的运行时。这使得打补丁、更新变得更加更容易。它为我们的业务逻辑启用了多语言运行时。
微服务之后是什么?
这让我想到了最初的问题,微服务之后是什么?
如果我们看下架构的发展历程,应用架构在很高的层面上是从单体应用开始的。然而微服务给我们提供了如何把一个单体应用拆分成独立的业务域的指导原则。之后又出现了无服务器和功能即服务(FaaS),我们说过可以按操作将其进一步拆分,从而实现极高的可扩展性-因为我们可以分别扩展每个操作。
我想说的是 FaaS 并不是最好的模式 – 因为功能并不是实现合理的复杂服务的最佳模式,在这种情况下,当多个操作必须与同一个数据集进行交互时,你希望它们驻留在一起。可能是多运行时(我把它称为 Mecha 架构),在该架构中你将业务逻辑放在一个容器中,而所有与基础设施相关的关注点作为一个单独的容器存在。它们共同代表多运行时微服务。也许这是一个更合适的模型,因为它有更好的属性。
你可以获得微服务的所有好处。仍然将所有域和所有限界上下文放在一处。你将所有的基础设施和分布式应用需求放在一个单独的容器中,并在运行时将它们组合在一起。大概,现在最接近这种模型的是 Dapr。他们正在遵循这种模型。如果你仅对网络方面感兴趣,那么可能使用 Envoy 也会接近这种模型。