附录
在使用 Spring Cloud Data Flow 时遇到问题了吗?我们很乐意为您提供帮助!
-
提出一个问题。我们监控 stackoverflow.com 上标记为
spring-cloud-dataflow的问题。 -
在 github.com/spring-cloud/spring-cloud-dataflow/issues 报告 Spring Cloud Data Flow 的 bug。
附录 A:数据流模板
如 API 指南章节所述,Spring Cloud Data Flow 的所有功能都通过 REST 端点完全暴露出来。 虽然你可以直接使用这些端点,但 Spring Cloud Data Flow 还提供了一个基于 Java 的 API,使得使用这些 REST 端点更加简便。
核心入口点是 DataFlowTemplate 包中的 org.springframework.cloud.dataflow.rest.client 类。
该类实现了 DataFlowOperations 接口,并委托给以下子模板,这些子模板为每个功能集提供具体的功能:
| 接口 | 描述 |
|---|---|
|
用于流操作的 REST 客户端 |
|
用于计数器操作的 REST 客户端 |
|
用于字段值计数器操作的 REST 客户端 |
|
用于聚合计数器操作的 REST 客户端 |
|
用于任务操作的 REST 客户端 |
|
用于作业操作的 REST 客户端 |
|
用于应用注册表操作的 REST 客户端 |
|
用于补全操作的 REST 客户端 |
|
用于运行时操作的 REST 客户端 |
当 DataFlowTemplate 初始化时,子模板可以通过 HATEOAS(Hypermedia as the Engine of Application State,超媒体作为应用状态的引擎)所提供的 REST 关系被自动发现。
| 如果某个资源无法解析,则相应的子模板将返回 NULL。一个常见的原因是,Spring Cloud Data Flow 在启动时允许启用或禁用特定的功能集。有关更多信息,请参阅与您部署应用程序的平台相对应的本地、Cloud Foundry 或 Kubernetes 配置章节。 |
A.1. 使用数据流模板
当你使用数据流模板(Data Flow Template)时,唯一需要的数据流依赖是 Spring Cloud Data Flow REST 客户端,如下列 Maven 代码片段所示:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dataflow-rest-client</artifactId>
<version>2.8.3</version>
</dependency>
通过该依赖,您将获得 DataFlowTemplate 类以及向 Spring Cloud Data Flow 服务器发起调用所需的所有依赖项。
在实例化 DataFlowTemplate 时,您还需要传入一个 RestTemplate。
请注意,此处所需的 RestTemplate 需要进行一些额外的配置,才能在 DataFlowTemplate 的上下文中有效。
当将 RestTemplate 声明为 Bean 时,以下配置就已足够:
@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:
DataFlowTemplate dataFlowTemplate = new DataFlowTemplate(
new URI("http://localhost:9393/"), restTemplate); (1)
| 1 | URI 指向您的 Spring Cloud Data Flow 服务器的根目录。 |
根据您的需求,现在可以向服务器发起调用。例如, 如果您想获取当前可用应用程序的列表,可以运行以下代码:
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 来完成的。
为了帮助您快速上手,我们提供了一个 HttpClientConfigurer,它使用构建器模式来设置各种与安全相关的选项:
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。
要配置基本认证,需要进行以下设置:
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 代码仓库中找到一个示例应用程序。
附录 B:“操作指南”
本节提供了一些常见“如何实现……”问题的解答,这些问题通常在人们使用 Spring Cloud Data Flow 时会出现。
如果你遇到一个我们此处未涵盖的具体问题,可以前往 stackoverflow.com 查看是否已有人提供了答案。
那里也是提出新问题的好地方(请使用 spring-cloud-dataflow 标签)。
我们也非常乐意扩展这一部分内容。如果您想添加一篇“操作指南”,可以向我们提交一个拉取请求。
B.1. 配置 Maven 属性
您可以在启动 Data Flow 服务器时,通过命令行属性来设置 Maven 属性,例如本地 Maven 仓库位置、远程 Maven 仓库、认证凭据以及代理服务器属性。
或者,您也可以通过为 Data Flow 服务器设置 SPRING_APPLICATION_JSON 环境变量来配置这些属性。
如果应用程序通过 Maven 仓库进行解析,则需要显式配置远程 Maven 仓库,local 类型的 Data Flow 服务器除外。
其他 Data Flow 服务器实现(使用 Maven 资源来解析应用程序构件)没有为远程仓库设置默认值。
local 服务器默认使用 repo.spring.io/libs-snapshot 作为远程仓库。
要将属性作为命令行选项传递,请使用类似于以下的命令运行服务器:
$ 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 环境属性:
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_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.3. 常见问题
在本节中,我们将回顾 Spring Cloud Data Flow 的常见问题。 更多信息请参见微网站的常见问题部分。
附录 C:构建
本附录介绍了如何构建 Spring Cloud Data Flow。
要构建源代码,您需要安装 JDK 1.8。
构建使用了 Maven 包装器,因此您无需安装特定版本的 Maven。
主要的构建命令如下:
$ ./mvnw clean install
为了加快构建速度,您可以添加 -DskipTests 以跳过运行测试。
你也可以自行安装 Maven(>=3.3.3),并在下面的示例中使用 mvn 命令替代 ./mvnw。
如果这样做,且你的本地 Maven 设置中未包含 Spring 预发布构件的仓库声明,则可能还需要添加 -P spring 参数。 |
你可能需要通过设置 MAVEN_OPTS 环境变量(其值类似于 -Xmx512m -XX:MaxPermSize=128m)来增加 Maven 可用的内存。
我们尝试在 .mvn 配置中涵盖这一点,因此,如果你发现必须手动设置才能使构建成功,请提交一个工单,以便将这些设置添加到源代码控制中。 |
C.1. 文档
有一个 full 配置文件用于生成文档。你可以使用以下命令仅构建文档:
$ ./mvnw clean package -DskipTests -P full -pl {project-artifactId} -am
C.2. 使用代码
如果你没有偏好的 IDE,我们建议你在处理代码时使用 Spring Tools Suite 或 Eclipse。 我们使用 m2eclipse Eclipse 插件来支持 Maven。 其他 IDE 和工具通常也能正常工作,不会出现问题。
C.2.1. 使用 m2eclipse 插件导入到 Eclipse
在使用 Eclipse 时,我们推荐使用 m2eclipse Eclipse 插件。 如果您尚未安装 m2eclipse,可从 Eclipse 市场获取。
不幸的是,m2e 目前尚不支持 Maven 3.3。
因此,在将项目导入 Eclipse 后,您还需要告诉 m2eclipse 为这些项目使用 .settings.xml 文件。
如果不这样做,您可能会看到许多与项目中 POM 文件相关的错误。
操作方法如下:
-
打开您的 Eclipse 首选项。
-
展开Maven 首选项。
-
选择用户设置。
-
在用户设置字段中,单击浏览并导航到您导入的 Spring Cloud 项目。
-
选择该项目中的
.settings.xml文件。 -
点击应用。
-
点击确定。
或者,您可以将 Spring Cloud 的 .settings.xml 文件中的仓库设置复制到您自己的 ~/.m2/settings.xml 中。 |
C.2.2. 在没有 m2eclipse 的情况下导入到 Eclipse
如果你不想使用 m2eclipse,可以通过以下命令生成 Eclipse 项目元数据:
$ ./mvnw eclipse:eclipse
您可以通过从文件菜单中选择导入现有项目来导入生成的 Eclipse 项目。