什麼是微服務?
雲端則驅動了現今的應用程式開發和 IT 系統管理。 新式雲端應用程式需要快速、靈活、可大幅調整且可靠。
使用容器可協助您部署符合所有該需求的應用程式。 但是在不遵循策略設計模式的情況下,將應用程式放入容器中,就像是進入車輛,希望在不使用地圖或 GPS 的情況下,找出前往新城市的途徑。 您最終可能會到達目的地,但是可能不是直接抵達或最有效率的途徑。
微服務架構在此案例中很有用。 微服務可提供您最適合新式雲端應用程式靈活性、可擴縮性和可靠性需求的軟體開發和部署方法。
什麼是微服務架構?
在微服務結構中,大型應用程式會分割成一組較小的服務。 每個服務皆依照其本身的流程執行,並透過使用 HTTP/HTTPS、WebSocket 或進階訊息佇列通訊協定 (AMQP) 等通訊協定與其他流程進行通訊。 每個微服務都會在特定的內容界限內實作特定的端對端網域或商務功能。 每個微服務都必須自主開發,且必須獨立部署。 最後,每個微服務都應該擁有其相關的領域資料模型和領域邏輯。 微服務可以基於不同的資料儲存技術 (SQL、NoSQL) 和不同的程式設計語言。
以下是微服務的一些主要特性:
- 它們屬於小型、獨立且鬆散結合的服務。
- 每個微服務的程式碼基底各自分開,由小型的開發小組管理。
- 它們會獨立部署。 小組可以直接更新現有微服務,而不需要重建和重新部署整個應用程式。
- 它們會在其各自的資料庫中保存其資料或外部狀態。 不同於整合型結構,微服務不會共用資料庫。
- 它們會使用定義完善的 API 來彼此通訊。 每個服務的內部實作詳細資料都會對其他服務隱藏。
- 它們支援 polyglot 程式設計。 例如,組成 Web 應用程式的微服務不需要共用相同的技術堆疊、程式庫或架構。
為什麼要使用微服務架構開發?
微服務通常會封裝較簡單的客戶需求功能,因此您可以相應地對之進行擴增或縮減。 您可以獨立測試、部署及管理它們。 微服務方法的一個重要優點是小組較具商務案例的導向,而不是使用特定技術導向。 每個小型開發小組都會根據客戶案例來開發微服務。 小組會選擇其使用的技術。
微服務提供長期的靈活度。 微服務可讓您根據許多獨立可部署並具有細微且自發生命週期的服務來建立應用程式,並藉此在複雜、大型和高可調整性的系統中支援可維護性。
另一個優點是微服務可以獨立擴增。 您可以擴增特定微服務,而不需以單位擴增單一的整合型應用程式。 您只調整需要更高處理能力或網路頻寬的功能區域就能支援需求,而非擴增應用程式其他不需要擴增的區域。 這代表您能節省成本,因為需要的硬體減少了。
微服務方法允許靈活的變更和每個微服務的快速反覆項目,因為您可以變更複雜、大型且可擴充應用程式的特定小型區域。
建造精細的微服務型應用程式可啟用持續整合與持續傳遞作法。 也能加速將新功能傳遞至應用程式。 您可以隔離地執行和測試微服務,並自主發展微服務,同時維護服務之間的明確合約。 只要不變更介面或合約,您可以變更任何微服務的內部實作,或在不中斷其他微服務的情況下新增新功能。
容器扮演什麼角色?
容器化是一種軟體開發方法,在此方法中,應用程式或服務、其相依性及其組態 (抽象化為部署資訊清單檔) 會封裝在一起,成為一個容器映像。 您可以單位測試容器化應用程式,並將之以容器映像執行個體部署在主機作業系統上。
軟體容器可作為能包含不同程式碼和相依性之軟體部署的標準單位。 這類似於船舶、列車、貨車運送各種種類的貨櫃運輸貨物的方式。 開發人員和 IT 專業人員可以使用容器化軟體,在微幅修改或無須修改的情況下,跨環境部署程式碼和相依性。
如果它聽起來像是容器化,應用程式可能是實作微服務架構模式的絕佳方法,確實如此。 使用容器的優點幾乎完全符合使用微服務架構的優點。
注意
容器化應用程式不是部署微服務的唯一方法。 您可以將微服務部署為 Azure App Service 中的個別服務,或是在虛擬機器上或以任何數目的方式來部署。 容器是我們將在此課程模組的其餘部分中用於微服務的工具。
進行容器化的另一個優點是可擴縮性。 您可以建立供短期工作使用的新容器來快速擴增。 從應用程式的觀點來看,具現化映像 (建立容器) 類似於具現化處理序 (例如服務或 Web 應用程式)。
簡單來說,容器在整個應用程式生命週期工作流程中,提供隔離、可攜性、彈性、延展性和控制能力等優點。
您在此課程模組中建置的微服務將會在使用 .NET CLI 發佈的 Docker 容器中執行。
.NET SDK 容器發佈
在 .NET 7 中,.NET SDK 能夠透過 dotnet publish
命令建立容器映像。 該工具會根據您的專案屬性及其輸出,來執行一系列推斷。 .NET 接著會建立 Dockerfile 會建立的相同映像。 建立新的應用程式並將之發佈為映像可能只需要少許兩個命令:
dotnet new webapi
dotnet publish --os linux --arch x64 /t:PublishContainer -c Release
上述 .NET CLI 命令會建立新的 Web API,並將應用程式發佈為容器:
- 以 Linux 作為 OS (--os linux) 為目標。
- 指定 x64 架構 (--arch x64)。
- 使用發行設定 (-c 版本)。
您可以透過 MSBuild 屬性控制產生容器的許多層面。 一般而言,如果您使用 Dockerfile 中的命令來設定某些設定,您可以透過 MSBuild 執行相同的動作。
為什麼要在 .NET 中建置微服務?
從 .NET Core 開始,到目前的反覆項目中,都必須先建置 .NET 才能成為雲端原生版本。 其會跨平台執行,因此您的 Docker 映像可能會以 Linux 的類別為基礎,而您的 .NET 程式碼仍會執行。 Microsoft 已建立 Docker 的 .NET 映像。 此外,.NET 的速度非常快。 ASP.NET Kestrel 網頁伺服器通常會優於其他網頁伺服器。
Docker
Docker 是一項 開放原始碼平台,可讓您用以將應用程式部署自動化,讓自給自足的可攜容器可以在雲端或內部部署執行。 Docker 也是推廣及發展這項技術的公司。 Docker 作為組織可與雲端、Linux 和 Windows 廠商共同作業,包括 Microsoft。
Docker 容器可以在任何位置執行,例如客戶資料中心的內部部署、外部服務提供者或雲端。 Docker 映像容器可以在 Linux 和 Windows 上以原生方式執行。
什麼是映像?
當開發人員使用 Docker 時,他們會建立應用程式或服務。 然後,他們會在容器映像中封裝應用程式或服務及其相依性。 映像是應用程式或服務和其設定及相依性的靜態表示法。
映像會在執行時變成容器。 容器是映像的記憶體內部執行個體。
容器映像是不可變的。 當您建置映像之後,就無法變更該映像。 因為您無法變更映像,因此如果您需要變更應用程式或服務及其相依性,請建立新的映像。 此功能保證在實際執行環境中所使用的映像,與在開發和測試中所使用的映像相同。
什麼是 Dockerfile?
Docker 檔案是文字檔,其中包含有關如何建置 Docker 映像的指示。 Dockerfile 是以專為建置和設定映像所設計的最小指令碼語言撰寫而成。 Dockerfile 也會記載組建映像所需的作業,從基礎映像開始。
若要建立包含應用程式的 Docker 映像,您通常會從識別基礎映像開始。 接著,您會將更多檔案和設定新增至基礎映像。 識別適當基礎映像的流程通常會從在 Docker Hub 上搜尋開始。 您尋找一個立即可用的映像,其中已包含應用程式架構,以及 Linux 發行版本 (例如 Ubuntu 或 Alpine) 的所有公用程式和工具。 例如,如果您有想要封裝至容器的 ASP.NET Core 應用程式,Microsoft 會發佈稱為 mcr.microsoft.com/dotnet/aspnet 的映像,其已包含 ASP.NET Core 執行階段。
您可以啟動具有基礎映像的容器,並對其進行變更,以自訂映像。 變更通常會涉及一些活動,例如將從本機檔案系統的檔案複製到容器中,以及執行各種工具和公用程式來編譯程式碼。
Dockerfile 是一組指示,會以您在其中執行應用程式所需的確切軟體 (包括該應用程式本身) 來建立 Docker 映像。