以程式設計方式使用 Spring Cloud

工程 | Ramnivas Laddad | 2014 年 7 月 29 日 | ...

在上篇部落格中,我向您展示瞭如何使用 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 的可擴充套件性方面。敬請關注。

獲取 Spring 新聞通訊

與 Spring 新聞通訊保持聯絡

訂閱

搶佔先機

VMware 提供培訓和認證,以加速您的進步。

瞭解更多

獲取支援

Tanzu Spring 在一個簡單的訂閱中提供對 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群中所有即將舉行的活動。

檢視全部