Spring-Cloud-Data-Flow-入门手册-2服务器配置

重要说明:本方是翻译自https://docs.spring.io/spring-cloud-dataflow/docs/1.3.0.M2/reference/htmlsingle/#getting-started这个文章,感谢Sabby AnandanMarius BogoeviciEric

BottardMark FisherIlayaperumal GopinathanGunnar HillertMark PollackPatrick

PeraltaGlenn RenfroThomas RisbergDave SyerDavid TuranskiJanne ValkealahtiOleg

Zhurakousky这些原文作者的写作成果,让我们能更好地入门学习Spring Cloud Data Flow的相关技术,考虑到国内中文的文档资料比较欠缺,而且基本不太成体系,所以自己希望来翻译该文章,方便学习使用。

以下是原文内容的翻译,一些关键性的技术术语,本文考虑不进行翻译,保持原来的英文词汇,加强技术术语印象,而且这些技术术语强行翻译成中文的话,感觉很别扭。另一方面水平有限,文本可能有翻译不太贴切或是错误的地方,还请大家体谅,看到后多多指正。

目录

服务器配置... 2

12.功能启用/禁用... 2

13. 数据库配置... 2

13.1. 添加自定义JDBC驱动... 4

14. 安全性... 4

14.1. 启用HTTPS.. 5

14.2. 传统认证... 7

14.3. OAuth 2.0. 16

14.4. 配置Spring Boot管理端点的安全性... 19

15. 监控和管理... 20

15.1. Spring Boot 管理... 20

15.2. 监控部署的应用程序... 21

15.3. 日志和DataDog 指标器(MetricWriter). 25

********************************以下是原文内容的翻译**********************

Version 1.3.0.M2

© 2012-2017 Pivotal Software, Inc.

你可以自己使用这个文章或是分发给其它人,但前提是你不以赚取费用为目标,同时每个转发的文章必须包含此版权通知,无论是印刷品版本还是电子发行版本。

服务器配置

在本节中,您将学习如何配置Spring

Cloud Data Flow服务器的功能,如关系型数据库的使用和安全性配置。您还将学习如何配置Spring

Cloud Data Flow的Shell命令行工具的功能。

12.功能启用/禁用

数据流服务器提供了一组特定功能,可以在启动时启用/禁用这些功能特性。这些特性包括全生命周期的操作、REST接口风格的端点(服务器、基于shell或UI的客户端 ):

1. Streams

2. Tasks

3. 分析

在启动数据流服务器时,可以通过设置以下布尔属性来启用、禁用这些特性:

·spring.cloud.dataflow.features.streams-enabled

·spring.cloud.dataflow.features.tasks-enabled

·spring.cloud.dataflow.features.analytics-enabled

默认情况下,所有功能都会启用。注意:由于分析功能是默认启用的,所以数据流服务器需要有一个redis存储作为数据分析库,我们提供一个默认的基于Redis的分析功能实现类。这也意味着数据流服务器的健康状态取决于redis存储的可用性。如果你不想启用HTTP端点来读取Redis库里的那些数据,可以使用上边的属性配置来禁用分析功能。

REST风格的端点,提供了的功能启用/禁用的状态信息。

13. 数据库配置

关系数据库用于存储stream和task的定义以及task的执行状态。Spring Cloud Data Flow为H2,HSQLDB,MySQL,Oracle,DB2,SQL Server,PostgreSQL提供了相应的数据架构,在服务器启动时将会自动创建相应的数据库和表结构。Spring

Cloud Data Flow本身提供了H2数据库的嵌入式实例,可以直接在开发环境当中使用,但不推荐用于生产环境。

MySQL(使用MariaDB的驱动) ,HSQLDB, PostgreSQL 的JDBC驱动程序, 和嵌入式 H2一样,也是开箱即用的,平台本身已经自带相应的驱动。如果你正在使用其他的数据库,那么相应的JDBC驱动程序JAR包需要存放在服务器的对应classpath里。

数据库属性可以作为环境变量或命令行参数传递给数据流服务器。

· 环境变量:

export spring_datasource_url=jdbc:postgresql://localhost:5432/mydbexport spring_datasource_username=myuserexport spring_datasource_password=mypassexport spring_datasource_driver-class-name="org.postgresql.Driver"

如果你使用的是MySQL,命令行参数是:

java -jar spring-cloud-dataflow-server-local/target/spring-cloud-dataflow-server-local-1.0.0.BUILD-SNAPSHOT.jar \  --spring.datasource.url=jdbc:mysql: \  --spring.datasource.username= \  --spring.datasource.password= \--spring.datasource.driver-class-name=org.mariadb.jdbc.Driver &

如果你使用的是PostgreSQL,命令行参数是:

java -jar spring-cloud-dataflow-server-local/target/spring-cloud-dataflow-server-local-1.0.0.BUILD-SNAPSHOT.jar \  --spring.datasource.url=jdbc:postgresql: \  --spring.datasource.username= \  --spring.datasource.password= \  --spring.datasource.driver-class-name=org.postgresql.Driver &

如果你使用的是HSQLDB,命令行参数是:

java -jar spring-cloud-dataflow-server-local/target/spring-cloud-dataflow-server-local-1.0.0.BUILD-SNAPSHOT.jar \  --spring.datasource.url=jdbc:hsqldb: \  --spring.datasource.username=SA \--spring.datasource.driver-class-name=org.hsqldb.jdbc.JDBCDriver &

数据存储升级版 1.0.x 到 1.1.X的时候,需要升级新的数据架构到Spring Cloud Data Flow,具体数据库类型的迁移脚本的可以在相应的位置找到。如果你想使用一个外部的H2数据库实例而不是一个嵌入式的,设置Spring Cloud Data

Flow的spring.dataflow.embedded.database.enabled 属性为false。如果spring.dataflow.embedded.database.enabled 属性为false或者指定了其他数据库类型作为数据源,那么h2嵌入式数据库是不会启用的。

13.1. 添加自定义JDBC驱动

为数据库添加自定义驱动程序,如Oracle,建议您重新编译数据流服务器,在Maven的POM.XML文件中添加依赖。每个目标平台都有Spring Cloud Data Flow服务器的对应版本,您需要针对每个平台修改相应版本的 POM.XML文件。在每个GitHub库中有每个服务器版本对应的标签。

为本地服务器添加自定义JDBC驱动的依赖JAR包:

1. 选择你需要重新编译的对应服务器版本的标签,在 GitHub库里进行克隆。

2. 编辑spring-cloud-dataflow-server-local/pom.xml文件,在dependencies部分添加数据库驱动程序所需的的依赖。在下面的示例中,选定了Oracle驱动程序。

...   com.oracle.jdbc  ojdbc8  12.2.0.1 ...

3. 重新编译Spring

Cloud Data Flow,具体内容查看:

https://docs.spring.io/spring-cloud-dataflow/docs/1.3.0.M2/reference/htmlsingle/#building

在重新编译Spring

Cloud Data Flow的时候,可以通过设置 dataflow-server.yml文件中的属性,给相应的版本设置属性的默认值。

如,像下边这样来设置postgres这个属性的默认值:

· dataflow-server.yml

spring: datasource:  url: jdbc:postgresql://localhost:5432/mydb  username: myuser  password: mypass  driver-class-name:org.postgresql.Driver

14. 安全性

默认情况下,数据流服务器是不安全的,运行在一个未加密的HTTP连接上。通过启用HTTPS并要求客户端使用以下两种身份验证,您可以确保REST端点以及数据流仪表板的安全性:

· OAuth 2.0认证

· 传统认证方式 (如 Basic 认证)

认证选项

当选择 传统认证,Spring Cloud Data Flow服务器将成为主要的认证点,使用Spring

Security作为基础。当选择此选项时,用户需要进一步定义他们首选的认证机制,选择所需的后台认证存储:

· 单用户认证,https://docs.spring.io/spring-cloud-dataflow/docs/1.3.0.M2/reference/htmlsingle/#configuration-security-single-user-authentication

· LPAD认证,https://docs.spring.io/spring-cloud-dataflow/docs/1.3.0.M2/reference/htmlsingle/#configuration-security-ldap-authentication

· 基于文件认证,https://docs.spring.io/spring-cloud-dataflow/docs/1.3.0.M2/reference/htmlsingle/#configuration-security-file-based-authentication

传统认证 或 oauth2之间进行选择的时候,记住这两个选项是互斥的。请看下面的子章节进行更详细的讨论。

默认情况下,REST端点(用于管理和状态查看)以及仪表板UI不需要经过身份验证就可以访问。

14.1. 启用HTTPS

默认情况下,仪表板,管理,和状态端点使用HTTP作为传输协议。你可以很容易地将他们切换到HTTPS,在 application.yml配置文件中添加证书。

server: port: 8443                                          ssl:  key-alias: yourKeyAlias                            key-store: path/to/keystore                        key-store-password: yourKeyStorePassword            key-password: yourKeyPassword                      trust-store: path/to/trust-store                trust-store-password: yourTrustStorePassword

默认端口是 9393,你可以修改端口为更常见的HTTPS典型端口。

如果启用了HTTPS,它将完全替代HTTP作为REST端点和数据流仪表板交互的协议。普通HTTP请求将失败。因此,请确保您相应地启用了shell命令行。

14.1.1. 使用自签名证书

为了测试目的或在开发阶段,创建自签名证书很方便。请执行以下命令来创建证书:

$ keytool -genkey -alias dataflow -keyalg RSA -keystore dataflow.keystore \        -validity 3650 -storetype JKS \        -dname "CN=localhost, OU=Spring, O=Pivotal, L=Kailua-Kona, ST=HI, C=US"          -keypass dataflow -storepass dataflow

cn 是这里唯一重要的参数,它是使用的域名,如 localhost。

然后添加以下内容到你 的application.yml文件里:

server: port: 8443 ssl:  enabled: true  key-alias: dataflow  key-store: "/your/path/to/dataflow.keystore"  key-store-type: jks  key-store-password: dataflow  key-password: dataflow

这是数据流服务器所需要的配置。一旦你启动服务器,你应该能够访问https://localhost:8443/。由于这是一个自签名证书,您将在浏览器中看到一个警告,需要忽略它。

14.1.2. 自签名证书和Shell

默认情况下,自签名证书会影响shell的正常使用,需要额外的配置步骤来使shell可以结合自签名证书工作。有两种方法可以实现:

1.添加自签名证书到JVM的信任库中

2.跳过证书验证

添加自签名证书到JVM的信任库

我们需要从密钥库导出以前创建的证书:

$ keytool -export -alias dataflow -keystore dataflow.keystore -file dataflow_cert -storepass dataflow

接下来,我们需要创建一个shell使用的密钥库:

$ keytool -importcert -keystore dataflow.truststore -alias dataflow -storepass dataflow -file dataflow_cert -noprompt

现在你可以使用以下的命令行来启动Data Flow的shell:

$ java -Djavax.net.ssl.trustStorePassword=dataflow \      -Djavax.net.ssl.trustStore=/path/to/dataflow.truststore \      -Djavax.net.ssl.trustStoreType=jks \      -jar spring-cloud-dataflow-shell-1.3.0.M2.jar

In case you run into

trouble establishing a connection via SSL, you can enable additional logging

by using and setting thejavax.net.debugJVM

argument tossl.

不要忘记设置目标服务器的正确URL:

dataflow:> dataflow config server https://localhost:8443/

跳过证书验证或者,你也可以通过提供可选的命令行参数--dataflow.skip-ssl-validation=true来跳过验证 。

使用此命令行参数后,shell将接受任何(自签名)SSL证书。

如果可能的话,你应该避免使用此选项。禁用信任管理器会就失去了SSL的意义,并容易受到攻击。

14.2. 传统认证

当使用 传统认证时, Spring Cloud Data Flow将是唯一的身份验证提供程序。在这种情况下,数据流的REST API用户会使用 基本认证来访问端点。

使用该选项时,用户可以选择3种后备存储来完成认证:

•单用户认证 ,使用Spring Boot的属性

•基于YAML文件的多用户认证

•LDAP认证

14.2.1. 单用户认证

这是最简单的选项,模拟了默认的Spring Boot用户体验行为。它可以通过添加以下属性到应用程序的application.yml文件或环境变量来启用:

security: basic:  enabled: true                                                        realm: Spring Cloud Data Flow

启用基本身份验证。必须将安全属性设置为true。

(可选)基本身份验证领域将默认 为Spring ,如果没有设置的话。

在当前案例中,Spring Boot启动时会自动创建一个用户叫 “user”并自动生成密码,这些信息会被打印到控制台上。

采用这个配置所产生的用户,将分配所有主要的角色权限:

· VIEW

· CREATE

· MANAGE

默认的Spring Boot用户凭证

你可以使用以下属性来自定义用户的相关信息:

security.user.name=user # Default user name.security.user.password= # Password for the default user name. A random password is logged on startup by default.security.user.role=VIEW, CREATE, MANAGE # Granted roles for the default user name.

请注意基本身份验证本身固有的问题,由于凭据被浏览器缓存,浏览网页进行回退到应用程序的页面,你会自动登录进入系统。

当然,您也可以使用系统属性、环境变量或命令行参数传递认证信息,这些都是Spring Boot支持的标准方法。例如,在下面的示例中,使用命令行参数来指定用户凭据:

$ java -jar spring-cloud-dataflow-server-local-1.3.0.M2.jar\  --security.basic.enabled=true \  --security.user.name=test \  --security.user.password=pass \  --security.user.role=VIEW

如果你需要定义多个基于文件的用户帐号,请看看基于文件的认证。

14.2.2. 基于文件的认证

默认情况下,Spring Boot只允许设置一个用户。Spring Cloud Data Flow还支持在配置文件中设置多个用户。如下所述,每个用户必须指定一个密码,一个或多个角色:

security: basic:  enabled: true  realm: Spring Cloud Data Flowspring: cloud:  dataflow:    security:      authentication:        file:          enabled: true                                                            users:                                                                    bob: bobspassword, ROLE_MANAGE                                          alice: alicepwd, ROLE_VIEW, ROLE_CREATE

14.2.3. LDAP认证

Spring Cloud Data Flow还支持使用LDAP服务器(轻量级目录访问协议)的身份验证,支持以下2种模式:

•直接绑定

•搜索和绑定

当LDAP身份验证选项被激活时,默认的单用户认证模式将被关闭。

在采用直接绑定模式时,认证模式是使用用户定义的可分辨名称(DN),它是使用占位符的用户名。身份验证过程通过替换占位符派生出用户的专有名称,并使用它在LDAP服务器上进行用户身份验证,同时提供所需要的密码。您可以设置LDAP直接绑定如下:

security: basic:  enabled: true  realm: Spring Cloud Data Flowspring: cloud:  dataflow:    security:      authentication:        ldap:          enabled: true                                                            url: ldap://ldap.example.com:3309                                        userDnPattern: uid={0},ou=people,dc=example,dc=com

采用搜索绑定 模式时,先以匿名方式或一个固定的账户连接到LDAP服务器,然后基于用户名的标识来寻找认证用户,然后使用查找到的用户名和相应的密码绑定到LDAP服务器。此选项配置如下:

security: basic:  enabled: true  realm: Spring Cloud Data Flowspring: cloud:  dataflow:    security:      authentication:        ldap:          enabled: true                                                            url: ldap://localhost:10389                                              managerDn: uid=admin,ou=system                                          managerPassword: secret                                                  userSearchBase: ou=otherpeople,dc=example,dc=com                        userSearchFilter: uid={0}

LDAP 传输安全

当连接到LDAP服务器时,通常(在LDAP的环境中)有2个选项,可以支持建立到LDAP服务器的安全连接:

· LDAP over SSL (LDAPs)

· Start Transport Layer Security (Start TLS)

Spring Cloud Data Flow 1.1.0只默认直接支持LDAPs,其它的需要单独配置。使用官方证书时,不需要特殊的配置,为了通过LDAPS连接到LDAP服务器,只需改变URL的格式,采用 LDAPS格式即可,例如ldaps://localhost:636。

在使用自签名证书的情况下,Spring

Cloud Data Flow服务器的设置变得稍微复杂一些。相应的配置与 Spring

Cloud Data Flow服务器使用自签名证书配置非常相似,也就是Spring

Cloud Data Flow需要基于一个trustStore才能正常运行 。

这样的配置适合在开发和测试期间使用,但请不要在生产中使用自签名证书,不然信任问题不少。

最后,还必须提供一套关于trustStore的配置参数与凭据来启动服务器:

$ java -Djavax.net.ssl.trustStorePassword=dataflow \      -Djavax.net.ssl.trustStore=/path/to/dataflow.truststore \      -Djavax.net.ssl.trustStoreType=jks \      -jar spring-cloud-starter-dataflow-server-local-1.3.0.M2.jar

正如上面提到的,另一个连接LDAP服务器的安全选项是通过StartTLS。虽然Start TLS受到更多人的青睐,以至于LDAPs技术被认为是重复,没必要的 。然而StartTLS目前并不是Spring Cloud Data Flow能直接支持的。至于如何配置的问题,还需要去查看相关的资料。

14.2.4.

Shell 认证

当使用Shell认证的时候,你可以直接在命令行参数当中直接提供相应的用户名与密码:

$ java -jar target/spring-cloud-dataflow-shell-1.3.0.M2.jar  \ --dataflow.username=myuser                                          \    --dataflow.password=mysecret

如果开启了认证,那么用户名是必须要提供的,如果没有提供相应的密码,那么控制台会进行提示,需要你输入相应的密码。

你可以在使用shell时直接指定相应的Data Flow服务器:

server-unknown:>dataflow config server --uri  http://localhost:9393                                        \    --username myuser                                                  \    --password mysecret                                                \    --skip-ssl-validation  true                                        \

14.2.5. 自定义授权

除了上边所讲的关于认证的配置外,也可以配置自定义授权,确定什么角色可以做什么。

默认的方案使用三个角色来保护Spring

Cloud Data Flow暴露的REST风格的端点:

·ROLE_VIEW:查看系统各种状态

·ROLE_CREATE:创建,删除或是修改系统的状态

·ROLE_MANAGE:启动与管理端点

所有这些默认值都是在dataflow-server-defaults.yml文件里设置的,这配置也是Spring

Cloud Data Flow的核心模块。如果有需要的话,你也可以在 application.yml文件里重写这些配置。这些配置采用了YAML 列表的形式 (一些规则可能优先于其他的),所以你需要复制/粘贴整个列表来定制你的需求(没有办法合并列表)。默认的规则是这样的:

spring: cloud:  dataflow:    security:      authorization:        enabled: true        rules:          # Metrics          - GET    /metrics/streams                => hasRole('ROLE_VIEW')          # About          - GET    /about                          => hasRole('ROLE_VIEW')          # Metrics          - GET    /metrics/**                    => hasRole('ROLE_VIEW')          - DELETE /metrics/**                    => hasRole('ROLE_CREATE')          # Boot Endpoints          - GET    /management/**                  => hasRole('ROLE_MANAGE')          # Apps          - GET    /apps                          => hasRole('ROLE_VIEW')          - GET    /apps/**                        => hasRole('ROLE_VIEW')          - DELETE /apps/**                        => hasRole('ROLE_CREATE')          - POST  /apps                          => hasRole('ROLE_CREATE')          - POST  /apps/**                        => hasRole('ROLE_CREATE')          # Completions          - GET /completions/**                    => hasRole('ROLE_CREATE')          # Job Executions & Batch Job Execution Steps && Job Step Execution Progress          - GET    /jobs/executions                => hasRole('ROLE_VIEW')          - PUT    /jobs/executions/**            => hasRole('ROLE_CREATE')          - GET    /jobs/executions/**            => hasRole('ROLE_VIEW')          # Batch Job Instances          - GET    /jobs/instances                => hasRole('ROLE_VIEW')          - GET    /jobs/instances/*              => hasRole('ROLE_VIEW')          # Running Applications          - GET    /runtime/apps                  => hasRole('ROLE_VIEW')          - GET    /runtime/apps/**                => hasRole('ROLE_VIEW')          # Stream Definitions          - GET    /streams/definitions            => hasRole('ROLE_VIEW')          - GET    /streams/definitions/*          => hasRole('ROLE_VIEW')          - GET    /streams/definitions/*/related  => hasRole('ROLE_VIEW')          - POST  /streams/definitions            => hasRole('ROLE_CREATE')          - DELETE /streams/definitions/*          => hasRole('ROLE_CREATE')          - DELETE /streams/definitions            => hasRole('ROLE_CREATE')          # Stream Deployments          - DELETE /streams/deployments/*          => hasRole('ROLE_CREATE')          - DELETE /streams/deployments            => hasRole('ROLE_CREATE')          - POST  /streams/deployments/*          => hasRole('ROLE_CREATE')          # Task Definitions          - POST  /tasks/definitions              => hasRole('ROLE_CREATE')          - DELETE /tasks/definitions/*            => hasRole('ROLE_CREATE')          - GET    /tasks/definitions              => hasRole('ROLE_VIEW')          - GET    /tasks/definitions/*            => hasRole('ROLE_VIEW')          # Task Executions          - GET    /tasks/executions              => hasRole('ROLE_VIEW')          - GET    /tasks/executions/*            => hasRole('ROLE_VIEW')          - POST  /tasks/executions              => hasRole('ROLE_CREATE')          - DELETE /tasks/executions/*            => hasRole('ROLE_CREATE')

每一行的格式是这样的:

HTTP_METHOD URL_PATTERN '=>' SECURITY_ATTRIBUTE

· HTTP_METHOD: http的请求方式, 大写

· URL_PATTERN :Ant 风格的URL

· SECURITY_ATTRIBUTE: SpEL表达式

· 这些元素都需要用空格键, tab键这样的空白符来进行分隔。

注意,这是一个YAML列表而不是spring.cloud.dataflow.security.authorization.rules下的键值对映射(因此第一行使用“-”线开始 ) 。

如果你仅仅是希望控制认证,而不想管理授权,那么可以设置每个用户就可以访问所有的端点,那么可以这样设置spring.cloud.dataflow.security.authorization.enabled=false。

如果安全属性使用的是基本认证,那么为用户设置角色是很必要的。

例如,

java -jar spring-cloud-dataflow-server-local/target/spring-cloud-dataflow-server-local-1.3.0.M2.jar \  --security.basic.enabled=true \  --security.user.name=test \  --security.user.password=pass \  --security.user.role=VIEW

14.2.6. 授权 - Shell 和仪表板的行为特性

授权启用后,仪表板 和 shell 将根据用户所分配的角色而给用户看到和使用不同的功用。

如果用户没有相应的角色,shell命令将被标记为不可使用。

如果用户没有相应的角色授权,那么仪表板的用户界面将不显示对应的页面或者页面元素 。

14.2.7. 基于Ldap授权

当配置LDAP来进行身份验证时,可以同时配置group-role-attribute,group-search-base和group-search-filter。

在没有特别指定的情况下,group role这个属性包含了角色的名字。role_manage是默认角色。

如需进一步信息,请查看Spring

Security 的LDAP服务器 参考指南。

14.3. OAuth 2.0

OAuth 2 允许可以将Spring

Cloud Data Flow集成到单一登录(SSO)的环境当中。以下3 种oauth2授权模式可以供使用:

•授权码:用于图形用户界面(浏览器)的整合。你将被重定向到OAuth认证服务。

•密码 :shell会使用到,你可以使用用户名和密码登录。

•客户端凭据: 直接从OAuth提供者获取访问令牌,通过使用AuthorizationHTTP

header 发送到数据流服务器。

REST风格的端点可以使用2种方式访问:

•基本认证,使用 密码授权类型,基于 OAuth2服务来认证。

•访问令牌,使用 客户端证书授权类型

在设置身份验证时,强烈建议启用HTTPS,尤其是在生产环境中。

你可以通过在application.yml配置文件或是通过环境变量来打开oauth2认证:

security: oauth2:  client:    client-id: myclient                                                  client-secret: mysecret    access-token-uri: http://127.0.0.1:9999/oauth/token    user-authorization-uri: http://127.0.0.1:9999/oauth/authorize  resource:    user-info-uri: http://127.0.0.1:9999/me

在OAuth的配置节中设置了Client Id这个属性,将会使系统启用OAuth2的安全认证。

你可以用curl来验证基本认证是否正常启用:

$ curl -u myusername:mypassword http://localhost:9393/

返回的结果应该是可以使用的REST风格的端点列表。

除了基本身份验证外,还可以提供访问令牌以访问REST API。可以从oauth2提供者检索oauth2访问令牌,然后通过访问令牌API使用AuthorizationHttp header发送给服务器:

$ curl -H "Authorization: Bearer " http://localhost:9393/

14.3.1.

OAuth REST 端点的授权

oauth2认证选项使用的授权规则与 传统认证 选项的一样。

授权规则在dataflow-server-defaults.yml文件当中。

由于安全角色的定义是与具体的环境相关联的,Spring

Cloud Data Flow

默认情况下会将所有角色赋与oauth2认证的用户,框架使用的授权对应类是DefaultDataflowAuthoritiesExtractor。

系统可以自定义行为特征,这需要提供自己的Spring bean来扩展Spring Security的基于OAuth的AuthoritiesExtractor接口。在这种情况下,自定义bean定义优先于Spring Cloud Data Flow提供的。

14.3.2. 使用shell的OAuth

认证

如果OAuth2提供者提供了密码授权类型,那么可以用下边的方式来启动shell:

$ java -jar spring-cloud-dataflow-shell-1.3.0.M2.jar \ --dataflow.uri=http://localhost:9393 \ --dataflow.username=my_username --dataflow.password=my_password

记住,当Spring Cloud Data Flow的认证启用后,oauth2提供者 必须 支持 密码授权类型,不然就没法使用shell了。

在shell当中,还可以使用以下的方式来提供使用证书:

dataflow config server --uri http://localhost:9393 --username my_username --password my_password

运行成功的话,你会看到下边的输出:

dataflow:>dataflow config infodataflow config info╔═══════════╤═══════════════════════════════════════╗║Credentials│[username='my_username, password=****']║╠═══════════╪═══════════════════════════════════════╣║Result    │                                      ║║Target    │http://localhost:9393                  ║╚═══════════╧═══════════════════════════════════════╝

14.3.3. OAuth2

认证示例

Local OAuth2

Server

使用SpringSecurity OAuth的两个简单注解属性,可以很容易地建立OAuth2 的服务器:

· @EnableResourceServer

· @EnableAuthorizationServer

下边的URL链接内容是一个相应的示例:

https://github.com/ghillert/oauth-test-server/

签出这个代码,编译好后运行起来,同时可以把Client Id和Client

Secret

配置到Spring Cloud Data Flow里 。

使用GitHub进行认证

如果你想使用一个现成的oauth2提供商,这里有一个基于GitHub的例子。首先你需要在你的Github帐号下新建一个应用 ,地址如下:

https://github.com/settings/developers

当你在本地机器运行Spring Cloud Data Flow的时候,GitHub的配置类似下面这样:

GitHub上注册应用程序

在Authorization callback URL这一项里,你可以输入Spring Cloud Data Flow的登录URL,类似localhost:9393/login

配置GitHub 的Client Id 和 Secret到 Spring Cloud Data Flow 当中:

security: oauth2:  client:    client-id: your-github-client-id    client-secret: your-github-client-secret    access-token-uri: https://github.com/login/oauth/access_token    user-authorization-uri: https://github.com/login/oauth/authorize  resource:    user-info-uri: https://api.github.com/user

GitHub并不支持OAuth2的密码授权类型,Spring Cloud Data Flow的 Shell没法使用GitHub来进行认证。

14.4. 配置Spring Boot管理端点的安全性

当启用安全设置时,请确保 Spring Boot HTTP管理端点的也启用了安全设置 。您可以application.yml里添加配置来启用管理端点的安全性:

management: contextPath: /management security:  enabled: true

如果没有明确地设置管理端点的安全性,那么就算security.basic.enabled被设置为true了,REST风格的端点也还是不安全的 。

15. 监控和管理

Spring Cloud Data Flow服务器本身是一个包括 了Actuator功能库的Spring Boot应用程序,它准备好了一系列的现成功能帮助你监控和管理你的应用程序 。

Actuator功能库在路径/management下添加了HTTP端点,这也是个其它可用端点的发现页面。例如,有一个健康状态的端点可以展现应用程序 的健康状态信息和来自ConfigurableEnvironment的环境变量列表。默认情况下,只有健康状态和应用程序信息的端点是可以访问的。其它的端点是比较 敏感的 需要 明确通过配置来启用。如果你需要启用敏感的端点,那么你应该配置服务器端点的安全性, 使信息不让未经身份验证的用户访问到。本地数据流服务器默认情况下已禁用安全设置,所有可用的actuator功能库的端点是可以访问的。

数据流服务器如果启用了分析功能,那么它需要相应的关系数据库和redis服务器做支撑。数据流服务器会自动配置 datasourcehealthindicator 和 redishealthindicator 。这两种服务的健康状态也纳入到服务器的整体健康状况,可以通过健康状态端点查看。

15.1. Spring Boot 管理

将actuator端点功能可视化并和它进行交互的好方法,是将Spring Boot Admin功能库集成到Spring Cloud Data Flow服务器中。您可以通过以下几个简单的步骤 来创建Spring Boot Admin 应用程序。

将Spring Cloud Data Flow服务器作为Spring Boot Admin服务器客户端的方法是, 通过添加一个依赖到数据流服务器的Maven pom.xml文件中,然后添加额外的配置属性。你将需要克隆Spring Cloud Data Flow服务器的GitHub库以便修改Maven POM文件 。在GitHub库中有每个版本的标签。

添加这种依赖会导致UI界面增加了对应每个actuator端点的标签页。

Spring Boot Admin界面

如果需要与JMX beans和日志记录进行交互,就需要进行额外的配置。可以通过Spring Boot admin的文档获取更多信息。因为 应用程序信息 和 健康状态 端点是未经身份验证的用户可以直接访问的,你应该启用数据流服务器的安全性设置,同时配置Spring Boot

Admin 服务器的安全性,以便能安全地访问actuator终点。

15.2. 监控部署的应用程序

Spring Cloud Data Flow部署的应用程序基于Spring Boot的,Spring Boot包含了一些用于监控应用程序的功能特性。每个部署的应用程序中都包含了 监测Stream 和Task应用程序多个Web端点 。

值得一提的是,/metrics端点包含一系列的计数器和度量,如HTTP请求的, 系统指标 的(类似JVM的统计), DataSource指标的 和 消息通道指标的 (如信息速率)。Spring Boot可以让你 添加自己的指标到/metrics端点下,一种方法是通过注册publicmetrics 接口的实现类,另一种方法是通过集成 dropwizard。

Spring Boot的MetricWriter和Exporter接口用于发送数据给展现、分析这些数据的组件 。Spring Boot有输出指标到Redis, Open TSDB, Statsd和JMX的相应实现类,这些实现类可以直接使用。

还有一些额外的Spring项目提供了将指标数据发送到外部系统的功能。

·Spring Cloud Stream:提供了ApplicationMetricsExporter,用于通过Emitter发送指标数据到消息中间件。

·SpringCloud Data Flow Metrics Collector:订阅指标数据源和聚合Spring Cloud Stream应用程序发布的指标消息 。它有一个HTTP端点用于访问聚合后的指标。

·SpringCloud Data Flow Metrics:提供LogMetricWriter将指标数据写入到日志文件当中。

·SpringCloud Data Flow Metrics Datadog Metrics:提供DatadogMetricWriter将数据写入到Datadog

Spring Cloud StreamEmitter提供了创建Stream应用时最常用的应用程序,它在SpringCloud Stream App Starters项目得到大量使用。

使用Spring Cloud

Stream’sEmitter,Data Flow

Metrics Collector,和 Data Flow 服务器时的体系结构如下所示。

Spring Cloud Data Flow Metrics 体系结构

系统自带一个可用于所有支持binder的Spring Boot的指标收集器 jar包。你可以在项目页面上找到编译和运行指标收集器的更多信息。

数据流服务器现在接受 spring.cloud.dataflow.metrics.collector.uri这个可选的属性,这个属性指向部署好的指标收集器应用程序的URI。例如,如果您运行的指标收集器在本机的 8080端口, 然后可以用以下命令来启动服务器(本地的例子):

$ java -jar spring-cloud-dataflow-server-local-1.3.0.M2.jar --spring.cloud.dataflow.metrics.collector.uri=http://localhost:8080

指标收集器可以通过基于用户名和密码的“基本”身份验证来进行安全保护。设置用户名和密码,使用属性spring.cloud.dataflow.metrics.collector.username和spring.cloud.dataflow.metrics.collector.password。

如果需要将每个应用程序的指标公布出来, 那么设置spring.cloud.stream.bindings.applicationMetrics.destination属性即可。applicationmetrics目的 设置。当在数据流中部署应用程序时,可以将其设置为任何其他应用程序的属性。如果希望stream中的所有应用程序都能发布出指标数据,那么可以在数据流服务器级别上设置它。

spring.cloud.dataflow.applicationProperties.stream.spring.cloud.stream.bindings.applicationMetrics.destination=metrics

用metrics这个名称作为指标发布名称是一个很 不错的选择,因为指标收集器都是默认订阅 这个发布名称的数据。

另一个常见的配置指标名称的方法是使用部署属性。以下是ticktock

这个

流应用程序的例子,它使用了App Starters当中的time和log应用程序 。

app register --name time --type source --uri maven://org.springframework.cloud.stream.app:time-source-rabbit:1.2.0.RELEASEapp register --name log --type sink --uri maven://org.springframework.cloud.stream.app:log-sink-rabbit:1.2.0.RELEASEstream create --name foostream --definition "time | log"stream deploy --name foostream --properties "app.*.spring.cloud.stream.bindings.applicationMetrics.destination=metrics,deployer.*.count=2"

指标收集器在HTTP端点/collector/metrics下以JSON格式暴露了聚合后的指标 。数据流服务器以两种不同的方式访问这个端点。首先是通过暴露一个/metrics/streamsHTTP端点来代理指标收集器的端点,用户界面在为每个流应用程序显示数据流图中的消息处理速率时,会调用这个暴露的端点。 同时用户界面当中的Runtime 标签页暴露的/runtime/apps端点本身和shell 当中的用于显示消息处理速率的runtime

apps命令

也都会调用这个端点 。

数据流的消息处理速率

默认情况下,数据流会设置下边这个属性的值

spring.cloud.stream.metrics.properties=spring.application.name,spring.application.index,spring.cloud.application.*,spring.cloud.dataflow.*

如果这些应用程序的属性值列表是需要进行聚合的,它也会同时设置下边这个属性。

spring.metrics.export.triggers.application.includes=integration**`

由于数据流只显示瞬时输入和输出通道消息速率。默认情况下,所有在/metric端点下的指标值都是发送相关的,这会降低消息的有效负载统计,但不影响功能。当需要展现这些指标值时(用于跟踪特定应用程序),数据流也暴露出 GUID这个 属性,这个 GUID属性,它的 值是平台相关的。

注意,您可以通过设置来重写这些默认值,就像任何应用程序的属性值一样。

数据流不会提供它自己实现的功能来存储和可视化历史指标数据。我们将通过提供一个导出器应用程序来集成现有的ALM系统,该应用程序会处理那些与指标收集器同样来源的消息,并将它们写入到现有的ALM系统中。我们支持哪个特定的ALM系统是由用户需求来驱动的。作为例子,我们将开发一个结合了开源的Grafana前端的Elastic Search导出器 。

15.3. 日志和DataDog 指标器(MetricWriter)

如果你希望部署的应用程序绕过指标收集器提供的集中式指标列表,你可以使用SpringCloud Data Flow MetricsSpringCloud Data Flow Metrics Datadog Metrics当中的指标写入器 。

数据流Metrics项目通过MetricWriters为Spring Boot指标的输出提供了基础。它提供了Spring Boots AutoConfiguration来设置写入过程和常用功能,如定义一个更适合当前环境的有特定名称前缀的指标名称。例如,指标名称除了包含应用程序的名称和它所属的流/任务名称外,你可能还希望名称当中包含应用程序正在运行的区域名称 。同时项目还包括了logmetricwriter功能类,可以将指标存储到日志文件中。日志文件通常被应用监控工具所利用(如Splunk),在那里日志可以被进一步处理,用于创建应用程序的性能仪表板。

要利用此功能,您需要在您的流和任务应用程序中添加额外的依赖项。你可以使用Data Flow Initializr来可以定制自己任务流的应用程序,用它来先生成项目,然后添加你需要使用的MetricWriter实现类到生成的maven pom文件中。数据流Metrics项目页面上的文档提供了更多你所需的相关信息。

推荐阅读更多精彩内容