通过服务网格从模块到微服务

通过服务网格从模块到微服务

时间:2021-2-23 作者:admin

标题说明了一切,但细节总是受欢迎的。但首先是一些定义。根据经典文章马丁·福勒:

“微服务体系结构风格是一种将单个应用程序开发为一组小型服务的方法,每个服务都在自己的流程中运行,并与轻量级机制(通常是HTTP资源API)进行通信。这些服务是围绕业务功能和独立部署构建的。“

另一方面,Monolith是作为单个逻辑可执行文件部署的应用程序。独角兽的问题是,再次引用福勒的话,

更改周期是绑定在一起的–对应用程序的一小部分所做的更改需要重建和部署整个Monolith。随着时间的推移,通常很难保持一个良好的模块化结构,这使得保持应该只影响该模块中的一个模块的更改变得更加困难。缩放需要扩展整个应用程序,而不是需要更多资源的部分。“

还在继续,

“自从我们参与软件行业以来,人们就一直希望通过插接组件来构建系统… 元件是独立可替换和可升级的软件单元。

我们定义图书馆作为链接到程序并使用内存中函数调用的组件,而服务是与Web服务请求或远程过程调用等机制通信的进程外组件。“

因此,微服务体系结构(microservice Architecture,MSA)是将应用程序分解为作为服务的组件。MSA的优点是组件具有坚实的模块边界,可以由独立的团队开发。它们是独立的可部署和可扩展的(从而提高了特性的速度),并且可以用不同的语言构建,比如NodeJS和Java。

我偷偷地怀疑,是应用程序的组件化是MSA的主要吸引力所在。使用MSA(作为绿地应用程序或迁移现有应用程序)开发应用程序的主要问题是确定组件边界。对于域驱动设计/有界上下文的所有挥手,这可能是一项非常重要的任务,需要几轮重构,特别是为了解耦持久层[SamNewman]。当组件分散在网络边界上时,这就变得更加困难了。我认为这是因为我们错过了应用程序模块化的中间步骤。

看看日期就知道了:前面提到的Fowler文章,介绍了MSA,是在2014年。萨姆·纽曼经典书于2015年2月出版。Java 9与Java平台模块系统在2017年才发布。因此,至少对于缺乏模块系统的Java开发人员,MSA提供了一个替代。

模块系统的主要优点是:

  • 显式接口后面的强封装:实现隐藏在定义良好的接口后面。这使得不同的团队能够独立开发不同的模块。
  • 可靠配置:这使我们能够明确地了解模块的依赖关系。因此,它允许我们在编译时确定缺少的依赖项。这是MSA的一个显著弱点,因为依赖关系不显着,只有在运行时才能检测到缺少的依赖项。

模块化应用

模块化应用是一个模块集合,通过定义良好的接口进行通信,可能由独立的团队开发。从Java 9开始,模块化就在平台本身中。其他语言也有类似的功能,例如,JavaScript自ES 2015以来就有了模块。用不同语言编写的模块可以运行在Polyglot VM上,如GraalVM。GraalVM的多标记功能使得在一个应用程序中混合多种编程语言成为可能,同时消除了任何外文调用成本。GraalVM支持的一些语言是JVM语言、JavaScript、Python、Ruby和LLVM语言,如C和C++,等等。

模Monolith是一个模块应用程序,部署为一个单独的可执行文件,可能运行在Polyglot VM上。

如果应用程序是模块化的单体,则重构组件边界相对容易,尤其是在Java中,因为模块系统有编译器支持。如果经过反复的架构重构之后,我们加强了边界,并确定了哪些模块集合–称之为microlet–需要扩展,那么现在是时候剥离这个微设备并使其成为一个单独的部署单元了。现在,通信不再是进程内通信,而是通过HTTP或GRPC进行的远程通信。当然,您需要修改代码以将本地调用转换为REST。但这还不是全部。用远程调用代替本地调用会遇到众所周知的分布式计算谬误。

  • 网络是可靠的-提供自动重试。
  • 延迟为零-为请求超时、断路器提供准备。
  • 网络是安全的-提供证书和相互TLS。
  • 网络是同质的–我们需要使用像Jager这样的工具来跟踪调用。

如果像我一样,您已经习惯了使用SpringBoot和Netflix堆栈来开发您的微服务,那么所有这些都在我们必须修改的代码中。但我们可以将网络问题具体化。

服务网格

通过服务网格从模块到微服务

服务网格是您的服务之间的结缔组织,它添加了额外的功能,允许应用程序从应用程序级库中卸载这些功能。在服务网格中,如伊斯蒂奥,代理被手动或自动地注入到容纳您的微服务的吊舱中。这个“侧车”拦截所有入站和出站呼叫,以应用诸如重试、超时、断路器、客户端负载平衡等策略。所有HTTP调用都可以配置为使用互TLS。此外,它还支持Jager进行跟踪,并与Grafana和Prometheus等工具进行度量集成。所有这些都是通过在YAML文件中使用异辛工具。看见关于细节。

通过服务网格从模块到微服务

结语

问题的本质是模块化是一种设计/开发时活动,网络上的分发是一种部署时活动。没有模块化步骤,大多数关于MSA的讨论都将两者混为一谈。这种分离导致了一个更直截了当的路线图。简而言之:首先模块化,然后(如果需要)分发。

福州小程序开发

版权所有:https://www.eraycloud.com 转载请注明出处