搶佔先機
VMware 提供培訓和認證,以加速您的進步。
瞭解更多在上篇部落格中,我向您展示瞭如何使用 Spring Cloud 的 Java 配置選項以宣告方式獲取服務聯結器(如果您需要,還提供 XML 名稱空間支援)。在這篇部落格中,我們將更仔細地研究如何以程式設計方式使用 Spring Cloud。這將在您無法使用 Java 或 XML 配置的情況下提供幫助。它還將揭開 Spring Cloud 的工作原理,併為本系列中的下一篇部落格做好準備,我們將在其中討論擴充套件 Spring Cloud。
要使用 Spring Cloud,我們需要訪問 Cloud
類的物件。但是,您不能直接建立 Cloud
物件(其建構函式不是公共的)。相反,您將透過 CloudFactory
獲取它。
CloudFactory cloudFactory = new CloudFactory();
Cloud cloud = cloudFactory.getCloud();
以這種方式建立的雲物件適用於應用程式執行的環境。例如,如果應用程式在 Cloud Foundry 中執行,則它被配置為理解如何嚮應用程式公開服務。請注意,建立 CloudFactory
例項有點昂貴,因此您應儘量避免建立多個例項。如果您使用諸如 Spring 之類的依賴注入框架,它將負責避免多個例項;否則,只需自己管理它。
一旦我們擁有了雲物件,我們就可以使用各種標準獲取應用程式例項資訊、服務資訊物件,以及使用指定的標準獲取服務聯結器。假設,您想獲取繫結到應用程式的所有服務的 ServiceInfo
物件,並列印關係服務的 JDBC URL,您可以使用以下程式碼段
List<ServiceInfo> serviceInfos = cloud.getServiceInfos();
for (ServiceInfo serviceInfo : serviceInfos) {
if (serviceInfo instanceof RelationalServiceInfo) {
System.out.println(((RelationalServiceInfo) serviceInfo).getJdbcUrl());
}
}
這將產生如下輸出
jdbc:postgresql://babar.elephantsql.com:5432/tbsonrjm?user=***&password=***
使用 getServiceInfos()
及其變體獲取的物件包含足夠的資訊,例如 URL 和憑據,以建立服務聯結器。在某些情況下,獲取 ServiceInfo
物件可能是您所需要的全部,因為您始終可以基於它建立合適的聯結器(例如 DataSource
)。但在大多數情況下,您會讓 Spring Cloud 為服務建立一個合適的服務聯結器。例如,如果您想直接獲取“inventory-db”服務的 DataSource
,您可以使用以下程式碼段
DataSource inventoryDataSource =
cloud.getServiceConnector("inventory-db", DataSource.class, null);
此方法有一個變體:getSingletonServiceConnector()
,您可以按如下方式使用它
DataSource inventoryDataSource = cloud.getSingletonServiceConnector(DataSource.class, null);
在這裡,它將返回繫結到應用程式的唯一關係資料庫服務的 DataSource
;如果沒有這樣的服務,或者有多個服務,它將丟擲一個異常。我們將 null
作為最後一個引數傳遞給這兩種方法,以便為建立的聯結器使用預設配置。但是,您可以傳遞您希望覆蓋的配置。例如,這裡我們指定了要建立的資料來源的池配置以及連線配置。
PoolConfig poolConfig = new PoolConfig(20, 200);
ConnectionConfig connectionConfig = new ConnectionConfig("characterEncoding=UTF-8");
DataSourceConfig serviceConfig = new DataSourceConfig(poolConfig, connectionConfig);
DataSource invetoryDataSource = cloud.getSingletonServiceConnector(DataSource.class, serviceConfig);
最後,有一種方法可以獲取包含應用程式 ID(雲相關,但通常是應用程式名稱)、應用程式例項 ID 和鬆散定義的應用程式屬性的應用程式資訊。讓我們列印所有這些資訊
ApplicationInstanceInfo appInstanceInfo = cloud.getApplicationInstanceInfo();
System.out.println("Application id: " + appInstanceInfo.getAppId());
System.out.println("Application instance id: " + appInstanceInfo.getInstanceId());
for (Map.Entry<String, Object> entry: appInstanceInfo.getProperties().entrySet()) {
System.out.println("Application property: " + entry.getKey() + "=" + entry.getValue());
}
當您在 Cloud Foundry 中執行的應用程式中執行此程式碼時,您將獲得類似於以下內容的輸出(此處已縮寫)。如果同一應用程式在 Heroku 中執行,它將產生類似的輸出,但具有不同的鍵集
Application id: hello-spring-cloud Application instance id: 8b523252a9d3478b92750ef27ad4e5b0 Application property: limits={mem=800, disk=1024, fds=16384} Application property: application_version=b1257c57-2a5c-47aa-8ca7-5e8b6d9a7b9c Application property: application_name=hello-spring-cloud Application property: application_uris=[hello-spring-cloud.cfapps.io] Application property: version=b1257c57-2a5c-47aa-8ca7-5e8b6d9a7b9c Application property: name=hello-spring-cloud Application property: space_name=development Application property: space_id=5f629937-1821-4f48-9eb4-8c67c70c0df0 Application property: application_id=a345f90f-e075-4005-b003-f4ab86ad716a Application property: instance_id=8b523252a9d3478b92750ef27ad4e5b0 Application property: instance_index=0 Application property: host=0.0.0.0 Application property: port=61023 Application property: start=2014-07-15 21:27:34 +0000 Application property: state_timestamp=1405459654
這就是您以程式設計方式使用 Spring Cloud 所需瞭解的全部內容。在下一篇部落格中,我們將把重點轉移到 Spring Cloud 的可擴充套件性方面。敬請關注。