iT邦幫忙

2023 iThome 鐵人賽

DAY 11
0
Modern Web

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

第十一章、Anser-Orchestration:簡單的服務協作 - PHP 微服務入門與開發

  • 分享至 

  • xImage
  •  

在這個章節中,我們會延續使用第九章服務抽象化的程式碼,請實作過第九章的讀者繼續保持你的本地環境;若你是還沒實作過第九章內容的讀者,建議你重回上一章了解 Anser 是透過何種設計方式將微服務進行抽象化與管理。

安裝

首先,先將 Command Line 定位至 Main Service 專案根目錄,並透過 docker compose exec app bash 進入到專案的 docker 容器之中。

接著,使用以下指令安裝 anser 程式庫。

composer require sdpmlab/anser

Anser 程式庫會安裝 Anser 本身與 Anser-Action 程式庫,與一些

順利的話,你會看到以下畫面響應,等待它們安裝完畢即可。

第一個協作器

在你的本地環境內建立 UserLoginOrchestrator.php ,並貼上以下內容:

<?php
namespace Orchestrators;

require_once './UserService.php';

use SDPMlab\Anser\Orchestration\Orchestrator;
use Services\UserService;
class UserLoginOrchestrator extends Orchestrator
{
    protected $userService;

    public function __construct()
    {
        $this->userService = new UserService();
    }

    protected function definition(string $email = "", string $password = "")
    {
        $this->setStep()
            ->addAction('login', $this->userService->userLoginAction($email, $password));
        $this->setStep()
            ->addAction('info', static function(UserLoginOrchestrator $runtimeOrch){
                $data = $runtimeOrch->getStepAction('login')->getMeaningData();
                return $runtimeOrch->userService->userInfoAction($data['token']);
            });
        $this->setStep()
            ->addAction('wallet', static function(UserLoginOrchestrator $runtimeOrch){
                $data = $runtimeOrch->getStepAction('info')->getMeaningData();
                return $runtimeOrch->userService->walletAction($data['data']['u_key']);
            });
    }

    protected function defineResult(): array
    {        
        $data = [
            "token" => $this->getStepAction('login')->getMeaningData()['token'],
            "userData" => $this->getStepAction('info')->getMeaningData()['data'],
            "walletInfo" => $this->getStepAction('wallet')->getMeaningData()['data']
        ];
        return $data;
    }

}

UserLoginOrchestrator 類別中,主要是示範使用者登入後產生的一系列連鎖過程,包括登入、獲取使用者資訊和錢包餘額:

  • UserLoginOrchestrator 類別繼承了 Orchestrator 類別。這意味著它具有 Orchestrator 所提供的所有功能和方法。
  • 在類別中定義了一個$userService,並在建構子中,初始化 $userService 屬性為 UserService 的一個實體。
  • definition 方法定義了整個協作過程。此方法需要傳入電子郵件和密碼作為參數,用於用戶登入。所有在 definition 提到的微服務都依賴 $userService 定義好的 Actions。
  • defineResult 方法根據協作器的執行結果,組合與回傳整理好的結果。

整體來看,我們定義了一個完整的使用者登入流程,這流程將被依據順序執行,每個步驟的結果都會被儲存,並在流程結束後組合成最終的結果。

接著,我們改寫第九章的 userlogin.php

<?php

require_once './init.php';
require_once './UserLoginOrchestrator.php';

use Orchestrators\UserLoginOrchestrator;

$userOrch = new UserLoginOrchestrator();
$result   = $userOrch->build($_POST['email'], $_POST['password']);

header("Content-Type: application/json");
echo json_encode($result);

使用 Postman 呼叫一次上述 PHP 來看看結果:

我們使用了更有組織性的結構闡述了具有順序性的過程,雖然在這個章節中我們尚未細緻地解釋所有 Orchestrator 類別的可以方法,以及詳細闡述撰寫這些程式碼的用意。但你應該能在這個類別中一目了然整體的業務邏輯,就像文章開頭闡述的那樣,透過程式碼清晰地表達你的業務邏輯。

結語

在這篇文章中我們提供了一個簡短的範例展示協作器的撰寫風格。

我們希望 Anser-Orchestration 元件能夠為開發者提供了一個組織性強、模組化且有順序性的方式來描述多個服務間的互動過程。再接下來的幾個章節中,我們將會深入地探討 Anser-Orchestration 所提供的功能。


上一篇
第十章、Anser-Orchestration:服務協作設計理念 - PHP 微服務入門與開發
下一篇
第十二章、Anser-Orchestration:處理服務協作邏輯 - PHP 微服務入門與開發
系列文
30 天上手! PHP 微服務入門與開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言