附录
在使用 Spring Cloud Data Flow 时遇到困难,我们想帮忙!
-
问个问题。我们会监控 stackoverflow.com 是否有问题 标签
Spring-cloud-dataflow. -
在 github.com/spring-cloud/spring-cloud-dataflow/issues 上报告Spring Cloud Data Flow的错误。
附录A:数据流模板
正如API指南章节所述,Spring Cloud数据流的功能完全通过REST端点开放。 虽然你可以直接使用这些端点,但Spring Cloud Data Flow还提供了一个基于Java的API,使使用这些REST端点更加简单。
中央入口点为DataFlowTemplate在org.springframework.cloud.dataflow.rest.client包。
该类实现了数据流作接口并委派到以下子模板,这些子模板为每个功能集提供具体功能:
| 接口 | 描述 |
|---|---|
|
流作的 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. 使用数据流模板
使用数据流模板时,唯一需要的数据流依赖是Spring Cloud 数据流 Rest 客户端,如下 Maven 摘要所示:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dataflow-rest-client</artifactId>
<version>2.10.3</version>
</dependency>
有了这种依赖,你会得到DataFlowTemplate以及调用 Spring Cloud Data Flow 服务器所需的所有依赖。
当实例化DataFlowTemplate,你也通过了Rest模板. 注意,所需的Rest模板需要某些额外的配置才能在DataFlowTemplate. 当声明Rest模板作为豆子,以下配置即可满足:
@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;
}
你也可以买一个预配置的Rest模板通过DataFlowTemplate.getDefaultDataflowRestTemplate();
|
现在你可以实例化DataFlowTemplate代码如下:
DataFlowTemplate dataFlowTemplate = new DataFlowTemplate(
new URI("http://localhost:9393/"), restTemplate); (1)
| 1 | 这URI指向你 Spring Cloud 数据流服务器的根节点。 |
根据你的需求,你现在可以给服务器打电话了。 例如 如果您想获取当前可用应用的列表,可以运行以下代码:
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()));
}
答:2. 数据流模板与安全性
当使用DataFlowTemplate你也可以像使用数据流壳一样提供所有与安全相关的选项。事实上,数据流壳使用了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可以设置为Rest模板. |
一旦HttpClientConfigurer配置后,你可以使用buildClientHttpRequestFactory以建造ClientHttpRequestFactory然后将相应的性质设在Rest模板. 然后你可以实例化实际DataFlowTemplate利用该方法Rest模板.
要配置基础认证,需要进行以下设置:
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 时经常出现。
如果你有我们这里没有涉及的具体问题,建议你查看 stackoverflow.com 是否有人已经给出了答案。这里也是提问新问题的好地方(使用Spring-cloud-dataflow标签)。
我们也很乐意延长这一部分。如果你想添加“作指南”,可以发送拉取请求。
B.1. 配置Maven属性
你可以在启动数据流服务器时通过命令行属性设置 Maven 属性,如本地 Maven 仓库位置、远程 Maven 仓库、认证凭证和代理服务器属性。
或者,你可以通过设置SPRING_APPLICATION_JSON数据流服务器的环境属性。
如果应用程序通过 Maven 仓库解析,远程 Maven 仓库需要显式配置。
此规则的唯一例外是当地Data Flow 服务器安装,已经预先配置好了 Maven Central 和 Spring Artifactory 远程仓库。
另一个(非局部服务器安装没有远程仓库的默认值。
如果你配置了自己的远程仓库,务必添加Maven Central (repo.maven.apache.org/maven2因为不会自动添加给你。 |
要将属性作为命令行选项传递,运行服务器时,命令类似于以下内容:
$ 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. 扩展应用类路径
用户可能需要项目为现有的Stream应用添加依赖,或向Dataflow、Skipper或其他容器提供商添加特定的数据库驱动程序。
Spring Cloud Dataflow 仓库包含了帮助完成此任务的脚本。以下示例假设你已经克隆了Spring-cloud-dataflow仓库,正在执行从以下的脚本src/模板/附加工具. |
B.3.1. 容器
为了向现有容器添加依赖,将采取以下步骤。
-
创建一个包含额外依赖的文件夹。
-
在将文件复制到库文件夹的同时创建新的容器镜像。
-
把镜像推送到私有注册表。
环境变量
-
DEPS_FOLDER文件应该有一个完整的文件名或路径表达式,用于复制到容器。 -
CONTAINER_REPO源docker镜像名称。 -
CONTAINER_TAG来源图片标签。 -
PRIVATE_REGISTRY私人注册机构的主机名。
例子
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/模板/附加工具. |
B.3.2. JAR档案
使用CloudFoundry或本地部署时,你需要先更新jar,然后再发布到私有注册表或Maven Local。
示例
这个示例是添加依赖,然后将jar安装到Maven本地。
./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带有远程仓库的详细信息。或者,换个地方repoUser和repoPassword到 ~/.gradle/gradle.properties |
B.4. 为尚未支持的架构创建容器。
以 M1 上的 macOS 为例,amd64/x86_64 的性能是不可接受的。
我们提供了一套脚本,可用于下载特定版本的已发布工件。
我们还提供了一个脚本,利用下载的工件为主机平台创建一个容器。
在各种项目中,你会发现本地/本地或当地文件夹。
| 项目 | 脚本 | 笔记 |
|---|---|---|
数据流 |
|
下载或创建以下容器: |
船长 |
|
下载或创建以下容器: |
流应用 |
|
|
B.4.1. 书写系统Spring-cloud-dataflow
SRC/本地/download-apps.sh
下载所有需要的应用程序create-containers.sh来自Maven仓库。
如果快照的时间戳匹配,下载将被跳过。
用法:download-apps.sh [版本]
-
版本是数据流服务器版本2.9.6.默认是2.10.3-快照
SRC/本地/create-containers.sh
创建所有容器并推送到本地 Docker 注册表。
此脚本需要jib-cli(前帆-cli)
用法:create-containers.sh [版本] [jre-version]
-
版本是数据流服务器版本2.9.6.默认是2.10.3-快照 -
JRE版本应该是11、17。默认是11
B.4.2. 书本春云跳者
本地/download-app.sh
下载所有需要的应用程序create-containers.sh来自Maven仓库。
如果快照的时间戳匹配,下载将被跳过。
用法:download-app.sh [版本]
-
版本船长版本是2.8.6或者默认为2.9.3-快照
本地/create-container.sh
创建所有容器并推送到本地 Docker 注册表。该脚本需要 jib-cli
用法:create-containers.sh [版本] [jre-version]
-
版本船长版本是2.8.6或者默认为2.9.3-快照 -
JRE版本应该是11个,17个
B.4.3. 文字流式应用
本地/download-apps.sh
下载所有需要的应用程序create-containers.sh来自Maven仓库。
如果快照的时间戳匹配,下载将被跳过。
用法:download-apps.sh [版本] [经纪人] [筛选]
-
版本流应用的版本是3.2.1或者默认为3.2.2-快照 -
代理是兔子、兔子或卡夫卡之一 -
Filter是申请名称或部分名称,将被匹配。
本地/create-containers.sh
创建所有容器并推送到本地 Docker 注册表。
此脚本需要jib-cli(前帆-cli)
用法:create-containers.sh [版本] [broker] [JRE-version] [筛选]
-
版本是流应用版本,如3.2.1或者默认为3.2.2-快照 -
代理是兔子、兔子或卡夫卡之一 -
JRE版本应该是11个,17个 -
Filter是申请名称或部分名称,将被匹配。
如果创建容器所需的文件不存在,脚本会跳过该容器。
本地/pack-containers.sh
创建所有容器并推送到本地 Docker 注册表。
用法:pack-containers.sh [版本] [broker] [jre-version] [filter]
-
版本是流应用版本,如3.2.1或者默认为3.2.2-快照 -
代理是兔子、兔子或卡夫卡之一 -
JRE版本应该是11个,17个 -
Filter是申请名称或部分名称,将被匹配。
如果没有创建容器所需的文件,脚本会跳过该文件。
| 如果提供了任何参数,那么它左侧的所有参数都应被视为必需。 |
B.5. 配置Kubernetes用于本地开发或测试
B.5.1. 前提条件
你需要安装kubectl,然后用kind或minikube来做本地集群。
所有示例都假设你已经克隆了Spring-cloud-dataflow仓库,正在执行从以下的脚本SRC/本地/K8s.
在macOS上你可能需要安装实行路径来自Macports或brew安装 realpath
这些脚本需要一个类似的shell砰或ZSH并且应该能在Linux、WSL 2或macOS上运行。 |
B.5.2. 步骤
-
选择Kubernetes提供商。Kind、Minikube或远程GKE或TMC。
-
如果没有,就决定部署时使用的命名空间
默认值. -
配置Kubernetes和负载均衡器。
-
选择经纪人
export BROKER=kafka|rabbitmq -
构建或拉取 Skipper 和数据流服务器的容器镜像。
-
部署并启动 Spring Cloud 数据流。
-
导出数据流服务器地址至环境。
Kubernetes 提供商
我该如何在 minikube 和 kind 之间做出选择?Kind 通常比 Minikube 的设置和拆卸时间更快。在性能方面,除了部署 Minikube 时可以配置 CPU 和内存的限制外,两者之间几乎没有什么可挑剔的选择。所以如果你有内存限制或需要强制执行内存限制,Minikube 会是更好的选择。
库贝克特尔
你需要安装kubectl才能配置Kubernetes集群
类
Kind 是 Docker 中的 Kubernetes,非常适合本地开发。
负载均衡器将由configure-k8s.sh脚本 by 需要更新 yaml 文件,以提供负载均衡器可用的地址范围。
远程TMC集群
B.5.3. 集装箱制造与装载。
对于本地开发,你需要控制当地环境中使用的容器。
为了确保管理特定版本的数据流和跳跃容器,你可以设置SKIPPER_VERSION和DATAFLOW_VERSION环境变量,然后调用./pull-dataflow.sh和./pull-skipper.sh或者如果你想使用本地构建的应用程序,也可以调用./build-skipper-image.sh和./build-dataflow.sh
B.5.4. 配置 k8s 环境
你可以调用以下脚本之一来选择你目标的安装类型:
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 | <Drivers>必须是其中之一KVM2,Jetty工人,VMware,虚拟盒,VMwareFusion或超级套件.Jetty工人是本地开发的推荐选项。 |
<命名空间>将会默认值如果没有提供。默认<数据库>是PostgreSQL以及默认值<经纪人>是卡 夫 卡. |
由于这些脚本导出环境变量,需要像以下示例那样执行:
source ./use-mk-docker.sh test-ns postgresql rabbitmq
TMC 或 GKE 云集群
集群必须在使用前存在,执行前应使用相关的CLI登录来源:./use-gke.sh
创建本地集群。
以下脚本将创建本地集群。
./configure-k8s.sh
-
对于类型,请按照指示进行更新
src/local/k8s/yaml/metallb-configmap.yaml然后用kubectl apply -f src/local/k8s/yaml/metallb-configmap.yaml -
对于minikube,发射一个新壳并执行
迷你立方隧道
部署 Spring Cloud 数据流。
配置代理
export BROKER=<broker> (1)
| 1 | <经纪人>其中之一卡 夫 卡或兔子咪Q |
配置数据库
export DATABASE=<database> (1)
| 1 | <数据库>玛利亚德或PostgreSQL |
| 这仍然是可选的,PostgreSQL支持还没有,但很快会跟上。 |
./install-scdf.sh
source ./export-dataflow-ip.sh
从集群中删除部署。
./delete-scdf.sh
删除集群
如果你配置了TMC集群,这个脚本也会删除。
./destroy-k8s.sh
B.5.5. 公用设施
以下Utilities列表可能对你有帮助。
| 名称 | 描述 |
|---|---|
k9s 是一款基于文本的显示器,用于探索 Kubernetes 集群。 |
|
根据不同的命名标准,额外和尾随各群的日志。 |
凯尔
-
使用 Kail 来记录与特定溪流相关的活动。
kail --label=spring-group-id=<stream-name>
-
使用 Kail 来记录特定命名空间中的所有 pod。
kail --ns=<namespace>
B.5.6. 文字
有些脚本也适用于本地容器,可以在本地/本地,Kubernetes 专用脚本 在SRC/本地/K8s
| 脚本 | 描述 |
|---|---|
|
构建所有餐厅示例流应用的图片 |
|
从Docker Hub拉取所有餐厅示例流应用的图片 |
|
基于 |
|
基于 Tanzu Network 从 Tanzu Network 中拉取 Dataflow Pro |
|
从 DockerHub 底下拉取 Skipper |
|
从本地 Dataflow 仓库构建一个 Docker 镜像 |
|
从 Dataflow Pro 的本地仓库构建一个 Docker 镜像。Set |
|
从本地 Skipper 仓库构建一个 docker 镜像。 |
|
根据你的 K8S_DRIVER 配置配置 Kubernetes 环境。 |
|
删除部署创建的所有 Kubernetes 资源。 |
|
删除集群、类型或小库布。 |
|
导出数据流服务器的网址为 |
|
将特定流程的HTTP源代码以名称导出为 |
|
配置并部署所有Spring Cloud数据流的容器 |
|
将测试中要求的所有容器镜像加载到Kind或Minikube中,以确保你能控制所用内容。 |
|
将特定的容器图片加载到本地类型或 minikube 中。 |
|
对集群执行验收测试,其中 |
|
注册单元测试中使用的任务和流应用。 |
| 请报告脚本错误及相关环境的详细信息。 |
B.6. 常见问题解答
在本节中,我们将回顾春季云数据流的常见问题解答。 更多信息请参见微型网站的常见问题部分。