Bootiful Azure:邁向生產環境 (6/6)

工程 | Josh Long | 2019 年 1 月 21 日 | ...

這是總共 6 部分系列的第 6 部分,每週一和週四發布新文章,介紹 Microsoft Azure 給 Spring 開發人員。 如果沒有 Microsoft 的 Asir Vedamuthu Selvasingh、Yitao Dong、Bruno Borges、Brian Benz 和 Theresa Nguyen 的投入,我就無法完成這篇文章。您可以在 Github 上找到本系列的程式碼。在您閱讀文章的同時,請在 Twitter (@starbuxman) 上與我聯繫,提出任何意見或問題。您也可以在我的 Spring Tips (@SpringTipsLive) 文章 Bootiful Azure 中了解更多關於 Microsoft Azure 的資訊。

以下是所有文章

我們對 Microsoft Azure 系列的最後一篇文章實際上是一個快速總結,介紹將使用 Spring Boot 和 Microsoft Azure 構建的應用程式部署到生產環境時需要注意的事項。

安全配置

我們已經輕鬆愉快地從本地電腦上開發了應用程式,並在需要時插入了相關的配置值。 問題是,這些通常是非常敏感的值,不應以未加密的方式靜置在檔案系統中。 對於這個問題,有很多很好的解決方案。 您當然可以部署 Spring Cloud Config Service 本身。 如果您正在 Microsoft Azure 上執行 Pivotal Cloud Foundry (或其他),這是推薦的方法,因為只需一行程式碼即可完成部署和工作。 您當然也可以部署 Hashicorp Vault 並使用 Spring Cloud Vault。 或者,您可以將金鑰和值儲存在 Microsoft 的 Key Vault 服務中。 為了有效地使用 Key Vault,您需要配置 Microsoft Active Directory,雖然這不是我希望您或您的親人遇到的事情,但親愛的讀者,我對此非常感興趣。

Microsoft Active Directory

在我協助組織建構軟體的 20 多年中,我幾乎沒有看到任何一家沒有使用 Microsoft Active Directory 的,即使只是通過 LDAP 介面。 當然,我希望 Google Apps 在企業中獲得更多關注,但讓我們非常清楚:Active Directory 是企業 IT 中普遍的標準。 這是一種生活方式,即使您和我可能不必經常在我們理想化的應用程式開發世界中擔心它。 這是有充分理由的! 它整合了企業專業人士的整個 Windows 桌面體驗。 它是 Office365 故事的核心,也是組織組織和自我結構的方式。 想知道你是否獲得了晉升嗎? 檢查 Active Directory! 想知道某人坐在哪裡嗎? 檢查 Active Directory! 想要強制重設密碼嗎? 維護企業範圍的稽核日誌?解僱某人? 檢查 Active Directory! 您可能認為您的組織運行 Active Directory,但讓我們明確一點:它運行您的組織。

Active Directory 是一個目錄伺服器。 它提供了一個用戶、組織等的樹狀結構。 它充當 Microsoft CRM、Microsoft SQL Server、Microsoft Office 甚至 Microsoft Windows 本身等技術的身份管理器。 您可以在 Active Directory 中描述用戶、他們的權利和角色等等。 這將我們帶回了原點。 Microsoft Azure 為您運行 Active Directory! 您可以直接從平台導入和配置 Microsoft Active Directory 安裝的所有相關信息。 甚至有一個 Spring Boot Starter 將 Microsoft Azure 連接到您的 OAuth 委派的 Spring Boot 和 Spring Security 驅動的應用程式。 您可以自己部署和管理 Microsoft SQL Server 或 Microsoft Active Directory 之類的東西嗎? 當然可以。 但是,你應該嗎?

應用程式洞察

隨著您擴展並啟動更多微服務,您將引入越來越多的移動部件,並且能夠觀察資料從系統中的一個節點到另一個節點的移動變得越來越重要。 在這裡,用於 Spring 應用程式的 Microsoft Application Insights 整合(至少目前與 Microsoft Azure 的主要 Spring 整合分開提供)使其使用起來非常簡單! 將 com.microsoft.azure: applicationinsights-spring-boot-starter : 1.1.0-BETA 新增到您的建構檔案中。

您可以編寫指令碼來建立 Application Insights 訂閱,如下所示

#!/usr/bin/env bash

rg=$1
appname=${rg}-appinsights

az resource create \
    --resource-group $rg \
    --resource-type "Microsoft.Insights/components" \
    --name $appname \
    --location "South Central US" \
    --properties '{"ApplicationId":"bootiful","Application_Type":"web"}'

這將建立一個訂閱並將其綁定到 bootiful 資源群組。 使用以下命令來存取產生的金鑰(假設相同的 $rg$appname 變數在作用域內)

az resource show -g $rg -n $appname --resource-type "Microsoft.Insights/components" --query properties.InstrumentationKey

然後,您需要指定 azure.application-insights.instrumentation-key 並為您的應用程式命名一個 spring.application.name 名稱。 說實話,您無論如何都應該這樣做。 就是這樣! 重新啟動您的應用程式,通過應用程式中的 HTTP 端點傳輸一些流量(即使只是在 localhost 上運行),然後登錄到 Microsoft Application Insights 儀表板並觀看儀器運作!

Cloud Foundry

您不應該運行您無法收費的軟體。 Pivotal 的傳奇人物 James Watters 經常談論“低於價值線”的工作,以及技術人員和高管應該專注於高於給定組織價值線的工作。 普通組織有很多問題。 運行 MySQL 或 Kafka 等商品軟體不應該是其中之一。 運行那些不能使您的業務與眾不同的東西不應該是其中之一。 從長遠來看,如果其他人可以勝任這項工作,那麼付錢請人來運行任何東西的花費將會無限減少。 理想情況下,最終運行該軟體的人應該對良好運行這些東西有既得利益。 大多數組織的使命不是配置 SSL,也不是調試 MySQL 複製問題。 讓其他人為您做這件事幾乎總是更便宜的。

如果您正在嘗試做一些標準的事情,那麼您絕對應該依賴標準化的工具。 當您可以使用像 Cloud Foundry 或 Kubernetes 這樣的東西時,為什麼要使用雲端廠商的鎖定軟體來運行基於 Java 或 Node 的應用程式呢?對於這些工具,招聘人才庫更大,成本幾乎為零,並且易用性與雲端廠商提供的任何東西相當或更好?

這是 Microsoft 和 Pivotal 建立如此良好關係的重要原因之一。 企業客戶明白,對於某些工作負載而言,公共雲已成定局,但他們不希望被鎖定。 可選性是有價值的。 能夠遷移到不同的平台是有價值的。 敏捷性(響應變化的能力)是有價值的。 我們一直看到這種情況;在 Google Cloud Platform 首次亮相時,某些工作負載類型的價格比 Amazon Web Services 便宜。 有些公共雲端供應商在您可能希望進入的地區有可用區,而其他雲端供應商則沒有。 越來越多的組織開始採用混合雲或多雲策略,因為他們知道他們的工作負載會有所不同,並且他們的可用性需求也會有所不同。 這些組織希望盡可能降低在各種雲端基礎架構上進行運營、安全、培訓和部署的成本。

Pivotal Cloud Foundry 在這裡是一個自然的選擇; 它允許組織可靠地部署到許多雲端平台中的任何一個,並且同樣輕鬆地,並且在必要時,下降到平台特定的服務。 這一事實是 Microsoft 在 2017 年和 2018 年將 Pivotal 命名為年度合作夥伴的原因之一。 Pivotal Cloud Foundry 是我們發行的 Apache 2 許可的開源 Cloud Foundry 專案,有助於推動 Microsoft Azure 上的資源使用,並以盡可能可移植的方式進行,同時仍然展示了有價值且獨特的東西。

我完全贊成使用像是 Microsoft Azure 這樣的服務來簡化基礎架構的建置工作,畢竟在某些方面 Microsoft 可以提供獨特的體驗。但如果只是運行 Java 程式或 Node.js 程式?那就堅持使用像是 Cloud Foundry 或 Kubernetes 這樣的事實標準基礎架構。將 Cloud Foundry 部署在 Microsoft Azure 之上非常簡單,一旦部署完成,在那裡部署 Spring Boot 應用程式也很容易。通常就像 cf push -p my.jar 這麼簡單。當然,你需要 Cloud Foundry CLI,點此安裝

在 Cloud Foundry 的世界裡,服務仲介 (service broker) 是一個 HTTP API,Cloud Foundry 平台透過它來管理 某些東西 的佈建和生命週期。它可以是像 MySQL 這樣的資料庫,或是像 Apache Kafka 這樣的訊息佇列。它可以是 Active Directory 安裝,或是 CosmosDB 連線。它可以是任何東西。Microsoft 和 Pivotal 團隊緊密合作,確保在 Microsoft Azure 上運行 Pivotal Cloud Foundry 的使用者,能透過服務仲介使用 最方便的方式來存取重要的服務。這個列表包含 Microsoft Azure 服務,例如 Azure Storage、Azure Redis Cache、Azure Service Bus、Azure Event Hubs、Azure SQL Databases (SQL Server、PostgreSQL 和 MySQL) 和容錯移轉群組,以及 Azure CosmosDB。

你可以透過在 CLI 上執行 cf marketplace 命令來檢查 Cloud Foundry 服務目錄。它會顯示所有相關的服務,然後你可以選擇佈建服務的實例及其相關的方案。方案描述了你可以從服務仲介資源獲得的特定服務級別,並且自然地針對每個提供的服務仲介而有所不同。

假設你有一個已部署到 Cloud Foundry 的 Spring Boot 應用程式,它的邏輯名稱是 myapp

> cf push -p my.jar --no-start myapp

假設你想為你的應用程式佈建一個 Microsoft SQL Server 實例,並且希望在邏輯上將該資料庫引用為 mydb。你的會話可能會像這樣。以下命令會佈建一個 SQL Server 實例,透過內聯 JSON 或 .json 檔案路徑指定參數,並將其分配一個邏輯名稱 mydb

> cf create-service azure-sqldb basic mydb -c '{"sqlServerName": "Bootiful"}'

該服務很快就會被佈建,並且可以在應用程式中使用。你只需要將服務綁定到你的應用程式,這樣相關的連線資訊就可以作為環境變數注入到應用程式的環境中。

cf bind-service myapp mydb
cf restart myapp

現在,你正在運行的 Spring Boot 應用程式將會有一個環境變數 VCAP_SERVICES,其內容將包含剛剛佈建的服務的連線資訊。它看起來會像這樣:

"VCAP_SERVICES": {
  "azure-sqldb": [
    {
      "credentials": {
        "sqldbName": "fake-database",
        "sqlServerName": "fake-server",
        "sqlServerFullyQualifiedDomainName": "fake-server.database.windows.net",
        "databaseLogin": "ulrich",
        "databaseLoginPassword": "u1r8chP@ss",
        "jdbcUrl": "jdbc:sqlserver://fake-server.database.windows.net:1433;database=fake-database;user=fake-admin;password=fake-password;Encrypt=true;TrustServerCertificate=false;HostNameInCertificate=*.database.windows.net;loginTimeout=30",
        "jdbcUrlForAuditingEnabled": "jdbc:sqlserver://fake-server.database.secure.windows.net:1433;database=fake-database;user=fake-admin;password=fake-password;Encrypt=true;TrustServerCertificate=false;HostNameInCertificate=*.database.secure.windows.net;loginTimeout=30",
        "hostname": "fake-server.database.windows.net",
        "port": 1433,
        "name": "fake-database",
        "username": "ulrich",
        "password": "u1r8chP@ss",
        "uri": "mssql://ulrich:u1r8chP@[email protected]:1433/fake-database?encrypt=true&TrustServerCertificate=false&HostNameInCertificate=*.database.windows.net"
      }
    }
  ]
}

在 Spring Boot 中,你可以使用扁平化的屬性存取語法來引用這些屬性,例如:vcap.services.mydb.credentials.jdbcUrl。這裡常見的模式是在雲端中運行應用程式時啟用 Spring profile。比如說,cloud?這樣你就可以將一個設定檔放在程式碼中的 application-cloud.properties 下面,並且該屬性檔案會在應用程式啟動時在 Cloud Foundry 中載入。你可以在 application-default.properties 中放置預設的本地設定。因此,當 Spring Boot 在沒有指定任何 profile 的情況下啟動時,它將會載入 application-default.properties 中的設定。當在 Azure 上的 Cloud Foundry 中運行時,它將會載入 application-cloud.properties 中的設定。因此,你可以將以下內容添加到你的 application-default.properties 檔案中。

spring.datasource.url=${vcap.services.mydb.credentials.jdbcUrl}

太棒了!(Bootiful!)

下一步

在這篇文章和之前的文章中,我們僅僅開始探索 Spring、Microsoft Azure 和 Cloud Foundry 可以實現的可能性。應該清楚的是,這裡存在著一種良好的共生關係,每種技術都使其下層更強大。難怪大量的 Azure 工作負載都是基於 Linux、Spring Boot 和 Cloud Foundry:這些東西可以很好地協同工作。對於那些想要了解更多關於 Microsoft Azure 上的 Spring 的人,請查看 Azure 上的資源入口網站

獲取 Spring 電子報

隨時關注 Spring 電子報

訂閱

領先一步

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

了解更多

獲得支援

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

了解更多

即將舉行的活動

查看 Spring 社群中所有即將舉行的活動。

查看全部