附录

在使用 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 初始化时,子模板可以通过 HATEOAS(Hypermedia as the Engine of Application State,超媒体作为应用状态的引擎)所提供的 REST 关系被自动发现。spring-doc.cadn.net.cn

如果某个资源无法解析,则相应的子模板将返回 NULL。一个常见的原因是,Spring Cloud Data Flow 在启动时允许启用或禁用特定的功能集。有关更多信息,请参阅与您部署应用程序的平台相对应的本地Cloud FoundryKubernetes 配置章节。

A.1. 使用数据流模板

当你使用数据流模板(Data Flow Template)时,唯一需要的数据流依赖是 Spring Cloud Data Flow REST 客户端,如下列 Maven 代码片段所示:spring-doc.cadn.net.cn

<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-dataflow-rest-client</artifactId>
  <version>2.8.3</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();

现在你可以使用以下代码实例化 DataFlowTemplatespring-doc.cadn.net.cn

DataFlowTemplate dataFlowTemplate = new DataFlowTemplate(
    new URI("http://localhost:9393/"), restTemplate);         (1)
1 URI 指向您的 Spring Cloud Data Flow 服务器的根目录。

根据您的需求,现在可以向服务器发起调用。例如, 如果您想获取当前可用应用程序的列表,可以运行以下代码: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 时,您也可以提供所有与安全相关的选项,就像使用 Data Flow Shell 一样。事实上,Data Flow Shell 的所有操作都是通过 DataFlowTemplate 来完成的。spring-doc.cadn.net.cn

为了帮助您快速上手,我们提供了一个 HttpClientConfigurer,它使用构建器模式来设置各种与安全相关的选项: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 来实例化实际的 RestTemplatespring-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);

您可以在 GitHub 上的 spring-cloud-dataflow-samples 代码仓库中找到一个示例应用程序。spring-doc.cadn.net.cn

附录 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 属性

您可以在启动 Data Flow 服务器时,通过命令行属性来设置 Maven 属性,例如本地 Maven 仓库位置、远程 Maven 仓库、认证凭据以及代理服务器属性。 或者,您也可以通过为 Data Flow 服务器设置 SPRING_APPLICATION_JSON 环境变量来配置这些属性。spring-doc.cadn.net.cn

如果应用程序通过 Maven 仓库进行解析,则需要显式配置远程 Maven 仓库,local 类型的 Data Flow 服务器除外。 其他 Data Flow 服务器实现(使用 Maven 资源来解析应用程序构件)没有为远程仓库设置默认值。 local 服务器默认使用 repo.spring.io/libs-snapshot 作为远程仓库。spring-doc.cadn.net.cn

要将属性作为命令行选项传递,请使用类似于以下的命令运行服务器: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. 常见问题

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

附录 C:构建

本附录介绍了如何构建 Spring Cloud Data Flow。spring-doc.cadn.net.cn

要构建源代码,您需要安装 JDK 1.8。spring-doc.cadn.net.cn

构建使用了 Maven 包装器,因此您无需安装特定版本的 Maven。spring-doc.cadn.net.cn

主要的构建命令如下:spring-doc.cadn.net.cn

$ ./mvnw clean install

为了加快构建速度,您可以添加 -DskipTests 以跳过运行测试。spring-doc.cadn.net.cn

你也可以自行安装 Maven(>=3.3.3),并在下面的示例中使用 mvn 命令替代 ./mvnw。 如果这样做,且你的本地 Maven 设置中未包含 Spring 预发布构件的仓库声明,则可能还需要添加 -P spring 参数。
你可能需要通过设置 MAVEN_OPTS 环境变量(其值类似于 -Xmx512m -XX:MaxPermSize=128m)来增加 Maven 可用的内存。 我们尝试在 .mvn 配置中涵盖这一点,因此,如果你发现必须手动设置才能使构建成功,请提交一个工单,以便将这些设置添加到源代码控制中。

C.1. 文档

有一个 full 配置文件用于生成文档。你可以使用以下命令仅构建文档:spring-doc.cadn.net.cn

$ ./mvnw clean package -DskipTests -P full -pl {project-artifactId} -am

C.2. 使用代码

如果你没有偏好的 IDE,我们建议你在处理代码时使用 Spring Tools SuiteEclipse。 我们使用 m2eclipse Eclipse 插件来支持 Maven。 其他 IDE 和工具通常也能正常工作,不会出现问题。spring-doc.cadn.net.cn

C.2.1. 使用 m2eclipse 插件导入到 Eclipse

在使用 Eclipse 时,我们推荐使用 m2eclipse Eclipse 插件。 如果您尚未安装 m2eclipse,可从 Eclipse 市场获取。spring-doc.cadn.net.cn

不幸的是,m2e 目前尚不支持 Maven 3.3。 因此,在将项目导入 Eclipse 后,您还需要告诉 m2eclipse 为这些项目使用 .settings.xml 文件。 如果不这样做,您可能会看到许多与项目中 POM 文件相关的错误。 操作方法如下:spring-doc.cadn.net.cn

  1. 打开您的 Eclipse 首选项。spring-doc.cadn.net.cn

  2. 展开Maven 首选项spring-doc.cadn.net.cn

  3. 选择用户设置spring-doc.cadn.net.cn

  4. 用户设置字段中,单击浏览并导航到您导入的 Spring Cloud 项目。spring-doc.cadn.net.cn

  5. 选择该项目中的 .settings.xml 文件。spring-doc.cadn.net.cn

  6. 点击应用spring-doc.cadn.net.cn

  7. 点击确定spring-doc.cadn.net.cn

或者,您可以将 Spring Cloud 的 .settings.xml 文件中的仓库设置复制到您自己的 ~/.m2/settings.xml 中。

C.2.2. 在没有 m2eclipse 的情况下导入到 Eclipse

如果你不想使用 m2eclipse,可以通过以下命令生成 Eclipse 项目元数据:spring-doc.cadn.net.cn

$ ./mvnw eclipse:eclipse

您可以通过从文件菜单中选择导入现有项目来导入生成的 Eclipse 项目。spring-doc.cadn.net.cn