附录

遇到 Spring Cloud Data Flow 问题,我们很乐意提供帮助!spring-doc.cadn.net.cn

附录 A:数据流模板

如 API 指南一章所述,Spring Cloud Data Flow 的功能通过 REST 端点完全公开。 虽然您可以直接使用这些端点,但 Spring Cloud Data Flow 还提供了一个基于 Java 的 API,这使得使用这些 REST 端点变得更加容易。spring-doc.cadn.net.cn

中心入口点是DataFlowTemplate类在org.springframework.cloud.dataflow.rest.client包。spring-doc.cadn.net.cn

此类实现了DataFlowOperations接口,并委托给以下子模板,这些子模板为每个功能集提供特定功能:spring-doc.cadn.net.cn

接口 描述

StreamOperationsspring-doc.cadn.net.cn

用于流作的 REST 客户端spring-doc.cadn.net.cn

CounterOperationsspring-doc.cadn.net.cn

用于计数器作的 REST 客户端spring-doc.cadn.net.cn

FieldValueCounterOperationsspring-doc.cadn.net.cn

用于字段值计数器作的 REST 客户端spring-doc.cadn.net.cn

AggregateCounterOperationsspring-doc.cadn.net.cn

用于聚合计数器作的 REST 客户端spring-doc.cadn.net.cn

TaskOperationsspring-doc.cadn.net.cn

用于任务作的 REST 客户端spring-doc.cadn.net.cn

JobOperationsspring-doc.cadn.net.cn

用于作业作的 REST 客户端spring-doc.cadn.net.cn

AppRegistryOperationsspring-doc.cadn.net.cn

用于应用注册表作的 REST 客户端spring-doc.cadn.net.cn

CompletionOperationsspring-doc.cadn.net.cn

用于完成作的 REST 客户端spring-doc.cadn.net.cn

RuntimeOperationsspring-doc.cadn.net.cn

用于运行时作的 REST 客户端spring-doc.cadn.net.cn

DataFlowTemplate正在初始化时,可以通过 REST 关系发现子模板,这些关系由 HATEOAS(超媒体作为应用程序状态的引擎)提供。spring-doc.cadn.net.cn

如果无法解析资源,则相应的子模板结果 在 NULL 中。一个常见的原因是 Spring Cloud Data Flow 允许特定的 启动时要启用或禁用的功能集。有关更多信息,请参阅本地Cloud FoundryKubernetes 配置章节之一,具体取决于您部署应用程序的位置。

A.1. 使用数据流模板

使用数据流模板时,唯一需要的数据流依赖项是 Spring Cloud Data Flow Rest Client,如以下Maven代码片段所示:spring-doc.cadn.net.cn

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-dataflow-rest-client</artifactId>
  <version>2.10.4-SNAPSHOT</version>
</dependency>

有了这个依赖关系,你会得到DataFlowTemplate类以及调用 Spring Cloud Data Flow 服务器所需的所有依赖项。spring-doc.cadn.net.cn

实例化DataFlowTemplate,您还传入RestTemplate. 请注意,所需的RestTemplate需要一些额外的配置才能在DataFlowTemplate. 当声明RestTemplate作为 bean,以下配置就足够了:spring-doc.cadn.net.cn

  @Bean
  public static RestTemplate restTemplate() {
    RestTemplate restTemplate = new RestTemplate();
    restTemplate.setErrorHandler(new VndErrorResponseErrorHandler(restTemplate.getMessageConverters()));
    for(HttpMessageConverter<?> converter : restTemplate.getMessageConverters()) {
      if (converter instanceof MappingJackson2HttpMessageConverter) {
        final MappingJackson2HttpMessageConverter jacksonConverter =
            (MappingJackson2HttpMessageConverter) converter;
        jacksonConverter.getObjectMapper()
            .registerModule(new Jackson2HalModule())
            .addMixIn(JobExecution.class, JobExecutionJacksonMixIn.class)
            .addMixIn(JobParameters.class, JobParametersJacksonMixIn.class)
            .addMixIn(JobParameter.class, JobParameterJacksonMixIn.class)
            .addMixIn(JobInstance.class, JobInstanceJacksonMixIn.class)
            .addMixIn(ExitStatus.class, ExitStatusJacksonMixIn.class)
            .addMixIn(StepExecution.class, StepExecutionJacksonMixIn.class)
            .addMixIn(ExecutionContext.class, ExecutionContextJacksonMixIn.class)
            .addMixIn(StepExecutionHistory.class, StepExecutionHistoryJacksonMixIn.class);
      }
    }
    return restTemplate;
  }
您还可以获得预配置的RestTemplate通过使用DataFlowTemplate.getDefaultDataflowRestTemplate();

现在,您可以实例化DataFlowTemplate使用以下代码:spring-doc.cadn.net.cn

DataFlowTemplate dataFlowTemplate = new DataFlowTemplate(
    new URI("http://localhost:9393/"), restTemplate);         (1)
1 URI指向 Spring Cloud Data Flow Server 的 ROOT。

根据您的要求,您现在可以调用服务器。例如 如果要获取当前可用应用程序的列表,可以运行以下代码:spring-doc.cadn.net.cn

PagedResources<AppRegistrationResource> apps = dataFlowTemplate.appRegistryOperations().list();

System.out.println(String.format("Retrieved %s application(s)",
    apps.getContent().size()));

for (AppRegistrationResource app : apps.getContent()) {
  System.out.println(String.format("App Name: %s, App Type: %s, App URI: %s",
    app.getName(),
    app.getType(),
    app.getUri()));
}

A.2. 数据流模板和安全性

使用DataFlowTemplate,还可以提供所有与安全相关的 选项,就像使用数据流外壳一样。事实上,数据流 Shell 使用DataFlowTemplate用于其所有作。spring-doc.cadn.net.cn

为了让您入门,我们提供了一个HttpClientConfigurer使用 builder 模式来设置各种与安全相关的选项:spring-doc.cadn.net.cn

	HttpClientConfigurer
		.create(targetUri)                                             (1)
		.basicAuthCredentials(username, password)                      (2)
		.skipTlsCertificateVerification()                              (3)
		.withProxyCredentials(proxyUri, proxyUsername, proxyPassword)  (4)
		.addInterceptor(interceptor)                                   (5)
		.buildClientHttpRequestFactory()                               (6)
1 使用提供的目标 URI 创建 HttpClientConfigurer。
2 设置基本身份验证的凭据(使用 OAuth2 密码授予)
3 跳过 SSL 证书验证(仅用于开发!)
4 配置任何代理设置
5 添加自定义拦截器,例如设置 OAuth2 授权标头。这允许 您可以传递 OAuth2 访问Tokens而不是用户名/密码凭据。
6 构建ClientHttpRequestFactory可以在RestTemplate.

一旦HttpClientConfigurer配置,您可以使用其buildClientHttpRequestFactory构建ClientHttpRequestFactory然后设置相应的 属性RestTemplate.然后,您可以实例化实际的DataFlowTemplate使用那个RestTemplate.spring-doc.cadn.net.cn

要配置基本身份验证,需要进行以下设置:spring-doc.cadn.net.cn

	RestTemplate restTemplate = DataFlowTemplate.getDefaultDataflowRestTemplate();
	HttpClientConfigurer httpClientConfigurer = HttpClientConfigurer.create("http://localhost:9393");

	httpClientConfigurer.basicAuthCredentials("my_username", "my_password");
	restTemplate.setRequestFactory(httpClientConfigurer.buildClientHttpRequestFactory());

	DataFlowTemplate dataFlowTemplate = new DataFlowTemplate("http://localhost:9393", restTemplate);

附录 B:“作方法”指南

本节提供了一些常见的“我该怎么做......' 人们在使用 Spring Cloud Data Flow 时经常出现的问题。spring-doc.cadn.net.cn

如果您有我们此处未介绍的特定问题,您可能需要查看 stackoverflow.com,看看是否有人已经提供了答案。 这也是提出新问题的好地方(使用spring-cloud-dataflow标签)。spring-doc.cadn.net.cn

我们也非常乐意扩展这一部分。如果您想添加“作方法”,可以向我们发送拉取请求spring-doc.cadn.net.cn

B.1. 配置Maven属性

启动数据流服务器时,可以通过命令行属性设置 Maven 属性,例如本地 Maven 存储库位置、远程 Maven 存储库、身份验证凭据和代理服务器属性。 或者,您可以通过设置SPRING_APPLICATION_JSONenvironment 数据流服务器的属性。spring-doc.cadn.net.cn

如果使用 Maven 存储库解析应用程序,则需要显式配置远程 Maven 存储库。 此规则的一个例外是localData Flow 服务器安装,其中已经预配置了 Maven Central 和 Spring Artifactory 远程存储库。 另一个 (non-local) 服务器安装没有远程存储库的默认值。spring-doc.cadn.net.cn

如果您配置自己的远程存储库,请务必添加 Maven 中心(repo.maven.apache.org/maven2),因为它不会自动为您添加。

要将属性作为命令行选项传递,请使用类似于以下内容的命令运行服务器:spring-doc.cadn.net.cn

$ java -jar <dataflow-server>.jar --maven.localRepository=mylocal
--maven.remote-repositories.repo1.url=https://repo1
--maven.remote-repositories.repo1.auth.username=repo1user
--maven.remote-repositories.repo1.auth.password=repo1pass
--maven.remote-repositories.repo2.url=https://repo2 --maven.proxy.host=proxyhost
--maven.proxy.port=9018 --maven.proxy.auth.username=proxyuser
--maven.proxy.auth.password=proxypass

您还可以使用SPRING_APPLICATION_JSON环境属性:spring-doc.cadn.net.cn

export SPRING_APPLICATION_JSON='{ "maven": { "local-repository": "local","remote-repositories": { "repo1": { "url": "https://repo1", "auth": { "username": "repo1user", "password": "repo1pass" } },
"repo2": { "url": "https://repo2" } }, "proxy": { "host": "proxyhost", "port": 9018, "auth": { "username": "proxyuser", "password": "proxypass" } } } }'

以下是格式良好的 JSON 中的相同内容:spring-doc.cadn.net.cn

SPRING_APPLICATION_JSON='{
  "maven": {
    "local-repository": "local",
    "remote-repositories": {
      "repo1": {
        "url": "https://repo1",
        "auth": {
          "username": "repo1user",
          "password": "repo1pass"
        }
      },
      "repo2": {
        "url": "https://repo2"
      }
    },
    "proxy": {
      "host": "proxyhost",
      "port": 9018,
      "auth": {
        "username": "proxyuser",
        "password": "proxypass"
      }
    }
  }
}'
根据 Spring Cloud Data Flow 服务器实现,您可能必须使用特定于平台的环境设置功能传递环境属性。例如,在 Cloud Foundry 中,您可以将它们传递为cf set-env SPRING_APPLICATION_JSON.

B.2. 故障排除

本节介绍如何在您选择的平台上对 Spring Cloud Data Flow 进行故障排除。请参阅微站点的“处理和批处理”故障排除部分。spring-doc.cadn.net.cn

B.3. 扩展应用程序类路径

用户可能需要将依赖项添加到现有 Stream 应用程序或特定数据库驱动程序,以添加到 Dataflow 和 Skipper 或项目的任何其他容器提供程序。spring-doc.cadn.net.cn

Spring Cloud Dataflow 存储库包含有助于完成此任务的脚本。下面的示例假设您已经克隆了spring-cloud-dataflow存储库,并正在执行来自src/templates/add-deps.

B.3.1. 容器

为了向现有容器添加依赖项,将采用以下步骤。spring-doc.cadn.net.cn

环境变量
例子
export CONTAINER_REPO="springcloud/spring-cloud-dataflow-server"
export CONTAINER_TAG="2.9.5-jdk17"
export PRIVATE_REGISTRY="our.private.registry"
export DEPS_FOLDER="./extra-libs/"
docker build -f Dockerfile -t "$PRIVATE_REGISTRY/$CONTAINER_REPO:$CONTAINER_TAG"
docker push "$PRIVATE_REGISTRY/$CONTAINER_REPO:$CONTAINER_TAG"
如上所述,该Dockerfile生活在spring-cloud-dataflow存储库src/templates/add-deps.

B.3.2. JAR文件

使用 CloudFoundry 或本地部署时,您需要先更新 jar,然后再将其发布到私有注册表或 Maven Local。spring-doc.cadn.net.cn

示例

此示例添加依赖项,然后将 jar 安装到 Maven local。spring-doc.cadn.net.cn

./gradlew -i publishToMavenLocal \
    -P appFolder="." \
    -P appGroup="org.springframework.cloud" \
    -P appName="spring-cloud-dataflow-server" \
    -P appVersion="2.9.5" \
    -P depFolder="./extra-libs"
使用publishMavenPublicationToMavenRepository任务发布到远程存储库。更新gradle.properties替换为远程存储库详细信息。或者移动repoUserrepoPassword更改为 ~/.gradle/gradle.properties

B.4. 为尚不支持的架构创建容器。

对于 M1 上的 macOS,amd64/x86_64 的性能是不可接受的。我们提供了一组脚本,可用于下载已发布工件的特定版本。我们还提供了一个脚本,该脚本将使用下载的工件为主机平台创建一个容器。在各种项目中,您将在src/locallocal文件夹。spring-doc.cadn.net.cn

项目 脚本 笔记

数据流spring-doc.cadn.net.cn

src/local/download-apps.sh
src/local/create-containers.sh
spring-doc.cadn.net.cn

下载或创建容器:spring-cloud-dataflow-server,
spring-cloud-dataflow-composed-task-runner,
spring-cloud-dataflow-single-step-batch-job,
spring-cloud-dataflow-tasklauncher-sink-kafka,
spring-cloud-dataflow-tasklauncher-sink-rabbit
spring-doc.cadn.net.cn

船长spring-doc.cadn.net.cn

local/download-app.sh
local/create-container.shspring-doc.cadn.net.cn

下载或创建容器:spring-cloud-skipper-serverspring-doc.cadn.net.cn

流应用程序spring-doc.cadn.net.cn

local/download-apps.sh
local/create-containers.sh
local/pack-containers.shspring-doc.cadn.net.cn

create-containers.sh使用jib
pack-containers.sh使用packspring-doc.cadn.net.cn

B.4.1. 中的脚本spring-cloud-dataflow

src/local/download-apps.sh

下载所需的所有应用程序create-containers.sh来自 Maven 存储库。spring-doc.cadn.net.cn

如果快照的时间戳匹配,则将跳过下载。spring-doc.cadn.net.cn

用法:download-apps.sh [version]spring-doc.cadn.net.cn

src/local/create-containers.sh

创建所有容器并推送到本地 docker 注册表。spring-doc.cadn.net.cn

用法:create-containers.sh [version] [jre-version]spring-doc.cadn.net.cn

B.4.2. 中的脚本spring-cloud-skipper

local/download-app.sh

下载所需的所有应用程序create-containers.sh来自 Maven 存储库。spring-doc.cadn.net.cn

如果快照的时间戳匹配,则将跳过下载。spring-doc.cadn.net.cn

用法:download-app.sh [version]spring-doc.cadn.net.cn

local/create-container.sh

创建所有容器并推送到本地 docker 注册表。 此脚本需要 jib-clispring-doc.cadn.net.cn

用法:create-containers.sh [version] [jre-version]spring-doc.cadn.net.cn

B.4.3. 中的脚本stream-applications

local/download-apps.sh

下载所需的所有应用程序create-containers.sh来自 Maven 存储库。spring-doc.cadn.net.cn

如果快照的时间戳匹配,则将跳过下载。spring-doc.cadn.net.cn

用法:download-apps.sh [version] [broker] [filter]spring-doc.cadn.net.cn

local/create-containers.sh

创建所有容器并推送到本地 docker 注册表。spring-doc.cadn.net.cn

用法:create-containers.sh [version] [broker] [jre-version] [filter]spring-doc.cadn.net.cn

如果创建容器所需的文件不存在,脚本将跳过该文件。spring-doc.cadn.net.cn

local/pack-containers.sh

创建所有容器并推送到本地 docker 注册表。spring-doc.cadn.net.cn

用法:pack-containers.sh [version] [broker] [jre-version] [filter]spring-doc.cadn.net.cn

如果创建容器所需的文件不存在,脚本将跳过该文件。spring-doc.cadn.net.cn

如果提供了任何参数,则其左侧的所有参数都应被视为必需参数。

B.5. 配置 Kubernetes 以进行本地开发或测试

B.5.1. 前提条件

您需要安装 kubectl,然后为本地集群安装 kind 或 minikube。spring-doc.cadn.net.cn

所有示例都假设您已经克隆了spring-cloud-dataflow存储库,并正在执行来自src/local/k8s.spring-doc.cadn.net.cn

在 macOS 上,您可能需要安装realpathMacportsbrew install realpathspring-doc.cadn.net.cn

脚本需要一个 shell,例如bashzsh并且应该适用于 Linux、WSL 2 或 macOS。

B.5.2. 步骤

Kubernetes 提供商

如何在 minikube 和 kind 之间进行选择?kind 通常会提供比 Minikube 更快的设置和拆卸时间。除了在部署 minikube 时能够配置 CPU 和内存的限制外,在 2 之间的性能方面几乎没有什么可选择的。因此,在有内存限制或需要强制执行内存限制的情况下,Minikube 将是更好的选择。spring-doc.cadn.net.cn

库贝克特尔

您需要安装 kubectl 才能配置 Kubernetes 集群spring-doc.cadn.net.cn

Kind 是 docker 中的 Kubernetes,非常适合本地开发。spring-doc.cadn.net.cn

LoadBalancer 将由configure-k8s.shscript by 将需要更新 yaml 文件,以提供 LoadBalancer 可用的地址范围。spring-doc.cadn.net.cn

迷你库贝

Minikube 使用一系列驱动程序之一来提供虚拟化环境。spring-doc.cadn.net.cn

删除现有的 Minikube 安装(如果有)。minikube delete

B.5.3. 建造和装载集装箱。

对于本地开发,您需要控制本地环境中使用的容器。spring-doc.cadn.net.cn

为了确保管理特定版本的数据流和船长容器,您可以设置SKIPPER_VERSION并DATAFLOW_VERSION环境变量,然后调用./pull-dataflow.sh./pull-skipper.sh或者,如果您想使用本地构建的应用程序,可以调用./build-skipper-image.sh./build-dataflow.shspring-doc.cadn.net.cn

B.5.4. 配置 k8s 环境

您可以调用以下脚本之一来选择目标安装类型:spring-doc.cadn.net.cn

use-kind.sh [<namespace>] [<database>] [<broker>]
use-mk-docker.sh [<namespace>] [<database>] [<broker>]
use-mk-kvm2.sh [<namespace>] [<database>] [<broker>]
use-mk.sh <driver> [<namespace>] [<database>] [<broker>] (1)
use-tmc.sh <cluster-name> [<namespace>] [<database>] [<broker>]
use-gke.sh <cluster-name> [<namespace>] [<database>] [<broker>]
1 <driver>必须是以下之一kvm2,docker,vmware,virtualbox,vmwarefusionhyperkit.docker是本地开发的推荐选项。
<namespace>将是default如果未提供。默认值<database>postgresql和默认的<broker>kafka.

由于这些脚本导出环境变量,因此需要执行它们,如以下示例所示:spring-doc.cadn.net.cn

source ./use-mk-docker.sh test-ns postgresql rabbitmq
云中的 TMC 或 GKE 集群

集群在使用前必须存在,并且在执行之前应使用相关 cli 登录source ./use-gke.shspring-doc.cadn.net.cn

创建本地集群。

以下脚本将创建本地群集。spring-doc.cadn.net.cn

./configure-k8s.sh
  • 对于种类,请按照说明进行更新src/local/k8s/yaml/metallb-configmap.yaml然后使用kubectl apply -f src/local/k8s/yaml/metallb-configmap.yamlspring-doc.cadn.net.cn

  • 对于 minikube,启动一个新 shell 并执行minikube tunnelspring-doc.cadn.net.cn

部署 Spring Cloud 数据流。
配置代理
export BROKER=<broker> (1)
1 <经纪人>kafkarabbitmq
配置数据库
export DATABASE=<database> (1)
1 <数据库>mariadbpostgresql
这仍然是可选的,PostgreSQL 支持尚不可用,但很快就会推出。
./install-scdf.sh
source ./export-dataflow-ip.sh
从群集中删除部署。
./delete-scdf.sh
删除群集

如果已配置 TMC 集群,此脚本还将删除 TMC 集群。spring-doc.cadn.net.cn

./destroy-k8s.sh

B.5.5. 实用程序

以下实用程序列表可能有用。spring-doc.cadn.net.cn

名称 描述

k9sspring-doc.cadn.net.cn

k9s 是一个基于文本的监视器,用于探索 Kubernetes 集群。spring-doc.cadn.net.cn

kailspring-doc.cadn.net.cn

根据各种命名条件对各种 Pod 的日志进行额外和尾部处理。spring-doc.cadn.net.cn

kail
kail --label=spring-group-id=<stream-name>
kail --ns=<namespace>

B.5.6. 脚本

一些脚本也适用于本地容器,可以在src/local,Kubernetes 特定脚本位于src/local/k8sspring-doc.cadn.net.cn

脚本 描述

build-app-images.shspring-doc.cadn.net.cn

生成餐厅示例流应用程序的所有映像spring-doc.cadn.net.cn

pull-app-images.shspring-doc.cadn.net.cn

从 Docker Hub 拉取餐厅示例流应用程序的所有映像spring-doc.cadn.net.cn

pull-dataflow.shspring-doc.cadn.net.cn

根据 DockerHub 拉取数据流DATAFLOW_VERSION.spring-doc.cadn.net.cn

pull-scdf-pro.shspring-doc.cadn.net.cn

从 Tanzu Network 提取 Dataflow Pro 基于SCDF_PRO_VERSION.spring-doc.cadn.net.cn

pull-skipper.shspring-doc.cadn.net.cn

从 DockerHub 中提取 Skipper 基于SKIPPER_VERSION.spring-doc.cadn.net.cn

build-dataflow-image.shspring-doc.cadn.net.cn

从 Dataflow 的本地存储库生成 docker 映像spring-doc.cadn.net.cn

build-scdf-pro-image.shspring-doc.cadn.net.cn

从 Dataflow Pro 的本地存储库构建 docker 映像。USE_PRO=true在使用 Dataflow Pro 的环境中spring-doc.cadn.net.cn

build-skipper-image.shspring-doc.cadn.net.cn

从 Skipper 的本地存储库构建一个 docker 镜像。spring-doc.cadn.net.cn

configure-k8s.shspring-doc.cadn.net.cn

根据您的 K8S_DRIVER 配置配置 Kubernetes 环境。spring-doc.cadn.net.cn

delete-scdf.shspring-doc.cadn.net.cn

删除部署创建的所有 Kubernetes 资源。spring-doc.cadn.net.cn

destroy-k8s.shspring-doc.cadn.net.cn

删除集群、kind 或 minikube。spring-doc.cadn.net.cn

export-dataflow-ip.shspring-doc.cadn.net.cn

将数据流服务器的 URL 导出到DATAFLOW_IPspring-doc.cadn.net.cn

export-http-url.shspring-doc.cadn.net.cn

按名称将特定流的 http 源的 url 导出到HTTP_APP_URLspring-doc.cadn.net.cn

install-scdf.shspring-doc.cadn.net.cn

配置和部署 Spring Cloud Dataflow 的所有容器spring-doc.cadn.net.cn

load-images.shspring-doc.cadn.net.cn

将测试所需的所有容器镜像加载到 kind 或 minikube 中,以确保您可以控制所使用的内容。spring-doc.cadn.net.cn

load-image.shspring-doc.cadn.net.cn

将特定的容器镜像加载到本地 kind 或 minikube 中。spring-doc.cadn.net.cn

local-k8s-acceptance-tests.shspring-doc.cadn.net.cn

对集群执行验收测试,其中DATAFLOW_IP是指向的。spring-doc.cadn.net.cn

register-apps.shspring-doc.cadn.net.cn

注册单元测试使用的任务和流应用。spring-doc.cadn.net.cn

请报告脚本的任何错误以及有关相关环境的详细信息。

B.6. 常见问题

在本节中,我们将回顾 Spring Cloud Data Flow 的常见问题。 有关更多信息,请参阅微型网站的常见问题部分。spring-doc.cadn.net.cn