Spring Cloud Data Flow教程系列-2: 架构解析(spring cloud data flow和flink)(spring cloud data flow 高可用)

访客 111 0

架构

Spring Cloud Data Flow使得开发和部署专注于数据处理用例的应用程序变得更加简单。

核心概念:

  • 数据流的服务器组件。
  • 服务器组件可以为流和批处理作业部署的应用程序类型。
  • 已部署应用程序的微服务架构以及如何使用 DSL 进行定义。
  • 部署它们的平台。

服务器组件

数据流由两个主要组成部分构成:

  • 数据流服务器
  • 船长服务器

通过 RESTful API,数据流服务器成为访问数据流的主要入口。Web 仪表板由数据流服务器提供服务,并且 Data Flow Server 和 Data Flow Shell 应用程序都通过 Web API 进行通信。

这些服务器可以在多个平台上运行,包括Cloud Foundry、Kubernetes以及您的本地计算机。每个服务器都会将其状态存储在关系数据库中。

以下图所示,呈现了架构和通信路径的高级视觉展示:

Spring Cloud Data Flow教程系列-2: 架构解析(spring cloud data flow和flink)(spring cloud data flow 高可用)-第1张图片-谷歌商店上架

数据流服务器

数据流服务器负责

  • 基于域特定语言 (DSL) 解析流和批处理作业定义。
  • 验证和持久化流、任务和批处理作业定义。
  • 将 jar 和 Docker 映像等工件注册到 DSL 中使用的名称。
  • 将批处理作业部署到一个或多个平台。
  • 将作业调度委托给平台。
  • 查询详细的任务和批处理作业执行历史。
  • 将配置属性添加到配置消息输入和输出的流以及传递部署属性(例如初始实例数、内存要求和数据分区)。
  • 将流部署委托给 Skipper。
  • 审核操作(例如流创建、部署和取消部署以及批量创建、启动和删除)。
  • 提供流和批处理作业 DSL 选项卡完成功能。

船长服务器

船长服务器的职责包括:

  • 将流部署到一个或多个平台。
  • 使用基于状态机的蓝/绿更新策略在一个或多个平台上升级和回滚流。
  • 存储每个流的清单文件的历史记录(代表已部署的应用程序的最终描述)。

数据库

Data Flow Server 和 Skipper Server 需要安装关系型数据库管理系统(RDBMS)。默认情况下,服务器使用内置的 H2 数据库。您可以根据需要将服务器配置为使用外部数据库。支持的数据库包括 H2、HSQLDB、MySQL、Oracle、Postgresql、DB2 和 SqlServer。每次启动服务器时,都会自动创建相应的模式。

安全

Data Flow 和 Skipper Server 可执行 jar 使用 OAuth 2.0 身份验证来保护相关的 REST 端点。您可以使用基本身份验证或使用 OAuth2 访问令牌来访问它们。对于 OAuth 提供程序,我们建议使用 CloudFoundry 用户帐户和身份验证 (UAA) 服务器,它还提供全面的 LDAP 支持。

在默认情况下,REST 端点(用于管理、监控和运行状态)以及仪表板 UI 可以无需进行身份验证即可访问。

应用类型

应用程序存在两种形式:

  • 长期应用。有两种类型的长寿命应用程序:
    • 消息驱动的应用程序,其中通过单个输入或输出(或两者)消耗或产生无限量的数据。
    • 第二种是消息驱动的应用程序,可以有多个输入和输出。它也可能是一个根本不使用消息中间件的应用程序。
  • 处理有限数据集然后终止的短期应用程序。短期应用程序有两种变体。
    • 第一个是运行您的代码并在数据流数据库中记录执行状态的任务。它可以选择使用 Spring Cloud Task 框架,而不必是 Java 应用程序。但是,应用程序确实需要在 Data Flow 的数据库中记录其运行状态。
    • 第二个是第一个的扩展,它包含 Spring Batch 框架作为执行批处理的基础。

在开发数据管道时,通常会使用基于Spring Cloud Stream框架编写长期应用程序,以及基于Spring Cloud Task或Spring Batch框架编写短期应用程序。文档中提供了许多指南,向您展示如何使用这些框架。然而,您也有可能选择编写不依赖于Spring的长期和短期应用程序,并且可以使用其他编程语言来实现它们。

根据运行时,您有两种打包应用程序的选择方式:

  • 可以从 Maven 存储库、文件位置或通过 HTTP 访问的 Spring Boot uber-jar。
  • 托管在 Docker 注册表中的 Docker 映像。

长期应用

预计长期应用程序将持续运行,若应用程序停止运行,平台将负责自动重新启动。

Spring Cloud Stream 框架为编写消息驱动的微服务应用程序,连接到通用消息系统提供了一种简化的编程模型。您可以编写与特定中间件无关的核心业务逻辑。通过将 Spring Cloud Stream Binder 库作为依赖项添加到应用程序,您可以确定要使用的中间件。

Skipper 服务器被委托为数据流服务器,负责部署长期存在的应用程序。

带有源、处理器和接收器的流

Spring Cloud Stream 引入了绑定接口的概念,这些接口在代码中封装了消息交换模式,决定了应用程序的输入和输出。Spring Cloud Stream 提供了多个绑定接口,对应着常见的消息交换合约。

  • Source:将消息发送到目的地的消息生产者。
  • Sink:从目的地读取消息的消息消费者。
  • Processor: 源和汇的组合。处理器使用来自目的地的消息并产生要发送到另一个目的地的消息。

通过使用sourceprocessorsink,这三种类型的应用程序向 Data Flow 注册并描述正在注册的应用程序的type

以下是一个示例,展示了用于注册http源的应用程序(该应用程序侦听HTTP请求并将HTTP有效负载发送到目标log),以及接收器的应用程序(该应用程序从目标消费并记录接收到的消息)。下面是相应的shell语法:

dataflow: > app register --name http --type source --uri maven://org.springframework.cloud.stream.app:http-source-rabbit:1.2.0.RELEASE
Application 'source:http' successfully registered.
dataflow: > app register --name log --type sink --uri 
“使用命令dataflow:>stream create --name httpStream --definition "http | log"可以创建一个名为httpStream的数据流。管道符号http | log表示将源输出连接到接收器输入。在部署流时,需要设置适当的属性,以便源和接收器可以通过消息传递中间件进行通信。” 
具有多个输入和输出的流

源、汇和处理器都具备单一输出、单一输入或同时具备两者的能力。这使得 Data Flow 可以通过应用程序属性来配对输出目标与输入目标。然而,消息处理应用程序可能存在多个输入或输出目标。为了支持这一点,Spring Cloud Stream 允许您定义自定义绑定接口。

如果要定义一个包含多个输入的应用程序的数据流,必须使用注册该应用程序类型而不是source、sink或processor类型。流定义使用流应用DSL,它将单管道符号(|)替换为双管道符号(||)。将其||视为“并行”的意思,表示应用程序之间没有隐含的联系。

以下是一个虚构的orderStream的示例:

使用Data Flow时,您可以通过使用|符号来定义流。这样,每个应用程序都可以与其在DSL中相邻的应用程序进行通信,并且始终有一个输出与一个输入配对。当您使用||符号时,请确保提供将多个输出和输入目标配对在一起的配置属性。要实现这一点,您可以执行以下命令:
dataflow:> stream create --definition orderGeneratorApp || baristaApp || hotDrinkDeliveryApp || coldDrinkDeliveryApp --name orderStream

您还可以通过使用 Stream Application DSL 和部署不依赖消息传递中间件的应用程序,来构建一个包含单个应用程序的流。

通过这些示例,您可以初步了解长期存在的应用程序类型。其他指南将更详细地介绍如何开发、测试和注册这类应用程序,并指导您如何有效地部署它们。

接下来的主要部分将探讨已经实施的流程运行时架构。

短期应用

短期应用程序通常在运行一段时间后终止,这段时间可以是几分钟到几小时。它们的运行可能基于计划,比如每个工作日早上6点,或者响应事件,比如将文件放入FTP服务器。

Spring Cloud Task 框架使您能够开发短暂的微服务,记录应用程序的生命周期事件,如开始时间、结束时间和退出代码。

通过使用名称task来描述应用程序的类型,任务应用程序向数据流注册。

以下是一个示例,展示了用于注册timestamp任务(打印当前时间并退出的应用程序)的shell语法:

复制

以下是任务定义的示例,通过引用任务名称来创建:

```
dataflow:> app register --name timestamp --type task --uri maven://org.springframework.cloud.task.app:timestamp-task:2.1.0.RELEASE
``` 
dataflow:> task create tsTask --definition "timestamp"
这段话可以改写为:Spring Batch 框架是 Spring 开发人员在编写短期应用程序时常考虑的选择。相比于 Spring Cloud Task,Spring Batch 提供了更丰富的功能集,特别适合处理大量数据。一个典型的使用场景是读取多个 CSV 文件,并对每一行数据进行转换,然后将转换后的行写入数据库。Spring Batch 提供了自己的数据库模式,其中包含有关 Spring Batch 作业执行更详细信息的集合。由于 Spring Cloud Task 与 Spring Batch 集成,在定义了 Spring Batch 作业的情况下,会创建一个链接来连接 Spring Cloud Task 和 Spring Batch 运行表。”

在与前述示例相同的方式下,使用Spring Batch任务进行注册和创建。

Spring Cloud Data Flow 服务器负责将任务部署到平台并启动运行。

组合任务

Spring Cloud Data Flow 允许用户创建一个有向图,其中每个节点都代表一个任务应用程序。

通过使用组合任务域特定语言,我们可以完成对组合任务的操作。Composed Task DSL中有几个符号决定了整个流程,详细介绍请参考指南。以下示例展示了如何使用双&符号(&&)进行条件执行:

使用数据流操作符创建一个名为simpleComposedTask的简单组合任务,其定义为“task1 && task2”。DSL表达式(task1 && task2)表示只有在task1成功运行后,才会启动task2。该任务图由名为Composed Task Runner的任务应用程序来执行。 

其他指南将提供更详细的说明,包括开发、测试和注册短期应用程序的步骤,以及如何成功部署它们。

应用程序元数据

长期和短期应用程序都能够提供关于支持的配置属性的元数据。当构建数据管道时,Shell和UI工具利用这些元数据来提供上下文帮助和代码完成功能。

预建应用程序

为了开始您的开发,您可以利用许多预先构建的应用程序来与常见的数据源和接收器进行集成。举例来说,您可以使用 Cassandra 将数据写入,并使用 Groovy 脚本转换传入数据的处理器 groovy-transform 的接收器。

在安装说明中,详细介绍了如何使用 Spring Cloud Data Flow 来注册这些应用程序。

微服务架构风格

Data Flow和Skipper服务器将流和组合的批处理作业作为微服务应用程序的集合部署到平台。每个微服务应用程序都在自己的进程中运行,可以独立进行扩展或缩减,并且具有自己的版本控制生命周期。通过Skipper,在运行时可以独立升级或回滚流中的每个应用程序。

在使用 Spring Cloud Stream 和 Spring Cloud Task 时,每个微服务应用程序都以 Spring Boot 作为基础库。这样一来,所有微服务应用程序都能享受到一系列功能的好处,包括健康检查、安全性、可配置的日志记录、监控和管理功能,以及可执行的 JAR 打包。

需要强调的是,这些微服务应用程序只是普通的应用程序。您可以通过使用java -jar命令并传入适当的配置属性来运行它们。创建自己的数据处理微服务应用程序与创建其他Spring Boot应用程序类似。您可以从Spring Initializr网站开始,创建基于流或基于任务的微服务的基本脚手架。

除了将适当的应用程序属性传递给每个应用程序外,数据流和Skipper服务器还负责为目标平台准备基础架构。在Cloud Foundry中,它会将指定的服务绑定到应用程序;而在Kubernetes中,则会创建部署和服务资源。

使用数据流服务器可以简化多个相关应用程序到目标运行时的部署,它能够设置必要的输入和输出主题、分区和度量功能。然而,您也可以选择手动部署每个微服务应用程序,而不使用Data Flow或Skipper。这种方法适合从小规模部署开始,并随着您开发更多应用程序逐渐采用数据流的便利性和一致性。手动部署基于流和任务的微服务也是一项有益的教育练习,可以帮助您更好地了解Data Flow Server提供的自动应用程序配置和平台定位步骤。遵循这种方法将指导流和批处理开发人员进行开发工作。

与其他架构的比较

Spring Cloud Data Flow采用了与其他流和批处理平台不同的架构风格。传统的平台如Apache Spark、Apache Flink和Google Cloud Dataflow,需要在专用的计算引擎集群上运行应用程序。相比之下,Spring Cloud Data Flow通过引入更简化的执行环境来创建以数据为中心的应用程序,避免了复杂性。 这并不意味着在使用Spring Cloud Data Flow时无法进行实时数据计算。事实上,您可以开发应用程序利用Kafka Streams API进行时间滑动窗口、移动平均等复杂计算,并将传入消息与参考数据集连接起来。

这种方法的一个优点是我们可以在运行时将任务委托给流行的平台。数据流能够充分利用它们丰富的功能集(如弹性和可扩展性),同时也能借助您已经掌握的关于这些平台的知识,因为您可能会将它们用于其他目标。这样一来,创建和管理以数据为核心的应用程序就减少了认知上的障碍,因为许多与部署其他最终用户/Web应用程序相关的技能都可以直接适用。

下面的图表展示了一个简单流程的运行时架构:

Spring Cloud Data Flow教程系列-2: 架构解析(spring cloud data flow和flink)(spring cloud data flow 高可用)-第2张图片-谷歌商店上架

Stream DSL 是由 POST 数据流服务器发送的。通过基于 DSL 应用程序名称到 Maven 和 Docker 工件的映射,Skipper 将 http 源和接收 jdbc 器应用程序部署到目标平台。随后,数据发布到 HTTP 应用程序将被存储在数据库中。

该应用程序在指定的平台上运行,并具有数据流或船长服务器连接,其中包括http源和jdbc汇。

下图展示了一个运行时架构,其中包含多个应用程序,这些应用程序可以具有多个输入和输出。

Spring Cloud Data Flow教程系列-2: 架构解析(spring cloud data flow和flink)(spring cloud data flow 高可用)-第3张图片-谷歌商店上架

在结构上,它是使用相同的时Source、Sink或Processor应用程序。定义此架构的Stream Application DSL使用双管道符号(||)而不是单管道(|)符号。此外,当您部署此流时,您必须提供更多信息来描述如何使用消息传递系统将每个应用程序连接到另一个应用程序。

任务和批处理作业

请参考以下改写: “下图展示了 Task 和 Spring Batch 作业的运行时架构,如下所示:”

Spring Cloud Data Flow教程系列-2: 架构解析(spring cloud data flow和flink)(spring cloud data flow 高可用)-第4张图片-谷歌商店上架

组合任务

请参考下图,展示了组合任务的运行时架构:

Spring Cloud Data Flow教程系列-2: 架构解析(spring cloud data flow和flink)(spring cloud data flow 高可用)-第5张图片-谷歌商店上架

平台

您可以将 Spring Cloud Data Flow Server 和 Skipper Server 部署在 Cloud Foundry、Kubernetes 或本地机器上。

您还可以将这些服务器上的应用程序部署到多个平台。

  • 本地:可以部署到本地机器、Cloud Foundry 或 Kubernetes。
  • Cloud Foundry:可以部署到 Cloud Foundry 或 Kubernetes。
  • Kubernetes:可以部署到 Kubernetes 或 Cloud Foundry。

最常见的架构是将数据流和 Skipper 服务器安装在部署应用程序的同一平台上。您还可以部署到多个 Cloud Foundry 组织、空间和基础以及多个 Kubernetes 集群。

标签: 谷歌商店上架 数据流 架构

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~