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項目頁面上的文檔提供了更多你所需的相關信息。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,663評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,125評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,506評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,614評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,402評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,934評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,021評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,168評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,690評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,596評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,288評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,027評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,404評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,662評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,398評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,743評論 2 370

推薦閱讀更多精彩內容