附录
在使用 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.11.5</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);
附录 B:“操作指南”
本节提供了一些常见“如何实现……”问题的解答,这些问题通常在人们使用 Spring Cloud Data Flow 时会出现。
如果你遇到一个我们此处未涵盖的具体问题,可以前往 stackoverflow.com 查看是否已有人提供了答案。
那里也是提出新问题的好地方(请使用 spring-cloud-dataflow 标签)。
我们也非常乐意扩展这一部分内容。如果您想添加一篇“操作指南”,可以向我们提交一个拉取请求。
B.1. 配置 Maven 属性
如果应用程序是通过 Maven 仓库进行解析的,你可能需要配置底层的解析器。
您可以在启动 Data Flow 服务器时,通过命令行属性来设置 Maven 属性,例如本地 Maven 仓库位置、远程 Maven 仓库、认证凭据以及代理服务器属性。
或者,您也可以通过为 Data Flow 服务器设置 SPRING_APPLICATION_JSON 环境变量来配置这些属性。
对于所有 Data Flow 服务器安装,默认配置了以下远程 Maven 仓库列表:
-
Maven Central(
repo.maven.apache.org/maven2) -
Spring 快照(
repo.spring.io/snapshot) -
Spring 里程碑版本(
repo.spring.io/milestone)
如果默认配置已经显式设置(仓库 URL 完全匹配),则不会被包含。
如果应用程序存在于除预配置仓库之外的其他远程仓库中,则必须显式配置该远程仓库,并将其添加到预配置的默认列表中。
要完全跳过自动默认仓库的行为,请将 maven.include-default-remote-repos 属性设置为 false。 |
要将属性作为命令行选项传递,请使用类似于以下的命令运行服务器:
java -jar <dataflow-server>.jar --maven.localRepoitory=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"
}
}
}
}'
你也可以将这些属性设置为单独的环境变量:
export MAVEN_REMOTEREPOSITORIES_REPO1_URL=https://repo1
export MAVEN_REMOTEREPOSITORIES_REPO1_AUTH_USERNAME=repo1user
export MAVEN_REMOTEREPOSITORIES_REPO1_AUTH_PASSWORD=repo1pass
export MAVEN_REMOTEREPOSITORIES_REPO2_URL=https://repo2
export MAVEN_PROXY_HOST=proxyhost
export MAVEN_PROXY_PORT=9018
export MAVEN_PROXY_AUTH_USERNAME=proxyuser
export MAVEN_PROXY_AUTH_PASSWORD=proxypass
B.3. 扩展应用程序类路径
用户可能需要向现有的 Stream 应用程序中添加依赖项,或为 Dataflow 和 Skipper(或项目提供的其他任何容器)添加特定的数据库驱动程序。
Spring Cloud Dataflow 仓库包含用于协助完成此任务的脚本。以下示例假定您已克隆了 spring-cloud-dataflow 仓库,并且正在从 src/add-deps 目录下执行这些脚本。 |
B.3.1. JAR 文件
我们建议您将更新后的 JAR 文件发布到私有的 Maven 仓库,并使用该私有仓库的 Maven 坐标在 SCDF 中注册应用程序。
例举
此示例:
* 假设 jar 文件已下载到 ${appFolder}/${appName}-${appVersion}.jar
* 添加依赖项,然后将该 jar 发布到本地 Maven 仓库。
./gradlew -i publishToMavenLocal \
-P appFolder="." \
-P appGroup="org.springframework.cloud" \
-P appName="spring-cloud-dataflow-server" \
-P appVersion="2.11.3" \
-P depFolder="./extra-libs"
使用 publishMavenPublicationToMavenRepository 任务将构件发布到远程仓库。请在 gradle.properties 文件中更新远程仓库的详细信息。或者,也可以将 repoUser 和 repoPassword 移至 ~/.gradle/gradle.properties 文件中。 |
B.3.2. 容器
为了创建容器,我们建议使用 Paketo Pack CLI,从上一步生成的 JAR 文件创建容器。
REPO=springcloud/spring-cloud-dataflow-server
TAG=2.11.3
JAR=build/spring-cloud-dataflow-server-${TAG}.jar
JAVA_VERSION=8
pack build --builder gcr.io/paketo-buildpacks/builder:base \
--path "$JAR" \
--trust-builder --verbose \
--env BP_JVM_VERSION=${JAVA_VERSION} "$REPO:$TAG-jdk${JAVA_VERSION}-extra"
| 将容器发布到私有容器注册表,并将应用程序的 Docker URI 注册到 SCDF。 |
B.4. 为尚不支持的架构创建容器。
对于搭载 M1 芯片的 macOS 系统而言,amd64/x86_64 架构的性能是不可接受的。
我们提供了一组脚本,可用于下载已发布制品的特定版本。
我们还提供了一个脚本,该脚本将使用为主机平台下载的制品创建一个容器。
您可以在各个项目的 src/local 或 local 文件夹中找到这些脚本。
| 项目 | 脚本 | 注释 |
|---|---|---|
数据流 |
|
下载或创建以下容器: |
Skipper |
|
下载或创建 |
流式应用 |
|
|
B.4.1. 脚本在spring-cloud-dataflow
src/local/download-apps.sh
从 Maven 仓库下载 create-containers.sh 所需的所有应用程序。
如果快照的时间戳匹配,则将跳过下载。
用法:download-apps.sh [version]
-
version是 dataflow-server 的版本,例如2.11.3。默认值为2.11.3-SNAPSHOT。
src/local/create-containers.sh
创建所有容器并推送到本地 Docker 注册表。
此脚本需要 jib-cli
用法:create-containers.sh [version] [jre-version]
-
version是 dataflow-server 的版本,例如2.11.3。默认值为2.11.3-SNAPSHOT。 -
jre-version应为 11 或 17 之一。默认值为 11
B.4.2. 脚本在spring-cloud-skipper
local/download-app.sh
从 Maven 仓库下载 create-containers.sh 所需的所有应用程序。
如果快照的时间戳匹配,则将跳过下载。
用法:download-app.sh [version]
-
version是 Skipper 的版本,例如2.11.3,默认值为2.11.3-SNAPSHOT
local/create-container.sh
创建所有容器并推送到本地 Docker 注册表。 此脚本需要 jib-cli
用法:create-containers.sh [version] [jre-version]
-
version是 Skipper 的版本,例如2.11.3,默认值为2.11.3-SNAPSHOT -
jre-version应为 11 或 17 之一
B.4.3. 脚本在stream-applications
local/download-apps.sh
从 Maven 仓库下载 create-containers.sh 所需的所有应用程序。
如果快照的时间戳匹配,则将跳过下载。
用法:download-apps.sh [version] [broker] [filter]
-
version是流应用程序的版本,例如3.2.1,默认值为3.2.2-SNAPSHOT -
broker是 rabbitmq、rabbit 或 kafka 之一 -
filter是一个应用程序的名称或部分名称,将用于匹配。
local/create-containers.sh
创建所有容器并推送到本地 Docker 注册表。
此脚本需要 jib-cli
用法:create-containers.sh [version] [broker] [jre-version] [filter]
-
version是 stream-applications 的版本,例如3.2.1,默认值为3.2.2-SNAPSHOT -
broker是 rabbitmq、rabbit 或 kafka 之一 -
jre-version应为 11 或 17 之一 -
filter是一个应用程序的名称或部分名称,将用于匹配。
如果创建容器所需的文件不存在,脚本将跳过该容器。
local/pack-containers.sh
创建所有容器并推送到本地 Docker 注册表。
此脚本需要 packeto pack
用法:pack-containers.sh [version] [broker] [jre-version] [filter]
-
version是 stream-applications 的版本,例如3.2.1,默认值为3.2.2-SNAPSHOT -
broker是 rabbitmq、rabbit 或 kafka 之一 -
jre-version应为 11 或 17 之一 -
filter是一个应用程序的名称或部分名称,将用于匹配。
如果缺少创建容器所需的文件,脚本将跳过该容器。
| 如果提供了任意参数,则其左侧的所有参数都应视为必填项。 |
B.5. 为本地开发或测试配置 Kubernetes
B.5.1. 前提条件
您需要先安装 kubectl,然后安装 kind 或 minikube 来创建一个本地集群。
所有示例均假设您已克隆了 spring-cloud-dataflow 代码仓库,并且正在从 deploy/k8s 目录下执行脚本。
在 macOS 上,你可能需要通过 MacPorts 安装 https://ports.macports.org/port/realpath/,或者运行 brew install realpath。
这些脚本需要像 bash 或 zsh 这样的 shell,并且应该可以在 Linux、WSL 2 或 macOS 上运行。 |
B.5.2. 步骤
-
选择 Kubernetes 提供商。Kind、Minikube 或远程 GKE 或 TMC。
-
如果命名空间不是
default,则决定用于部署的命名空间。 -
配置 Kubernetes 和负载均衡器。
-
使用
export BROKER=kafka|rabbitmq选择 Broker -
为 Skipper 和 Data Flow Server 构建或拉取容器镜像。
-
部署并启动 Spring Cloud Data Flow。
-
将 Data Flow Server 地址导出到环境变量。
Kubernetes 提供商
我该如何在 Minikube 和 Kind 之间进行选择?通常来说,Kind 的启动和销毁速度比 Minikube 更快。除了在部署 Minikube 时可以配置 CPU 和内存限制外,两者在性能方面几乎没有差别。因此,如果你的系统存在内存限制,或者需要强制实施内存限制,那么 Minikube 将是更好的选择。
Kubectl
您需要安装 kubectl 以便配置 Kubernetes 集群
类型
Kind 是在 Docker 中运行的 Kubernetes,非常适合本地开发。
LoadBalancer 将由 configure-k8s.sh 脚本安装,但需要更新一个 YAML 文件,以提供 LoadBalancer 可用的地址范围。
B.5.3. 构建和加载容器。
在本地开发时,您需要控制本地环境中使用的容器。
为了确保管理数据流(Data Flow)和 Skipper 容器的特定版本,您可以设置 SKIPPER_VERSION 和 DATAFLOW_VERSION 环境变量,然后执行 ./images/pull-dataflow.sh 和 ./images/pull-skipper.sh;或者,如果您希望使用本地构建的应用程序,可以执行 ./images/build-skipper-image.sh 和 ./images/build-dataflow.sh。
B.5.4. 配置 k8s 环境
您可以调用以下脚本之一,以选择您要进行的安装类型:
./k8s/use-kind.sh [<namespace>] [<database>] [<broker>]
./k8s/use-mk-docker.sh [<namespace>] [<database>] [<broker>]
./k8s/use-mk-kvm2.sh [<namespace>] [<database>] [<broker>]
./k8s/use-mk.sh <driver> [<namespace>] [<database>] [<broker>] (1)
./k8s/use-tmc.sh <cluster-name> [<namespace>] [<database>] [<broker>]
./k8s/use-gke.sh <cluster-name> [<namespace>] [<database>] [<broker>]
| 1 | <driver> 必须是 kvm2、docker、vmware、virtualbox、vmwarefusion 或 hyperkit 中的一个。docker 是本地开发的推荐选项。 |
如果未提供 <namespace>,则其值将为 default。默认的 <database> 是 postgresql,默认的 <broker> 是 kafka。 |
由于这些脚本会导出环境变量,因此需要按照以下示例的方式执行:
source ./k8s/use-mk-docker.sh postgresql rabbitmq --namespace test-ns
创建本地集群。
以下脚本将创建本地集群。
# Optionally add to control cpu and memory allocation.
export MK_ARGS="--cpus=8 --memory=12g"
./k8s/configure-k8s.sh
-
对于 kind,请按照说明更新
./k8s/yaml/metallb-configmap.yaml文件,然后使用kubectl apply -f ./k8s/yaml/metallb-configmap.yaml命令进行应用。 -
对于 minikube,请启动一个新的 shell 并执行
minikube tunnel
部署 Spring Cloud Data Flow。
use-* 脚本将配置 BROKER 和 DATABASE 的值。
配置数据库
export DATABASE=<database> (1)
| 1 | <database> 可选值为 mariadb 或 postgresql |
需要配置 Docker 凭据,以便 Kubernetes 能够拉取各种容器镜像。
对于 Docker Hub,您可以创建一个个人免费账户,并使用个人访问Tokens作为密码。
使用 ./k8s/docker-login.sh 测试您的 Docker 登录
export DOCKER_SERVER=https://docker.io
export DOCKER_USER=<docker-userid>
export DOCKER_PASSWORD=<docker-password>
export DOCKER_EMAIL=<email-of-docker-use>
设置 Spring Cloud Data Flow 和 Skipper 的版本。
此示例展示了当前开发快照的版本。
export DATAFLOW_VERSION=2.11.5-SNAPSHOT
export SKIPPER_VERSION=2.11.5-SNAPSHOT
在安装 SCDF 之前,您需要先拉取以下镜像,以确保它们已准备好上传到 Kubernetes 集群。
你可以在 pull-app-images 和 install-scdf 之前进行配置:
-
STREAM_APPS_RT_VERSIONStream Apps 发布列车版本。默认值为 2022.0.0。 -
STREAM_APPS_VERSIONStream Apps 版本。默认值为 4.0.0。
使用:
./images/pull-app-images.sh
./images/pull-dataflow.sh
./images/pull-skipper.sh
./images/pull-composed-task-runner.sh
./k8s/install-scdf.sh
source ./k8s/export-dataflow-ip.sh
你现在可以从 ./shell 目录执行脚本来部署一些简单的流(streams)和任务(tasks)。你也可以运行 ./shell/shell.sh 来启动 Spring Cloud Data Flow Shell。 |
如果你想从头开始,可以使用以下命令删除 SCDF 部署,然后运行 ./k8s/install-scdf.sh 重新安装。
B.5.5. 工具类
以下实用工具列表可能会有所帮助。
| 姓名 | 描述 |
|---|---|
k9s 是一个基于文本的监控工具,用于探索 Kubernetes 集群。 |
|
根据不同的命名条件,额外输出并实时跟踪各种 Pod 的日志。 |
B.5.6. 脚本
部分脚本也适用于本地容器,可在 src/local 中找到;特定于 Kubernetes 的脚本位于 deploy/k8s。
| 脚本 | 描述 |
|---|---|
|
构建餐厅示例流应用的所有镜像 |
|
从 Docker Hub 拉取 Restaurant Sample Stream Apps 的所有镜像 |
|
根据 |
|
根据 |
|
从 DockerHub 拉取基于 |
|
从 Dataflow 的本地仓库构建一个 Docker 镜像 |
|
从 Dataflow Pro 的本地仓库构建一个 Docker 镜像。在环境中设置 |
|
从 Skipper 的本地仓库构建一个 Docker 镜像。 |
|
根据您对 K8S_DRIVER 的配置来设置 Kubernetes 环境。 |
|
删除该部署所创建的所有 Kubernetes 资源。 |
|
删除 cluster、kind 或 minikube。 |
|
将数据流服务器的 URL 导出为 |
|
通过名称导出指定流的 HTTP 源 URL 到 |
|
配置并部署 Spring Cloud Data Flow 的所有容器 |
|
将测试所需的所有容器镜像加载到 kind 或 minikube 中,以确保你能够控制所使用的内容。 |
|
将指定的容器镜像加载到本地的 kind 或 minikube 中。 |
|
对 |
|
注册单元测试所使用的任务(Task)和流(Stream)应用。 |
| 请报告脚本中的任何错误,并附上相关环境的详细信息。 |
B.6. 常见问题
在本节中,我们将回顾 Spring Cloud Data Flow 的常见问题。 更多信息请参见微网站的常见问题部分。
附录 C:身份提供商
本附录包含有关如何设置特定提供商以与 Data Flow 安全功能协同工作的信息。
截至本文撰写时,Azure 是唯一的身份提供商。
C.1. Azure
Azure AD(Active Directory)是一个功能完备的身份提供商,提供丰富的身份验证和授权相关功能。与其他任何提供商一样,它也有其自身的细微差别,因此在配置时需要格外注意。
在本节中,我们将介绍如何为 AD 和 Spring Cloud Data Flow 进行 OAuth2 配置。
| 您需要完整的组织访问权限才能正确完成所有设置。 |
C.1.1. 创建新的 AD 环境
首先,创建一个新的 Active Directory 环境。选择类型为 Azure Active Directory(不是 B2C 类型),然后选择您的组织名称和初始域名。下图显示了相关设置:
C.1.2. 创建新的应用注册
应用注册是创建 OAuth 客户端以供 OAuth 应用程序使用的地方。至少需要创建两个客户端:一个用于 Data Flow 和 Skipper 服务器,另一个用于 Data Flow Shell,因为这两者的配置略有不同。服务器应用程序可被视为受信任的应用程序,而 Shell 则不受信任(因为用户可以看到其完整配置)。
注意: 我们建议在 Data Flow 和 Skipper 服务器上使用相同的 OAuth 客户端。虽然您可以使用不同的客户端,但目前这样做不会带来任何优势,因为配置必须保持一致。
下图显示了用于创建新应用注册的设置:
在需要时,客户端密钥可在 AD 中的 Certificates & secrets 下创建。 |
C.1.3. 暴露 Dataflow API
为了准备 OAuth 范围(scopes),请为每个 Data Flow 安全角色创建一个。在此示例中,这些范围将是
-
api://dataflow-server/dataflow.create -
api://dataflow-server/dataflow.deploy -
api://dataflow-server/dataflow.destroy -
api://dataflow-server/dataflow.manage -
api://dataflow-server/dataflow.schedule -
api://dataflow-server/dataflow.modify -
api://dataflow-server/dataflow.view
下图展示了要暴露的 API:
如以下图片所示,先前创建的作用域需要作为 API 权限添加:
C.1.4. 创建特权客户端
对于即将使用密码授权模式的 OAuth 客户端,需要为其创建与服务器相同的 API 权限(如前一节所述)。
| 所有这些权限都需要以管理员权限授予。 |
下图显示了特权设置:
| 特权客户端需要一个客户端密钥(client secret),当在命令行中使用时,该密钥需要暴露在客户端配置中。如果您不希望暴露该密钥,请使用创建公共客户端中的公共客户端。 |
C.1.6. 配置示例
本节包含 Data Flow 服务器、Skipper 服务器和 Shell 的配置示例。
启动一个 Data Flow 服务器:
$ java -jar spring-cloud-dataflow-server.jar \
--spring.config.additional-location=dataflow-azure.yml
spring:
cloud:
dataflow:
security:
authorization:
provider-role-mappings:
dataflow-server:
map-oauth-scopes: true
role-mappings:
ROLE_VIEW: dataflow.view
ROLE_CREATE: dataflow.create
ROLE_MANAGE: dataflow.manage
ROLE_DEPLOY: dataflow.deploy
ROLE_DESTROY: dataflow.destroy
ROLE_MODIFY: dataflow.modify
ROLE_SCHEDULE: dataflow.schedule
security:
oauth2:
client:
registration:
dataflow-server:
provider: azure
redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
client-id: <client id>
client-secret: <client secret>
scope:
- openid
- profile
- email
- offline_access
- api://dataflow-server/dataflow.view
- api://dataflow-server/dataflow.deploy
- api://dataflow-server/dataflow.destroy
- api://dataflow-server/dataflow.manage
- api://dataflow-server/dataflow.modify
- api://dataflow-server/dataflow.schedule
- api://dataflow-server/dataflow.create
provider:
azure:
issuer-uri: https://login.microsoftonline.com/799dcfde-b9e3-4dfc-ac25-659b326e0bcd/v2.0
user-name-attribute: name
resourceserver:
jwt:
jwk-set-uri: https://login.microsoftonline.com/799dcfde-b9e3-4dfc-ac25-659b326e0bcd/discovery/v2.0/keys
启动一个 Skipper 服务器:
$ java -jar spring-cloud-skipper-server.jar \
--spring.config.additional-location=skipper-azure.yml
spring:
cloud:
skipper:
security:
authorization:
provider-role-mappings:
skipper-server:
map-oauth-scopes: true
role-mappings:
ROLE_VIEW: dataflow.view
ROLE_CREATE: dataflow.create
ROLE_MANAGE: dataflow.manage
ROLE_DEPLOY: dataflow.deploy
ROLE_DESTROY: dataflow.destroy
ROLE_MODIFY: dataflow.modify
ROLE_SCHEDULE: dataflow.schedule
security:
oauth2:
client:
registration:
skipper-server:
provider: azure
redirect-uri: '{baseUrl}/login/oauth2/code/{registrationId}'
client-id: <client id>
client-secret: <client secret>
scope:
- openid
- profile
- email
- offline_access
- api://dataflow-server/dataflow.view
- api://dataflow-server/dataflow.deploy
- api://dataflow-server/dataflow.destroy
- api://dataflow-server/dataflow.manage
- api://dataflow-server/dataflow.modify
- api://dataflow-server/dataflow.schedule
- api://dataflow-server/dataflow.create
provider:
azure:
issuer-uri: https://login.microsoftonline.com/799dcfde-b9e3-4dfc-ac25-659b326e0bcd/v2.0
user-name-attribute: name
resourceserver:
jwt:
jwk-set-uri: https://login.microsoftonline.com/799dcfde-b9e3-4dfc-ac25-659b326e0bcd/discovery/v2.0/keys
启动一个 shell,并(可选地)以选项形式传递凭据:
$ java -jar spring-cloud-dataflow-shell.jar \
--spring.config.additional-location=dataflow-azure-shell.yml \
--dataflow.username=<USERNAME> \
--dataflow.password=<PASSWORD>
security:
oauth2:
client:
registration:
dataflow-shell:
provider: azure
client-id: <client id>
client-secret: <client secret>
authorization-grant-type: password
scope:
- offline_access
- api://dataflow-server/dataflow.create
- api://dataflow-server/dataflow.deploy
- api://dataflow-server/dataflow.destroy
- api://dataflow-server/dataflow.manage
- api://dataflow-server/dataflow.modify
- api://dataflow-server/dataflow.schedule
- api://dataflow-server/dataflow.view
provider:
azure:
issuer-uri: https://login.microsoftonline.com/799dcfde-b9e3-4dfc-ac25-659b326e0bcd/v2.0
公共客户端需要配置应用角色(App Roles),其值需与内部权限 [dataflow.create, dataflow.deploy, dataflow.destroy, dataflow.manage, dataflow.modify, dataflow.schedule, dataflow.view] 保持一致,以确保这些权限被添加到访问Tokens中。 |
启动一个公共 shell,并(可选地)将凭据作为选项传递:
$ java -jar spring-cloud-dataflow-shell.jar \
--spring.config.additional-location=dataflow-azure-shell-public.yml \
--dataflow.username=<USERNAME> \
--dataflow.password=<PASSWORD>
spring:
security:
oauth2:
client:
registration:
dataflow-shell:
provider: azure
client-id: <client id>
authorization-grant-type: password
client-authentication-method: post
scope:
- offline_access
- api://dataflow-server/dataflow.create
- api://dataflow-server/dataflow.deploy
- api://dataflow-server/dataflow.destroy
- api://dataflow-server/dataflow.manage
- api://dataflow-server/dataflow.modify
- api://dataflow-server/dataflow.schedule
- api://dataflow-server/dataflow.view
provider:
azure:
issuer-uri: https://login.microsoftonline.com/799dcfde-b9e3-4dfc-ac25-659b326e0bcd/v2.0