領先一步
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 的可擴充套件性方面。敬請期待。