iT邦幫忙

2023 iThome 鐵人賽

DAY 3
0
Modern Web

30 天上手! PHP 微服務入門與開發系列 第 3

第三章、Anser PHP 微服務協作程式庫 - PHP 微服務入門與開發

  • 分享至 

  • xImage
  •  

雁行,大雁依序以 V 型飛行的本能。

Anser 是筆者從研究所時期開始開發的 PHP Side Project。筆者最初分析了在基於 RESTful 設計方案下,各個 API 在 HTTP 協定中請求(Request)與回應(Response)的可能行為,藉此設計出一套能夠以 PHP 程式語言進行 HTTP 請求與處理回應的基礎程式庫──Anser-Action:PHP 簡單 API 連線程式庫

Anser Action 是一款基於 Guzzle7 的程式庫,它能夠讓你以類似於 jQuery Ajax 的 callback 設計模式處理 HTTP 回應與 HTTP 例外。並且,Anser-Action 也能夠迅速達成並行連線的效果,讓你快速處理多個 HTTP 的連線與回應。

你可以參考以下範例程式碼:

use \SDPMlab\Anser\Service\Action;
use \Psr\Http\Message\ResponseInterface;

$action = (new Action(
    "https://datacenter.taichung.gov.tw",
    "GET",
    "/Swagger/OpenData/b73b3ab5-7c51-46a8-ae6a-9dbbde436083"
))->doneHandler(function(
    ResponseInterface $response,
    Action $runtimeAction
){
    $body = $response->getBody()->getContents();
    $data = json_decode($body, true);
    $runtimeAction->setMeaningData($data);
});

$data = $action->do()->getMeaningData();
var_dump($data[0]);

透過使用 Anser-Action 提供的 Action 物件定義你的 API 連線內容,再以 doneHandler 處理連線成功時的抽象邏輯,緊接著使用 $action->do() 發出請求,最後以getMeaningData() 方法取得你所指定的回傳資料。Anser-Action 的設計希望一切都是簡單且容易理解的。

再這之後,筆者延續此 Side Project 延伸出:Anser PHP 服務協作程式庫專案。Anser 其名命取自於「雁」的學名 Anser,透過雁行理論中的列隊、組織與扶持等理念,代指在分散式系統中透過服務協作設計模式建構大型資訊服務的過程。筆者希望在保有彈性的開發過程中,開發人員能輕鬆地處理各種在HTTP溝通中可能發生的應用程式例外以及請求失敗時的重試策略,幫助開發人員以 PHP 建構出健壯的微服務系統。

使用 Anser 讓你像是拼積木一般精心排列你的微服務。

Anser 試圖以單純的 PHP 實作出服務協作設計模式,你可以透過這個程式庫管理連線與指揮你的微服務,你可以輕鬆地達成以下目標:

  • 替每個基於 HTTP 的微服務抽象出特定類別與實作,Anser 並不會限制你溝通模式。[1][2]
  • 快速的組合(Composition) 你的微服務 [1][2]
  • 撰寫具備順序性的微服務協作(Service Orchestration)腳本 [1][2]
  • 迅速地採用 SAGA 模式制定你的交易(Transaction)邏輯 [3]
  • 簡單的交易備份機制,服務意外中斷時的交易還原 [4]

Anser 與其他 PHP 微服務解決方案不同的是,它不仰賴任何外部伺服器或其他程式語言,完全使用 PHP 進行製作,能夠直接融入你目前的 PHP 專案中。舉個例子:你可以漸進式地將一個大型 PHP 專案慢慢地解耦,並透過此程式庫在同一專案中提供相似的介面,將一次性遷移系統架構所造成的大量開發與測試工作分次處裡,一步一步地將你的專案轉換至微服務架構。

設計

本系列文章之設計圖各圖示、圖標之涵義如上圖所示。

  • Software System 表示服務內子系統或功能範圍
  • Component/Class 表示元件或類別
  • Developer Component/Class 表示開發人員需自定義 邏輯之元件或類別。
  • Relationship 表示圖示與圖示之間可能存在的關係

  1. Service
    提供開發人員自定服務列表、抽象化 HTTP 請求、並行連線,與過濾器等功能。使開 發人員能夠便利地透過簡單介面的呼叫與類別的實作,與微服務進行溝通。
  2. Orchestration
    提供開發 人員制定協作步驟(Step)定義具有順序性執行的業務流程。
  3. Saga
    透過宣告 Saga 補償(Compensate)策略,可確保協作步驟執行失敗時,能往回補償與往前重做,保障各個微服務終端的資料一致性。
  4. Backup Mechanism
    負責儲存 Orchestration 執行狀態,保障協作器遭遇意外中斷的狀況下,分散式交易流程不會遺失且被完整保留。

在接下來的文章中,我們將會圍繞著 Anser 程式庫作為我們的基礎,藉此傳達服務協作設計模式、Saga 實作等重要的觀念。

結語

本篇文章介紹了一款由筆者主導開發的專案 Anser。

目前,Anser 還是一款持續開發中的程式庫,但筆者認為目前的主要功能已足夠完整,程式庫的使用方法大抵定型,是個非常適合傳遞相關開發理念的專案。雖然目前在 GitHub 儲存庫中除了 README 的範例外,並沒有提供更詳盡的 API 與使用範例,但在接下來的文章中,我們將會細緻地示範程式庫的使用方法,並傳達足夠的設計理念。

希望能夠勾起你的興趣,也希望能夠與你一起進步。

參考資料

[1] MENG-HSIEN W, 2021. "Anser: A PHP and RESTful API-based Microservices Architecture Implementation using Orchestration Pattern" master's thesis, National Kaohsiung Normal University.
[2]Lee, W. T., Wu, M. H., Liu, Z. W., & Lee, S. J. (2022). A Microservices Orchestration Library based on PHP and RESTful API. Journal of Information Science and Engineering, 38(6), 1133-1147. https://doi.org/10.6688/JISE.202211_38(6).0003
[3] Ping-Yi S, Meng-Hsien W, Wen-Tin L, (2022, June 24). "Anser-Saga: A Data Consistent Microservices Architecture Imple-mentation using Saga and Service Orchestration Design Patterns ". 18th Taiwan Conference of Software Engineering.
[4] Ming-Kai Tsai, Ping-Yi Song, Meng-Hsien Wu, Wen-Tin L, (2023, Aug 10-11). "A High Availability Microservices Architecture Implementation using Saga and Backup Mechanism". the 10th International Conference on Dependable Systems and Their Applications.

圖像資料

  1. Silhouette of Flying Birds During Sunrise
    , john cox, https://www.pexels.com/photo/silhouette-of-flying-birds-during-sunrise-15475744/

上一篇
第二章、微服務與它們的溝通管道 - PHP 微服務入門與開發
下一篇
第四章、開發環境設定與部署範例微服務 - PHP 微服務入門與開發
系列文
30 天上手! PHP 微服務入門與開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言