Spring Cloud Data Flow参考指南(三)

时间:2022-12-05 16:54:09

Spring Cloud Data Flow参考指南(三)

12. 配置 - Kubernetes

本节介绍如何配置 Spring Cloud 数据流功能,例如部署程序属性、任务以及要使用的关系数据库。

12.1. 功能切换

数据流服务器提供一组特定的功能,可以在启动时启用或禁用这些功能。这些功能包括以下各项的所有生命周期操作、REST 终结点(服务器和客户端实现,包括命令行管理程序和 UI):

  • 任务
  • 附表

可以通过在启动数据流服务器时设置以下布尔环境变量来启用或禁用这些功能:

  • ​SPRING_CLOUD_DATAFLOW_FEATURES_STREAMS_ENABLED​
  • ​SPRING_CLOUD_DATAFLOW_FEATURES_TASKS_ENABLED​
  • ​SPRING_CLOUD_DATAFLOW_FEATURES_SCHEDULES_ENABLED​

默认情况下,所有功能都处于启用状态。

REST 端点提供有关已启用和禁用的功能的信息。​​/features​

12.2. 部署程序属性

您可以使用Kubernetes 部署程序的以下配置属性来自定义流和任务的部署方式。 使用数据流 shell 进行部署时,可以使用语法。 在数据流服务器中配置Kubernetes 任务平台和在 Skipper 中配置 Kubernetes 平台以部署流时,也会使用这些属性。​​deployer.<appName>.kubernetes.<deployerPropertyName>​

部署程序属性名称

描述

默认值

命名空间

要使用的命名空间

环境变量,否则​​KUBERNETES_NAMESPACE​​​​default​

deployment.nodeSelector

要应用于部署信息的节点选择器。多个节点选择器以逗号分隔。​​key:value​

<没有>

图像拉秘密

用于访问专用注册表以拉取映像的机密。

<没有>

图像拉策略

拉取映像时要应用的映像拉取策略。有效选项包括、和。​​Always​​​​IfNotPresent​​​​Never​

如果不存在

活动探测器延迟

当应用容器的 Kubernetes 活动性检查应开始检查其运行状况时,延迟(以秒为单位)。

10

活动期

执行应用容器的 Kubernetes 活动性检查的时间段(以秒为单位)。

60

活动探测器超时

应用容器的 Kubernetes 活动性检查超时(以秒为单位)。如果运行状况检查返回的时间超过此值,则假定为“不可用”。

2

活体探测路径

应用容器必须响应以进行活动检查的路径。

<没有>

活体探头端口

应用容器必须响应以进行活动检查的端口。

<没有>

就绪性探测延迟

当应用容器的就绪情况检查应开始检查模块是否已完全启动并运行时,延迟(以秒为单位)。

10

准备情况探测周期

以秒为单位执行应用容器的就绪情况检查。

10

就绪性探测超时

应用容器在准备情况检查期间必须响应其运行状况状态的超时(以秒为单位)。

2

就绪性探测路径

应用容器必须响应以进行准备情况检查的路径。

<没有>

就绪性探测端口

应用容器必须响应的端口以进行准备情况检查。

<没有>

probeCredentialsSecret

包含访问安全探测终结点时要使用的凭据的机密名称。

<没有>

限制.内存

内存限制,分配 Pod 所需的最大值,默认单位为 兆字节,支持“M”和“G”后缀

<没有>

限制.*处理器

CPU 限制,分配 Pod 所需的最大值

<没有>

请求.内存

内存请求,保证分配 Pod 所需的值。

<没有>

请求.cpu

CPU 请求,保证分配 Pod 所需的值。

<没有>

statefulSet.volumeClaimTemplate.storageClassName

有状态集的存储类的名称

<没有>

statefulSet.volumeClaimTemplate.storage

存储量。默认单位为兆字节,支持“M”和“G”后缀

<没有>

环境变量

要为任何已部署的应用容器设置的环境变量列表

<没有>

入口点样式

用于 Docker 映像的入口点样式。用于确定如何传入属性。可以是,,和​​exec​​​​shell​​​​boot​

​exec​

创建负载均衡器

为每个应用创建的服务创建“负载均衡器”。这有助于将外部 IP 分配给应用。

服务注释

要为每个应用程序创建的服务设置的服务注释。格式的字符串​​annotation1:value1,annotation2:value2​

<没有>

豆荚注释

要为每个部署创建的容器设置的容器注释。格式的字符串​​annotation1:value1,annotation2:value2​

<没有>

作业注释

要为容器或为作业创建的作业设置的作业注释。格式的字符串​​annotation1:value1,annotation2:value2​

<没有>

分钟到等待负载均衡器

在尝试删除服务之前等待负载均衡器可用的时间(以分钟为单位)。

5

最大终止错误重新启动

由于错误或过度使用资源而失败的应用允许的最大重启次数。

2

maxCrashLoopBackOff重新启动

处于崩溃循环回退状态的应用允许的最大重启次数。值为,,​​Always​​​​IfNotPresent​​​​Never​

​IfNotPresent​

卷装载

以 YAML 格式表示的卷装载。例如​​[{name: 'testhostpath', mountPath: '/test/hostPath'}, {name: 'testpvc', mountPath: '/test/pvc'}, {name: 'testnfs', mountPath: '/test/nfs'}]​

<没有>

Kubernetes 实例支持的卷以 YAML 格式指定。例如​​[{name: testhostpath, hostPath: { path: '/test/override/hostPath' }},{name: 'testpvc', persistentVolumeClaim: { claimName: 'testClaim', readOnly: 'true' }}, {name: 'testnfs', nfs: { server: '10.0.0.1:111', path: '/test/nfs' }}]​

<没有>

主机网络

部署的主机网络设置,请参阅kubernetes.io/docs/api-reference/v1/definitions/#_v1_podspec

创建部署

使用“副本集”而不是“复制控制器”创建“部署”。

创建作业

在启动任务时创建一个“作业”,而不仅仅是一个“Pod”。

容器命令

使用提供的命令和参数覆盖默认入口点命令。

<没有>

容器端口

添加要在容器上公开的其他端口。

<没有>

创建节点端口

要使用的显式端口是类型。​​NodePort​​​​Service​

<没有>

部署服务帐户名称

应用部署中使用的服务帐户名称。注意:用于应用部署的服务帐户名称派生自数据流服务器部署。

<没有>

部署标签

要添加到部署信息的其他标签。多个标签以逗号分隔。​​key:value​

<没有>

引导主要版本

要使用的 Spring Boot 主要版本。目前仅用于自动配置 Spring 引导版本特定的探测路径。有效选项是或。​​1​​​​2​

2

容忍.key

用于容忍的关键。

<没有>

容忍度.效果

耐受效应。有关有效选项,请参阅kubernetes.io/docs/concepts/configuration/taint-and-toleration。

<没有>

容忍.运算符

容差运算符。有关有效选项,请参阅kubernetes.io/docs/concepts/configuration/taint-and-toleration/。

<没有>

容忍.容忍秒

定义添加污点后 Pod 将绑定到节点的时间的秒数。

<没有>

容忍.价值

要应用的容差值,与选择适当一起使用。​​operator​​​​effect​

<没有>

秘密引用

用于将整个数据内容加载到各个环境变量中的机密的名称。多个机密可以用逗号分隔。

<没有>

secretKeyRefs.envVarName

用于保存机密数据的环境变量名称

<没有>

secretKeyRefs.secretName

要访问的机密名称

<没有>

secretKeyRefs.dataKey

要从中获取机密数据的密钥名称

<没有>

configMapRefs

用于将整个数据内容加载到各个环境变量中的配置映射的名称。多个配置映射以逗号分隔。

<没有>

configMapKeyRefs.envVarName

用于保存配置映射数据的环境变量名称

<没有>

configMapKeyRefs.configMapName

要访问的配置映射名称

<没有>

configMapKeyRefs.dataKey

要从中获取配置映射数据的键名称

<没有>

最大并发任务

此平台实例允许的最大并发任务数。

20

podSecurityContext.runAsUser

用于在下运行 Pod 容器进程的数字用户 ID

<没有>

podSecurityContext.fsGroup

用于运行 Pod 容器进程的数字组 ID

<没有>

affinity.nodeAffinity

以 YAML 格式表示的节点关联。例如​​{ requiredDuringSchedulingIgnoredDuringExecution: { nodeSelectorTerms: [ { matchExpressions: [ { key: 'kubernetes.io/e2e-az-name', operator: 'In', values: [ 'e2e-az1', 'e2e-az2']}]}]}, preferredDuringSchedulingIgnoredDuringExecution: [ { weight: 1, preference: { matchExpressions: [ { key: 'another-node-label-key', operator: 'In', values: [ 'another-node-label-value' ]}]}}]}​

<没有>

affinity.podAffinity

以 YAML 格式表示的容器相关性。例如​​{ requiredDuringSchedulingIgnoredDuringExecution: { labelSelector: [ { matchExpressions: [ { key: 'app', operator: 'In', values: [ 'store']}]}], topologyKey: 'kubernetes.io/hostnam'}, preferredDuringSchedulingIgnoredDuringExecution: [ { weight: 1, podAffinityTerm: { labelSelector: { matchExpressions: [ { key: 'security', operator: 'In', values: [ 'S2' ]}]}, topologyKey: 'failure-domain.beta.kubernetes.io/zone'}}]}​

<没有>

affinity.podAntiAffinity

以 YAML 格式表示的 Pod 反关联性。例如​​{ requiredDuringSchedulingIgnoredDuringExecution: { labelSelector: { matchExpressions: [ { key: 'app', operator: 'In', values: [ 'store']}]}], topologyKey: 'kubernetes.io/hostname'}, preferredDuringSchedulingIgnoredDuringExecution: [ { weight: 1, podAffinityTerm: { labelSelector: { matchExpressions: [ { key: 'security', operator: 'In', values: [ 'S2' ]}]}, topologyKey: 'failure-domain.beta.kubernetes.io/zone'}}]}​

<没有>

statefulSetInitContainerImageName

用于有状态集初始化容器的自定义映像名称

<没有>

初始化容器

以 YAML 格式表示的要应用于 Pod 的初始化容器。例如​​{containerName: 'test', imageName: 'busybox:latest', commands: ['sh', '-c', 'echo hello']}​

<没有>

附加容器

要应用于 Pod 的以 YAML 格式表示的其他容器。例如​​[{name: 'c1', image: 'busybox:latest', command: ['sh', '-c', 'echo hello1'], volumeMounts: [{name: 'test-volume', mountPath: '/tmp', readOnly: true}]}, {name: 'c2', image: 'busybox:1.26.1', command: ['sh', '-c', 'echo hello2']}]​

<没有>

12.3. 任务

数据流服务器负责部署任务。 数据流启动的任务将其状态写入数据流服务器使用的同一数据库。 对于作为春季批处理作业的任务,作业和步骤执行数据也存储在此数据库中。 与船长一样,任务可以启动到多个平台。 当数据流在 Kubernetes 上运行时,必须定义一个任务平台。 要配置面向 Kubernetes 的新平台帐户,请在 yourfile 中的部分下提供一个条目,以便通过另一个 Spring Boot 支持的机制。 在以下示例中,创建了两个名为 dandare 的 Kubernetes 平台帐户。 诸如andareCloudFoundry Deployer Properties之类的键。​​spring.cloud.dataflow.task.platform.kubernetes​​​​application.yaml​​​​dev​​​​qa​​​​memory​​​​disk​

spring:
cloud:
dataflow:
task:
platform:
kubernetes:
accounts:
dev:
namespace: devNamespace
imagePullPolicy: Always
entryPointStyle: exec
limits:
cpu: 4
qa:
namespace: qaNamespace
imagePullPolicy: IfNotPresent
entryPointStyle: boot
limits:
memory: 2048m

通过定义一个平台,允许您跳过使用原本需要使用的地方。​​default​​​​platformName​

启动任务时,使用任务启动选项传递平台帐户名称的值如果不传递值,则将使用该值。​​--platformName​​​​platformName​​​​default​

将任务部署到多个平台时,任务的配置需要连接到与数据流服务器相同的数据库。

您可以配置Spring Cloud Data Flow参考指南(三)处理挂载的机密。ConfigMaps必须挂载在Spring Boot处理的目录中。避免访问 Kubernetes API 服务器设置。​​/etc/secrets​​​​application.yaml​​​​/config​​​​SPRING_CLOUD_KUBERNETES_CONFIG_ENABLE_API​​​​SPRING_CLOUD_KUBERNETES_SECRETS_ENABLE_API​​​​false​

12.4.1. 使用配置映射和密钥

可以使用 KubernetesConfigMap和机密将配置属性传递给数据流服务器。

以下示例显示了一种可能的配置,该配置启用 MySQL 并设置内存限制:

apiVersion: v1
kind: ConfigMap
metadata:
name: scdf-server
labels:
app: scdf-server
data:
application.yaml: |-
spring:
cloud:
dataflow:
task:
platform:
kubernetes:
accounts:
default:
limits:
memory: 1024Mi
datasource:
url: jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT}/mysql
username: root
password: ${mysql-root-password}
driverClassName: org.mariadb.jdbc.Driver
testOnBorrow: true
validationQuery: "SELECT 1"

前面的示例假定 MySQL 作为服务名称进行部署。Kubernetes 将这些服务的主机和端口值发布为环境变量,我们在配置部署的应用程序时可以使用这些变量。​​mysql​

我们更喜欢在机密文件中提供 MySQL 连接密码,如以下示例所示:

apiVersion: v1
kind: Secret
metadata:
name: mysql
labels:
app: mysql
data:
mysql-root-password: eW91cnBhc3N3b3Jk

密码是 base64 编码的值。

12.5. 数据库配置

Spring Cloud Data Flow 为 H2、HSQLDB、MySQL、Oracle、PostgreSQL、DB2 和 SQL Server 提供模式。服务器启动时会自动创建适当的模式,前提是类路径中具有正确的数据库驱动程序和适当的凭据。

用于MySQL(通过MariaDB驱动程序),HSQLDB,PostgreSQL和嵌入式H2的JDBC驱动程序开箱即用。 如果使用任何其他数据库,则需要将相应的 JDBC 驱动程序 jar 放在服务器的类路径上。

例如,如果您在机密文件中除了使用密码之外还使用 MySQL,则可以在 ConfigMap 中提供以下属性:

data:
application.yaml: |-
spring:
datasource:
url: jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT}/mysql
username: root
password: ${mysql-root-password}
driverClassName: org.mariadb.jdbc.Driver
url: jdbc:mysql://${MYSQL_SERVICE_HOST}:${MYSQL_SERVICE_PORT}/test
driverClassName: org.mariadb.jdbc.Driver

对于PostgreSQL,您可以使用以下配置:

data:
application.yaml: |-
spring:
datasource:
url: jdbc:postgresql://${PGSQL_SERVICE_HOST}:${PGSQL_SERVICE_PORT}/database
username: root
password: ${postgres-password}
driverClassName: org.postgresql.Driver

对于 HSQLDB,您可以使用以下配置:

data:
application.yaml: |-
spring:
datasource:
url: jdbc:hsqldb:hsql://${HSQLDB_SERVICE_HOST}:${HSQLDB_SERVICE_PORT}/database
username: sa
driverClassName: org.hsqldb.jdbc.JDBCDriver

以下来自部署的 YAML 代码段是一个挂载 ConfigMap 的示例,在 Spring Boot 将处理它的位置下,以及一个挂载的 Secret,由于环境变量被设置为,它将在下面被 spring-cloud-kubernetes 库拾取。​​application.yaml​​​​/config​​​​/etc/secrets​​​​SPRING_CLOUD_KUBERNETES_SECRETS_PATHS​​​​/etc/secrets​

...
containers:
- name: scdf-server
image: springcloud/spring-cloud-dataflow-server:2.5.0.BUILD-SNAPSHOT
imagePullPolicy: Always
volumeMounts:
- name: config
mountPath: /config
readOnly: true
- name: database
mountPath: /etc/secrets/database
readOnly: true
ports:
...
volumes:
- name: config
configMap:
name: scdf-server
items:
- key: application.yaml
path: application.yaml
- name: database
secret:
secretName: mysql

您可以在​​spring-cloud-task​​存储库中找到特定数据库类型的迁移脚本。

12.6. 监控和管理

我们建议使用命令对流和任务进行故障排除。​​kubectl​

可以使用以下命令列出使用的所有项目和资源:

kubectl get all,cm,secrets,pvc

您可以通过使用标签选择资源来列出特定应用程序或服务使用的所有资源。以下命令列出服务使用的所有资源:​​mysql​

kubectl get all -l app=mysql

您可以通过发出以下命令来获取特定 Pod 的日志:

kubectl logs pod <pod-name>

如果 Pod 不断重新启动,您可以添加一个选项来查看以前的日志,如下所示:​​-p​

kubectl logs -p <pod-name>

您还可以通过添加选项来跟踪或跟踪日志,如下所示:​​-f​

kubectl logs -f <pod-name>

帮助解决问题(例如启动时出现致命错误的容器)的有用命令是使用该命令,如以下示例所示:​​describe​

kubectl describe pod ticktock-log-0-qnk72

12.6.1. 检查服务器日志

您可以使用以下命令访问服务器日志:

kubectl get pod -l app=scdf=server
kubectl logs <scdf-server-pod-name>

12.6.2. 流

流应用程序使用流名称后跟应用程序名称进行部署。对于处理器和接收器,还会追加实例索引。

要查看 Spring Cloud 数据流服务器部署的所有 Pod,您可以指定标签,如下所示:​​role=spring-app​

kubectl get pod -l role=spring-app

若要查看特定应用程序部署的详细信息,可以使用以下命令:

kubectl describe pod <app-pod-name>

若要查看应用程序日志,可以使用以下命令:

kubectl logs <app-pod-name>

如果要跟踪日志,可以使用以下命令:

kubectl logs -f <app-pod-name>

12.6.3. 任务

任务作为裸 Pod 启动,没有复制控制器。任务完成后,容器将保留,这使您有机会查看日志。

要查看特定任务的所有容器,请使用以下命令:

kubectl get pod -l task-name=<task-name>

若要查看任务日志,请使用以下命令:

kubectl logs <task-pod-name>

有两个选项可以删除已完成的容器。您可以在不再需要它们时手动删除它们,也可以使用数据流 shell命令删除已完成的容器以执行任务。​​task execution cleanup​

要手动删除任务窗格,请使用以下命令:

kubectl delete pod <task-pod-name>

要使用命令,您必须首先确定 对于任务执行。为此,请使用命令,如以下示例(带输出)所示:​​task execution cleanup​​​​ID​​​​task execution list​

dataflow:>task execution list
╔═════════╤══╤════════════════════════════╤════════════════════════════╤═════════╗
║Task Name│ID│ Start Time │ End Time │Exit Code║
╠═════════╪══╪════════════════════════════╪════════════════════════════╪═════════╣
║task1 │1 │Fri May 05 18:12:05 EDT 2017│Fri May 05 18:12:05 EDT 2017│0 ║
╚═════════╧══╧════════════════════════════╧════════════════════════════╧═════════╝

获得 ID 后,可以发出命令来清理执行工件(已完成的 pod),如以下示例所示:

dataflow:>task execution cleanup --id 1
Request to clean up resources for task execution 1 has been submitted
任务的数据库凭据

默认情况下,Spring Cloud Data Flow 在任务启动时将数据库凭据作为属性传递给 Pod。 如果使用理论入口点样式,则当用户对任务的 Pod 进行操作时,将可以看到数据库凭据。 要将 Spring Cloud Data Flow 配置为使用 Kubernetes Secrets:Setproperty to。如果使用Spring Cloud Data Flow提供的yaml文件,请更新'src/kubernetes/server/server-deployment.yaml以添加以下环境变量:​​exec​​​​shell​​​​kubectl describe​​​​spring.cloud.dataflow.task.use.kubernetes.secrets.for.db.credentials​​​​true​

- name: SPRING_CLOUD_DATAFLOW_TASK_USE_KUBERNETES_SECRETS_FOR_DB_CREDENTIALS
value: 'true'

如果从以前版本的 SCDF 升级,请务必验证 server-config.yaml 中是否存在 andenvironment 变量。如果没有,请添加它,如下例所示:​​spring.datasource.username​​​​spring.datasource.password​​​​secretKeyRefs​

...
task:
platform:
kubernetes:
accounts:
default:
secretKeyRefs:
- envVarName: "spring.datasource.password"
secretName: mysql
dataKey: mysql-root-password
- envVarName: "spring.datasource.username"
secretName: mysql
dataKey: mysql-root-username
...

还要验证关联的密钥 (dataKey) 是否在密钥中也可用。SCDF在这里为MySql提供了一个示例:​​src/kubernetes/mysql/mysql-svc.yaml​

默认情况下,通过属性传递数据库凭据是为了保持向后兼容性。此功能将在将来的版本中删除。

12.7. 调度

本节介绍如何自定义计划任务的配置方式。默认情况下,任务调度在Spring Cloud Data Flow Kubernetes Server中处于启用状态。属性用于影响计划任务的设置,可以全局或按计划进行配置。

除非另有说明,否则按计划设置的属性始终优先于设置为服务器配置的属性。这种安排允许能够覆盖特定计划的全局服务器级别属性。

有关支持选项的更多信息,请参阅KubernetesSchedulerProperties。

12.7.1. 入口点样式

入口点样式会影响将应用程序属性传递到要部署的任务容器的方式。目前支持三种样式:

  • ​exec​​:(默认值)将所有应用程序属性作为命令行参数传递。
  • ​shell​​:将所有应用程序属性作为环境变量传递。
  • ​boot​​:创建一个环境变量,该变量包含所有应用程序属性的 JSON 表示形式。SPRING_APPLICATION_JSON

您可以按如下方式配置入口点样式:

deployer.kubernetes.entryPointStyle=<Entry Point Style>

替换为所需的入口点样式。​​<Entry Point Style>​

还可以在部署 YAML 的容器部分中的服务器级别配置入口点样式,如以下示例所示:​​env​

env:
- name: SPRING_CLOUD_SCHEDULER_KUBERNETES_ENTRY_POINT_STYLE
value: entryPointStyle

替换为所需的入口点样式。​​entryPointStyle​

您应该选择“要么”的入口点样式,以对应于在容器中定义语法的方式。有关 vss 的更多信息和用例,请参阅 Docker 文档的入口点部分。​​exec​​​​shell​​​​ENTRYPOINT​​​​Dockerfile​​​​exec​​​​shell​

使用入口点样式对应于使用样式。部署请求中的命令行参数将传递到容器,并添加映射到环境变量的应用程序属性,而不是命令行参数。​​boot​​​​exec​​​​ENTRYPOINT​​​​SPRING_APPLICATION_JSON​

12.7.2. 环境变量

若要影响给定应用程序的环境设置,可以利用该属性。 例如,生产设置中的一个常见要求是影响 JVM 内存参数。 您可以使用环境变量来实现此目的,如以下示例所示:​​spring.cloud.deployer.kubernetes.environmentVariables​​​​JAVA_TOOL_OPTIONS​

deployer.kubernetes.environmentVariables=JAVA_TOOL_OPTIONS=-Xmx1024m

部署流应用程序或启动任务应用程序时,其中某些属性可能包含敏感信息,请使用理论。这是因为(默认)将所有属性转换为命令行参数,因此在某些环境中可能不安全。​​shell​​​​boot​​​​entryPointStyle​​​​exec​

此外,还可以在部署 YAML 的容器部分中的服务器级别配置环境变量,如以下示例所示:​​env​

在服务器配置中和按计划指定环境变量时,将合并环境变量。这允许在服务器配置中设置公共环境变量,并在特定计划级别设置更具体的环境变量。

env:
- name: SPRING_CLOUD_SCHEDULER_KUBERNETES_ENVIRONMENT_VARIABLES
value: myVar=myVal

替换为所需的环境变量。​​myVar=myVal​

12.7.3. 镜像拉取策略

映像拉取策略定义何时应将 Docker 映像拉取到本地注册表。目前支持三种策略:

  • ​IfNotPresent​​:(默认值)如果映像已存在,则不要拉取该映像。
  • ​Always​​:始终拉取映像,无论它是否已存在。
  • ​Never​​:切勿拉取映像。仅使用已存在的映像。

以下示例演示如何单独配置容器:

deployer.kubernetes.imagePullPolicy=Always

替换为所需的映像拉取策略。​​Always​

您可以在部署 YAML 的容器部分中的服务器级别配置映像拉取策略,如以下示例所示:​​env​

env:
- name: SPRING_CLOUD_SCHEDULER_KUBERNETES_IMAGE_PULL_POLICY
value: Always

替换为所需的映像拉取策略。​​Always​

12.7.4. 私有 Docker 注册表

可以通过配置密钥来拉取私有且需要身份验证的 Docker 映像。首先,您必须在群集中创建密钥。按照从专用注册表拉取映像指南创建机密。

创建机密后,使用 该属性设置要使用的机密,如以下示例所示:​​imagePullSecret​

deployer.kubernetes.imagePullSecret=mysecret

替换为之前创建的密钥的名称。​​mysecret​

还可以在部署 YAML 的容器部分中的服务器级别配置映像拉取机密,如以下示例所示:​​env​

env:
- name: SPRING_CLOUD_SCHEDULER_KUBERNETES_IMAGE_PULL_SECRET
value: mysecret

替换为之前创建的密钥的名称。​​mysecret​

12.7.5. 命名空间

默认情况下,用于计划任务的命名空间为。可以在部署 YAML 的容器部分中的服务器级别配置中设置此值,如以下示例所示:​​default​​​​env​

env:
- name: SPRING_CLOUD_SCHEDULER_KUBERNETES_NAMESPACE
value: mynamespace

12.7.6. 服务帐户

您可以通过属性为计划任务配置自定义服务帐户。可以使用现有服务帐户或创建新的服务帐户。创建服务帐户的一种方法是使用,如以下示例所示:​​kubectl​

$ kubectl create serviceaccount myserviceaccountname
serviceaccount "myserviceaccountname" created

然后,您可以配置服务帐户以按计划使用,如下所示:

deployer.kubernetes.taskServiceAccountName=myserviceaccountname

替换为您的服务帐户名称。​​myserviceaccountname​

还可以在部署 YAML 的容器部分中的服务器级别配置服务帐户名称,如以下示例所示:​​env​

env:
- name: SPRING_CLOUD_SCHEDULER_KUBERNETES_TASK_SERVICE_ACCOUNT_NAME
value: myserviceaccountname

替换为要应用于所有部署的服务帐户名称。​​myserviceaccountname​

有关计划任务的详细信息,请参阅计划任务。

12.8. 调试支持

调试Spring Cloud Data Flow Kubernetes Server和包含的组件(如Spring Cloud Kubernetes Deployer)通过Java Debug Wire协议(JDWP)得到支持。本节概述了一种手动启用调试的方法,以及另一种使用Spring Cloud Data Flow Server Kubernetes提供的配置文件来“修补”正在运行的部署的方法。

JDWP 本身不使用任何身份验证。本部分假定调试是在本地开发环境(如 Minikube)上完成的,因此不提供有关保护调试端口的指导。

12.8.1. 手动启用调试

要手动启用 JDWP,请首先编辑并在值为 下添加一个附加条目。此外,添加JAVA_TOOL_OPTIONS环境变量,如以下示例所示:​​src/kubernetes/server/server-deployment.yaml​​​​containerPort​​​​spec.template.spec.containers.ports​​​​5005​​​​spec.template.spec.containers.env​

spec:
...
template:
...
spec:
containers:
- name: scdf-server
...
ports:
...
- containerPort: 5005
env:
- name: JAVA_TOOL_OPTIONS
value: '-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005'

前面的示例使用端口 5005,但它可以是与其他端口不冲突的任何数字。对于标志的附加值和参数,所选的端口号也必须相同,如前面的示例所示。​​containerPort​​​​address​​​​JAVA_TOOL_OPTIONS​​​​-agentlib​

您现在可以启动Spring Cloud Data Flow Kubernetes Server。服务器启动后,您可以验证部署上的配置更改,如以下示例(带输出)所示:​​scdf-server​

kubectl describe deployment/scdf-server
...
...
Pod Template:
...
Containers:
scdf-server:
...
Ports: 80/TCP, 5005/TCP
...
Environment:
JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
...

启动服务器并启用 JDWP 后,您需要配置对端口的访问。在此示例中,我们使用 的端口转发子命令。以下示例(带输出)演示如何使用以下命令向调试目标公开本地端口:​​kubectl​​​​port-forward​

$ kubectl get pod -l app=scdf-server
NAME READY STATUS RESTARTS AGE
scdf-server-5b7cfd86f7-d8mj4 1/1 Running 0 10m
$ kubectl port-forward scdf-server-5b7cfd86f7-d8mj4 5005:5005
Forwarding from 127.0.0.1:5005 -> 5005
Forwarding from [::1]:5005 -> 5005

现在,可以通过将调试器指向主机和端口来附加调试器。子命令一直运行到停止(例如,通过按下)。​​127.0.0.1​​​​5005​​​​port-forward​​​​CTRL+c​

可以通过将更改还原为来删除调试支持。还原的更改将在Spring Cloud Data Flow Kubernetes Server的下一次部署中选取。在每次部署服务器时都应默认启用调试时,手动向配置添加调试支持非常有用。​​src/kubernetes/server/server-deployment.yaml​

12.8.2. 使用修补启用调试

与其手动更改,不如将 Kubernetes 对象“修补”到位。为方便起见,包括提供与手动方法相同配置的修补程序文件。若要通过修补启用调试,请使用以下命令:​​server-deployment.yaml​

kubectl patch deployment scdf-server -p "$(cat src/kubernetes/server/server-deployment-debug.yaml)"

运行上述命令会自动添加属性和环境变量。以下示例(带输出)演示如何验证对部署的更改:​​containerPort​​​​JAVA_TOOL_OPTIONS​​​​scdf-server​

$ kubectl describe deployment/scdf-server
...
...
Pod Template:
...
Containers:
scdf-server:
...
Ports: 5005/TCP, 80/TCP
...
Environment:
JAVA_TOOL_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
...

要启用对调试端口的访问,而不是使用 subcommand,您可以修补 Kubernetes 服务对象。您必须首先确保 Kubernetes 服务对象具有正确的配置。以下示例(带输出)演示了如何执行此操作:​​port-forward​​​​kubectl​​​​scdf-server​​​​scdf-server​

kubectl describe service/scdf-server
Port: <unset> 80/TCP
TargetPort: 80/TCP
NodePort: <unset> 30784/TCP

如果输出包含,则必须修补服务以为此端口添加名称。以下示例演示如何执行此操作:​​<unset>​

$ kubectl patch service scdf-server -p "$(cat src/kubernetes/server/server-svc.yaml)"

只有在添加调试功能之前创建了目标群集时,才应缺少端口名称。由于多个端口被添加到 Kubernetes 服务对象中,因此每个端口都需要有自己的名称。​​scdf-server​

现在,您可以添加调试端口,如以下示例所示:

kubectl patch service scdf-server -p "$(cat src/kubernetes/server/server-svc-debug.yaml)"

以下示例(带输出)演示如何验证映射:

$ kubectl describe service scdf-server
Name: scdf-server
...
...
Port: scdf-server-jdwp 5005/TCP
TargetPort: 5005/TCP
NodePort: scdf-server-jdwp 31339/TCP
...
...
Port: scdf-server 80/TCP
TargetPort: 80/TCP
NodePort: scdf-server 30883/TCP
...
...

输出显示容器端口 5005 已映射到 31339 的节点端口。以下示例(带输出)显示了如何获取 Minikube 节点的 IP 地址:

$ minikube ip
192.168.99.100

使用此信息,可以使用主机 192.168.99.100 和端口 31339 创建调试连接。

以下示例演示如何禁用 JDWP:

$ kubectl rollout undo deployment/scdf-server
$ kubectl patch service scdf-server --type json -p='[{"op": "remove", "path": "/spec/ports/0"}]'

Kubernetes 部署对象在修补之前会回滚到其状态。然后使用 a操作修补 Kubernetes 服务对象,以从列表中删除端口 5005。​​remove​​​​containerPorts​

​kubectl rollout undo​​​强制容器重新启动。修补 Kubernetes 服务对象不会重新创建服务,并且到部署的端口映射保持不变。​​scdf-server​

有关部署回滚的更多信息,包括管理历史记录和使用kubectl 补丁就地更新 API 对象,请参阅回滚部署。

本节介绍用于启动 shell 的选项,以及与 shell 如何处理空格、引号和 SpEL 表达式的解释相关的更高级功能。 流 DSL和组合任务 DSL的介绍性章节是 shell 命令最常见用法的好起点。

13. 外壳选项

该外壳建立在Spring Shell项目之上。 一些命令行选项来自Spring Shell,有些特定于数据流。 外壳采用以下命令行选项:

unix:>java -jar spring-cloud-dataflow-shell-2.9.6.jar --help
Data Flow Options:
--dataflow.uri= Address of the Data Flow Server [default: http://localhost:9393].
--dataflow.username= Username of the Data Flow Server [no default].
--dataflow.password= Password of the Data Flow Server [no default].
--dataflow.credentials-provider-command= Executes an external command which must return an
OAuth Bearer Token (Access Token prefixed with 'Bearer '),
e.g. 'Bearer 12345'), [no default].
--dataflow.skip-ssl-validation= Accept any SSL certificate (even self-signed) [default: no].
--dataflow.proxy.uri= Address of an optional proxy server to use [no default].
--dataflow.proxy.username= Username of the proxy server (if required by proxy server) [no default].
--dataflow.proxy.password= Password of the proxy server (if required by proxy server) [no default].
--spring.shell.historySize= Default size of the shell log file [default: 3000].
--spring.shell.commandFile= Data Flow Shell executes commands read from the file(s) and then exits.
--help This message.

您可以使用该选项指向包含以下内容的现有文件 用于部署一个或多个相关流和任务的所有命令行管理程序命令。 还支持运行多个文件。它们应作为逗号分隔的字符串传递:​​spring.shell.commandFile​

​--spring.shell.commandFile=file1.txt,file2.txt​

创建一些脚本以帮助自动执行部署时,此选项非常有用。

此外,以下 shell 命令有助于将复杂脚本模块化为多个独立文件:

​dataflow:>script --file <YOUR_AWESOME_SCRIPT>​

14. 列出可用命令

在命令提示符处键入会列出所有可用命令。 大多数命令用于数据流功能,但少数命令是常规用途。 以下清单显示了命令的输出:​​help​​​​help​

! - Allows execution of operating system (OS) commands
clear - Clears the console
cls - Clears the console
date - Displays the local date and time
exit - Exits the shell
http get - Make GET request to http endpoint
http post - POST data to http endpoint
quit - Exits the shell
system properties - Shows the shells properties {JB - restore the apostrophe}
version - Displays shell version

添加命令的名称以显示有关如何调用命令的其他信息:​​help​

dataflow:>help stream create
Keyword: stream create
Description: Create a new stream definition
Keyword: ** default **
Keyword: name
Help: the name to give to the stream
Mandatory: true
Default if specified: '__NULL__'
Default if unspecified: '__NULL__'

Keyword: definition
Help: a stream definition, using the DSL (e.g. "http --port=9000 | hdfs")
Mandatory: true
Default if specified: '__NULL__'
Default if unspecified: '__NULL__'

Keyword: deploy
Help: whether to deploy the stream immediately
Mandatory: false
Default if specified: 'true'
Default if unspecified: 'false'

15. 选项卡补全

您可以通过在引导后按键来完成 shell 中的 shell 命令选项。例如,按 afters 会产生以下一对建议:​​TAB​​​​--​​​​TAB​​​​stream create --​

dataflow:>stream create --
stream create --definition stream create --name

如果键入然后按 Tab 键,展开。​​--de​​​​--definition​

在流或组合任务 DSL 表达式中,还可以使用应用程序或任务属性的选项卡完成。还可以用于在流 DSL 表达式中获取可用于使用的可用源、处理器或接收器的提示。​​TAB​

16. 空格和引用规则

仅当参数值包含空格或字符时,才需要引用参数值。下面的示例将 SpEL 表达式(应用于它遇到的任何数据)传递给转换处理器:​​|​

transform --expression='new StringBuilder(payload).reverse()'

如果参数值需要嵌入单引号,请使用两个单引号,如下所示:

// Query is: Select * from /Customers where name='Smith'
scan --query='Select * from /Customers where name=''Smith'''

16.1. 引号和转义

有一个基于 Spring Shell 的客户端与数据流服务器通信,并负责解析DSL。 反过来,应用程序可能具有依赖于嵌入式语言的应用程序属性,例如Spring 表达式语言

命令行管理程序、数据流 DSL 解析器和 SpEL 都有关于它们如何处理引号以及语法转义如何工作的规则。 当组合在一起时,可能会出现混淆。 本节介绍适用的规则,并提供涉及所有三个组件时可能遇到的最复杂情况的示例。

它并不总是那么复杂


如果不使用数据流外壳(例如,直接使用 REST API),或者应用程序属性不是 SpEL 表达式,则转义规则更简单。


16.1.1. 外壳规则

可以说,当涉及到报价时,最复杂的组件是 Shell。不过,规则可以非常简单地列出:

  • shell 命令由键 () 和相应的值组成。不过,有一个特殊的无键映射,稍后将介绍。--something
  • 值通常不能包含空格,因为空格是命令的默认分隔符。
  • 不过,可以通过用引号(单 () 或双 () 引号)将值括起来来添加空格。'"
  • 在部署属性中传递的值(例如,)不应再次用引号括起来。deployment <stream-name> --properties " …​"
  • 如果用引号括起来,则值可以通过在文本引号前面加上反斜杠 () 来嵌入相同类型的文本引号。\
  • 其他转义也可用,例如表单的,,,和 unicode 转义。\t\n\r\f\uxxxx
  • 无键映射以特殊方式处理,因此不需要引用即可包含空格。

例如,外壳支持命令来执行本机外壳命令。接受单个无密钥参数。这就是以下示例工作的原因:​​!​​​​!​

dataflow:>! rm something

这里的参数是整个字符串,它按原样传递给底层 shell。​​rm something​

作为另一个示例,以下命令是严格等效的,参数值为(不带引号):​​something​

dataflow:>stream destroy something
dataflow:>stream destroy --name something
dataflow:>stream destroy "something"
dataflow:>stream destroy --name "something"

16.1.2. 属性文件规则

从文件加载属性时,规则会放宽。

  • 属性文件(Java 和 YAML)中使用的特殊字符需要转义。例如,应替换为,by等。\\\\t\\t
  • 对于 Java 属性文件 (),属性值不应用引号括起来。即使它们包含空格,也不需要它。--propertiesFile <FILE_PATH>.properties


filter.expression=payload > 5
  • 但是,对于 YAML 属性文件 (),值需要用双引号括起来。--propertiesFile <FILE_PATH>.yaml


app:
filter:
filter:
expression: "payload > 5"

16.1.3. DSL 解析规则

在分析器级别(即,在流或任务定义的正文中),规则如下所示:

  • 选项值通常解析到第一个空格字符。
  • 但是,它们可以由文字字符串组成,用单引号或双引号括起来。
  • 要嵌入此类引号,请使用所需类型的两个连续引号。

因此,在以下示例中,筛选器应用程序的选项值在语义上是等效的:​​--expression​

filter --expression=payload>5
filter --expression="payload>5"
filter --expression='payload>5'
filter --expression='payload > 5'

可以说,最后一个更具可读性。由于周围的报价,它成为可能。实际表达式是。​​payload > 5​

现在,假设我们要针对字符串消息进行测试。如果我们想将有效负载与 SpEL 文字字符串进行比较,我们可以使用以下内容:​​"something"​

filter --expression=payload=='something'           
filter --expression='payload == ''something'''
filter --expression='payload == "something"'

这有效,因为没有空格。不过,它不是很清晰。

这使用单引号来保护整个参数。因此,实际的单引号需要加倍。

SpEL 识别带有单引号或双引号的字符串文字,因此最后一种方法可以说是最具可读性的。

请注意,前面的示例将在 shell 之外考虑(例如,直接调用 REST API 时)。 在 shell 中输入时,整个流定义本身很可能在双引号内,需要对其进行转义。然后,整个示例将变为以下内容:

dataflow:>stream create something --definition "http | filter --expression=payload='something' | log"

dataflow:>stream create something --definition "http | filter --expression='payload == ''something''' | log"

dataflow:>stream create something --definition "http | filter --expression='payload == \"something\"' | log"

16.1.4. SpEL 语法和 SpEL 文字

拼图的最后一块是关于 SpEL 表达式的。 许多应用程序接受要解释为 SpEL 表达式的选项,并且如前所述,字符串文本也以特殊方式处理。规则如下:

  • 文本可以括在单引号或双引号中。
  • 引号需要加倍才能嵌入文字引号。双引号中的单引号不需要特殊处理,反之亦然。

作为最后一个示例,假设您要使用转换处理器。 此处理器接受 anoption,这是一个 SpEL 表达式。它将根据传入消息进行评估,默认值为 of(将消息有效负载原封不动地转发)。​​expression​​​​payload​

请务必了解以下语句是等效的:

transform --expression=payload
transform --expression='payload'

但是,它们与以下内容(及其变体)不同:

transform --expression="'payload'"
transform --expression='''payload'''

第一个系列的计算结果为消息有效负载,而后一个示例的计算结果为文本字符串。​​payload​

16.1.5. 将它们放在一起

作为最后一个完整示例,请考虑如何通过在数据流外壳的上下文中创建流来强制将所有消息转换为字符串文本:​​hello world​

dataflow:>stream create something --definition "http | transform --expression='''hello world''' | log" 

dataflow:>stream create something --definition "http | transform --expression='\"hello world\"' | log"

dataflow:>stream create something --definition "http | transform --expression=\"'hello world'\" | log"

在第一行中,单引号将字符串括起来(在数据流分析器级别),但它们需要加倍,因为它们位于字符串文本内(由等号后的第一个单引号开头)。

第二行和第三行分别使用单引号和双引号,以包含数据流分析器级别的整个字符串。因此,可以在字符串中使用另一种引号。不过,整个事情都在 shell 的参数中,它使用双引号。因此,双引号被转义(在外壳级别)。​​--definition​

17. 简介

流是长期存在的Spring Cloud Stream应用程序的集合,它们通过消息传递中间件相互通信。 基于文本的 DSL 定义应用程序之间的配置和数据流。虽然为您提供了许多应用程序来实现常见用例,但您通常会创建自定义 Spring Cloud Stream 应用程序来实现自定义业务逻辑。

流的一般生命周期是:

  1. 注册应用程序。
  2. 创建流定义。
  3. 部署流。
  4. 取消部署或销毁流。
  5. 升级或回滚流中的应用程序。

为了部署流,必须将数据流服务器配置为将部署委托给 Spring Cloud 生态系统中名为Skipper 的新服务器。

此外,您可以将 Skipper 配置为将应用程序部署到一个或多个 Cloud Foundry 组织和空间、Kubernetes 集群上的一个或多个命名空间或本地计算机。 在数据流中部署流时,可以指定在部署时使用的平台。 Skipper 还为数据流提供了对已部署流执行更新的功能。 有许多方法可以更新流中的应用程序,但最常见的示例之一是使用新的自定义业务逻辑升级处理器应用程序,同时保留现有的源和接收器应用程序。

17.1. 流管线 DSL

流是使用 Unix 启发的管道语法定义的。 该语法使用垂直条(称为“管道”)来连接多个命令。 Unix 中的命令获取进程的输出并将其通过管道传输到进程的输入。 的输出又被发送到进程的输入。 每个符号将左侧命令的标准输出连接到右侧命令的标准输入。 数据从左到右流经管道。​​ls -l | grep key | less​​​​ls -l​​​​grep key​​​​grep​​​​less​​​​|​

在数据流中,Unix 命令被Spring Cloud Stream应用程序取代,每个管道符号表示通过消息传递中间件(如 RabbitMQ 或 Apache Kafka)连接应用程序的输入和输出。

每个 Spring Cloud Stream 应用程序都以一个简单的名称注册。 注册过程指定可以在何处获取应用程序(例如,在 Maven 存储库或 Docker 注册表中)。您可以在本节中找到有关如何注册Spring Cloud Stream应用程序的更多信息。 在数据流中,我们将 Spring 云流应用程序分类为源、处理器或接收器。

作为一个简单的示例,请考虑从 HTTP 源收集数据并写入文件接收器。 使用 DSL,流描述为:

​http | file​

涉及某些处理的流将表示为:

​http | filter | transform | file​

可以使用 shell 的命令创建流定义,如以下示例所示:​​stream create​

​dataflow:> stream create --name httpIngest --definition "http | file"​

流 DSL 将传递到命令选项。​​--definition​

流定义的部署是通过命令行管理程序的命令完成的,如下所示:​​stream deploy​

​dataflow:> stream deploy --name ticktock​

入门部分向您展示如何启动服务器以及如何启动和使用 Spring Cloud Data Flow shell。

请注意,外壳程序调用数据流服务器的 REST API。有关直接向服务器发出 HTTP 请求的更多信息,请参阅REST API 指南。

命名流定义时,请记住,流中的每个应用程序都将在平台上创建,其名称格式为 。因此,生成的应用程序名称的总长度不能超过 58 个字符。​​<stream name>-<app name>​

17.2. 流应用程序 DSL

可以使用流应用程序 DSL 为每个 Spring 云流应用程序定义自定义绑定属性。 有关详细信息,请参阅微型网站的“流应用程序 DSL”部分。

请考虑以下 Java 接口,它定义了一个输入法和两个输出方法:

public interface Barista {

@Input
SubscribableChannel orders();

@Output
MessageChannel hotDrinks();

@Output
MessageChannel coldDrinks();
}

进一步考虑以下 Java 接口,这是创建 Kafka Streams 应用程序的典型接口:

interface KStreamKTableBinding {

@Input
KStream<?, ?> inputStream();

@Input
KTable<?, ?> inputTable();
}

在这些具有多个输入和输出绑定的情况下,数据流无法对从一个应用程序到另一个应用程序的数据流做出任何假设。 因此,您需要设置绑定属性以“连接”应用程序。 流应用程序 DSL使用“双管道”而不是“管道符号”来指示数据流不应配置应用程序的绑定属性。可以认为是“并行”的意思。 以下示例显示了此类“并行”定义:​​||​

dataflow:> stream create --definition "orderGeneratorApp || baristaApp || hotDrinkDeliveryApp || coldDrinkDeliveryApp" --name myCafeStream

突破性变革!SCDF Local、Cloud Foundry 1.7.0 到 1.7.2 和 SCDF Kubernetes 1.7.0 到 1.7.1 的版本使用 the character 作为应用程序之间的分隔符。这导致了传统流 DSL 中的重大更改。虽然不理想,但更改分隔符被认为是对现有用户影响最小的最佳解决方案。​​comma​

此流有四个应用程序。有两个输出目标,并且分别供 and 使用。 部署此流时,需要设置绑定属性,以便将热饮消息发送到目标,将冷饮消息发送到目标。 以下清单是这样做的:​​baristaApp​​​​hotDrinks​​​​coldDrinks​​​​hotDrinkDeliveryApp​​​​coldDrinkDeliveryApp​​​​baristaApp​​​​hotDrinkDeliveryApp​​​​coldDrinkDeliveryApp​

app.baristaApp.spring.cloud.stream.bindings.hotDrinks.destination=hotDrinksDest
app.baristaApp.spring.cloud.stream.bindings.coldDrinks.destination=coldDrinksDest
app.hotDrinkDeliveryApp.spring.cloud.stream.bindings.input.destination=hotDrinksDest
app.coldDrinkDeliveryApp.spring.cloud.stream.bindings.input.destination=coldDrinksDest

如果要使用消费组,则需要分别在生产者和消费者应用程序上设置 Spring Cloud Stream 应用程序属性。​​spring.cloud.stream.bindings.<channelName>.producer.requiredGroups​​​​spring.cloud.stream.bindings.<channelName>.group​

Stream Application DSL 的另一个常见用例是部署一个 HTTP 网关应用程序,该应用程序向 Kafka 或 RabbitMQ 应用程序发送同步请求或回复消息。 在这种情况下,HTTP 网关应用程序和 Kafka 或 RabbitMQ 应用程序都可以是不使用 Spring Cloud Stream 库的 Spring Integration 应用程序。

也可以使用 Stream 应用程序 DSL 仅部署单个应用程序。

17.3. 应用程序属性

每个应用程序都采用属性来自定义其行为。例如,源模块公开了允许数据引入端口从默认值更改的设置:​​http​​​​port​

dataflow:> stream create --definition "http --port=8090 | log" --name myhttpstream

此属性实际上与标准的 Spring Bootproperty 相同。 数据流添加了使用速记形式代替的功能。 您还可以指定手写版本:​​port​​​​server.port​​​​port​​​​server.port​

dataflow:> stream create --definition "http --server.port=8000 | log" --name myhttpstream

有关流应用程序属性的部分详细讨论了此速记行为。 如果已注册应用程序属性元数据,则可以在键入后在 shell 中使用 Tab 完成来获取候选属性名称的列表。​​--​

外壳为应用程序属性提供选项卡补全。Shell 命令为所有受支持的属性提供其他文档。​​app info --name <appName> --type <appType>​

支持的流可能性是:,和。​​<appType>​​​​source​​​​processor​​​​sink​

18. 流生命周期

流的生命周期经历以下阶段:

  1. 注册流应用程序
  2. 创建流
  3. 部署流
  4. 销毁流或取消部署流
  5. 升级或回滚流中的应用程序。

Skipper是一个服务器,可让您发现 Spring Boot 应用程序并在多个云平台上管理其生命周期。

Skipper 中的应用程序捆绑为包含应用程序资源位置、应用程序属性和部署属性的包。 您可以将 Skipper 包视为类似于 asor 等工具中的包。​​apt-get​​​​brew​

当数据流部署流时,它会生成一个包并将其上传到 Skipper,该包表示流中的应用程序。 用于升级或回滚流中的应用程序的后续命令将传递到 Skipper。 此外,流定义是从包中反向工程的,流的状态也委托给船长。

18.1. 注册流应用程序

您可以使用命令注册版本化流应用程序。必须提供唯一名称、应用程序类型和可解析为应用程序项目的 URI。 对于类型,请指定、或。版本是从 URI 解析的。以下是一些示例:​​app register​​​​source​​​​processor​​​​sink​

dataflow:>app register --name mysource --type source --uri maven://com.example:mysource:0.0.1
dataflow:>app register --name mysource --type source --uri maven://com.example:mysource:0.0.2
dataflow:>app register --name mysource --type source --uri maven://com.example:mysource:0.0.3

dataflow:>app list --id source:mysource
╔═══╤══════════════════╤═════════╤════╤════╗
║app│ source │processor│sink│task║
╠═══╪══════════════════╪═════════╪════╪════╣
║ │> mysource-0.0.1 <│ │ │ ║
║ │mysource-0.0.2 │ │ │ ║
║ │mysource-0.0.3 │ │ │ ║
╚═══╧══════════════════╧═════════╧════╧════╝

dataflow:>app register --name myprocessor --type processor --uri file:///Users/example/myprocessor-1.2.3.jar

dataflow:>app register --name mysink --type sink --uri https://example.com/mysink-2.0.1.jar

应用程序 URI 应符合以下架构格式之一:

  • Maven schema:
maven://<groupId>:<artifactId>[:<extension>[:<classifier>]]:<version>
  • HTTP 架构:
http://<web-path>/<artifactName>-<version>.jar
  • 文件架构
file:///<local-path>/<artifactName>-<version>.jar
  • 码头工人架构:
docker:<docker-image-path>/<imageName>:<version>

URIpart 对于版本控制的流应用程序是必需的。 Skipper 使用多版本流应用程序允许使用部署属性在运行时升级或回滚这些应用程序。​​<version>​

如果要注册使用 RabbitMQ binder 构建的应用程序的快照版本,可以执行以下操作:​​http​​​​log​

dataflow:>app register --name http --type source --uri maven://org.springframework.cloud.stream.app:http-source-rabbit:1.2.1.BUILD-SNAPSHOT
dataflow:>app register --name log --type sink --uri maven://org.springframework.cloud.stream.app:log-sink-rabbit:1.2.1.BUILD-SNAPSHOT

如果要一次注册多个应用程序,可以将它们存储在属性文件中, 其中键的格式为,值是 URI。​​<type>.<name>​

例如,要注册使用 RabbitMQ 绑定程序构建的应用程序的快照版本,您可以在属性文件中包含以下内容(例如,):​​http​​​​log​​​​stream-apps.properties​

source.http=maven://org.springframework.cloud.stream.app:http-source-rabbit:1.2.1.BUILD-SNAPSHOT
sink.log=maven://org.springframework.cloud.stream.app:log-sink-rabbit:1.2.1.BUILD-SNAPSHOT

然后,要批量导入应用程序,请使用命令并通过开关提供属性文件的位置,如下所示:​​app import​​​​--uri​

dataflow:>app import --uri file:///<YOUR_FILE_LOCATION>/stream-apps.properties

使用 注册应用程序与注册 a,or 相同。 该类型的应用程序只能在流应用程序 DSL(在 DSL 中使用双管道而不是单管道)中使用,并指示数据流不要配置应用程序的 Spring Cloud 流绑定属性。 注册时使用的应用程序不必是 Spring Cloud 流应用程序。它可以是任何 Spring Boot 应用程序。 有关使用此应用程序类型的详细信息,请参阅流应用程序 DSL 简介。​​--type app​​​​source​​​​processor​​​​sink​​​​app​​​​||​​​​|​​​​--type app​

您可以注册相同应用程序的多个版本(例如,相同的名称和类型),但只能将一个版本设置为默认值。 默认版本用于部署流。

首次注册应用程序时,该应用程序将被标记为默认值。可以使用以下命令更改默认应用程序版本:​​app default​

dataflow:>app default --id source:mysource --version 0.0.2
dataflow:>app list --id source:mysource
╔═══╤══════════════════╤═════════╤════╤════╗
║app│ source │processor│sink│task║
╠═══╪══════════════════╪═════════╪════╪════╣
║ │mysource-0.0.1 │ │ │ ║
║ │> mysource-0.0.2 <│ │ │ ║
║ │mysource-0.0.3 │ │ │ ║
╚═══╧══════════════════╧═════════╧════╧════╝

该命令列出给定流应用程序的所有版本。​​app list --id <type:name>​

该命令有一个可选参数,用于指定要取消注册的应用程序版本:​​app unregister​​​​--version​

dataflow:>app unregister --name mysource --type source --version 0.0.1
dataflow:>app list --id source:mysource
╔═══╤══════════════════╤═════════╤════╤════╗
║app│ source │processor│sink│task║
╠═══╪══════════════════╪═════════╪════╪════╣
║ │> mysource-0.0.2 <│ │ │ ║
║ │mysource-0.0.3 │ │ │ ║
╚═══╧══════════════════╧═════════╧════╧════╝

未指定 IFIS,则取消注册默认版本。​​--version​


流中的所有应用程序都应为要部署的流设置默认版本。 否则,它们在部署期间被视为未注册的应用程序。 使用该命令设置默认值。​​app default​


app default --id source:mysource --version 0.0.3
dataflow:>app list --id source:mysource
╔═══╤══════════════════╤═════════╤════╤════╗
║app│ source │processor│sink│task║
╠═══╪══════════════════╪═════════╪════╪════╣
║ │mysource-0.0.2 │ │ │ ║
║ │> mysource-0.0.3 <│ │ │ ║
╚═══╧══════════════════╧═════════╧════╧════╝

然后,需要设置默认应用程序版本。 但是,Theandcommand可以使用所有(默认和非默认)已注册的应用程序版本。​​stream deploy​​​​stream update​​​​stream rollback​

以下命令创建使用默认 mysource 版本 (0.0.3) 的流:

dataflow:>stream create foo --definition "mysource | log"

然后我们可以将版本更新到 0.0.2:

dataflow:>stream update foo --properties version.mysource=0.0.2

只有预先注册的应用程序才能用于,,或流。​​deploy​​​​update​​​​rollback​

尝试更新版本(未注册)失败。​​mysource​​​​0.0.1​