回顧首篇文章替整個系列訂下了開發與學習的目標,在系列文的最後一篇我們將側重於總結我們達成的目標,與現有的其他解決方案。
在單體式應用程式中,所有功能都是密不可分的,並且緊密相連。這樣的設計雖然在某些情境下有其優點,但也帶來了一些困難,如當系統需要硬體擴充時,可能會面臨資源浪費和管理的挑戰。
微服務則是另一個極端,將系統分解為數個小型且獨立運作的服務。每個服務都有其自己的功能和職責,且獨立於其他服務運作。這不僅使得開發更為靈活和模組化,還提供了更好的擴展性。
無論是將現有服務給微服務化,還是從頭建構一個微服務,都不是一件簡單的事情。雖然清晰明瞭的架構能夠替我們帶來維護的便利與容易分工的益處,但也在開發中替我們帶來了不小的挑戰。
微服務中的每個服務都被視為一個獨立的應用程式,並提供某種形式的介面供其他使用者或服務存取。常用的存取介面通常是以 HTTP 為主的 API,或者是事件驅動的溝通模式。
本篇系列文章以 PHP 程式庫 Anser 作為基礎,其中 Anser 提供了基於服務協作的 PHP 微服務溝通解決方案;Anser 不仰賴任何外部伺服器或其他程式語言,完全使用 PHP 進行製作,能夠直接融入你目前的 PHP 專案中。
以下將列出相似的解決方案。
由於微服務的獨立性,每個服務都有自己獨立的資料庫,當業務流程需要跨多個服務時,確保資料的一致性變得具有挑戰性。本系列文章介紹了三種主要的分散式交易解決方案:二階段提交(2PC)、三階段提交(3PC)和 Saga 模式。
在 PHP 中,你可以透過 DTM 的 Saga 相關元件達成與本系列文章相似的交易管理與微服務協作。但在一些細節上可能有不同的概念與需要注意的地方,你可以前往這個 Git 儲存庫 了解如何使用這個開發架構;你也可以參考第 19 到 25 章的文章內容,使用 Anser 的 Saga 元件完成在 PHP 程式語言的 Saga 設計模式。
與分散式交易所關注的角度不同,微服務本身具有自己的資料庫以及交易實作。在實作微幅務時安全地存取自身的資源,才能夠支持分散式的交易環境中的健壯性。
PHP 通常採用 PHP-FPM 搭配 HTTP 伺服器一同執行,每個連線都有各自獨立的生命週期處理結束立即銷毀,這在高並行的請求下可能不是最佳選擇。為了解決這問題,我們可以透過像是 Swoole、RoadRunnder 或是 Workerman 等新穎技術進行應用程式的開發,透過重複使用留存在記憶體中的 PHP 程序,達到更好的執行效能。
不只 Go 語言,我們可以透過 Swoole 或是 Swow 等 PHP 開發引擎,在 PHP 的環境下進行 Coroutine 模式的程式設計。透過 Coroutine 開發者能夠在單一執行緒中管理與進行多任務。同時我們也能夠過 Workerman 和 Coroutine 結合,提供非阻塞式的常駐型 PHP HTTP 應用伺服器。
在 Workerman 與 Swow 環境下,我們能夠透過抽換 Anser 中的 Guzzle 核心,使 Anser 在 Swow 的 Coroutine 模式中無縫地執行。你也可以透過下列採用新技術的 PHP 開發框架完成你的高效能微服務:
透過本系列文章,我們探討了從單體式應用程式到微服務的轉變,並學習了多種微服務間的溝通方式以及交易管理方法。而 PHP 作為一門廣泛使用的後端語言,也正在對這樣子的軟體開發趨勢做出改變。
無論使用哪種技術或設計模式,關鍵都在於如何在正確的需求下選擇最合適的實作。當我們深入了解各種模式和最佳實踐時,也應該持續評估我們的業務需求和系統架構,使系統朝向最正確的方向改變。
最後,希望這系列文章能夠為你提供一個探索 PHP 微服務開發的叩門磚,不論你是剛開始還是已經走在這條路上,都希望你能從中受益。