本系列文章的一大核心重點為「實作」,在接下來的每一個章節中,我們將會圍繞著實際的程式設計,傳達在 PHP 程式語言下該如何實踐我們推薦的微服務設計模式。
首先,我們先從基本的「開發環境」說起。
筆者非常推薦以 Docker 建構你的本地開發環境,在接下來的範例中若是涉及一些複雜的環境組態設定,將會直接提供 docker-compose
檔案,方便讓你直接獲取與本文相似的環境,減少環境組態造成的開發難題。若是你不熟悉 Docker 或 Docker Compose,非常推薦你趁著這個機會與它交個朋友,這會使你的開發體驗豁然開朗。
這個系列的文章並非 Docker 的教學,某些更延伸的知識你必須靠自己學習。
在接下來的文章中,我們都將透過本節提到的所有微服務進行示範,你可以依照每一篇文章的需要再依需求建立,也可以一次將你的本地開發環境給組建起來。
這些微服務模擬了一個簡單的電子商務系統,功能的邊界大多是為了示範跨服務溝通而設計的,與真實世界的電子商務系統相差甚遠。因此,筆者建議你將這些微服務看做是滿足單一需求的黑箱子即可,不必太過在乎功能的設計是否符合「真實電子商務」的需要。
服務名稱 | 功能概述 |
---|---|
User Service | 使用者服務,負責使用者認證的任務,與使用者可用餘額 |
Product Service | 商品敘述、價格與庫存 |
Order Service | 儲存訂單編號、商品與數量 |
Main App | 主要開發的環境 |
上述微服務皆以 PHP 撰寫,除了 Main App 以外皆採用 CodeIgniter4 框架,並透過 PostgreSQL 做為資料儲存的資料庫。另外,為了使服務的部署更加輕量,額外採用了 CodeIgniter4 高效能伺服器程式庫 Burner,並選擇了 PHP 高效能伺服器 RoadRunner 提供 HTTP 服務。
所有微服務皆包含 Docker Compose 組態設定檔案,並提供一份基於 Postman 的 API 使用說明書。這些服務皆具有一組對外的RESTful API,用於各項資源的 CRUD(新增、讀取、更新、刪除)。
我們所預設的 Docker PHP 環境皆採用 webdevops/php:8.1
映象檔,資料庫皆採用 postgres:11.12
映象檔。
你可以透過上述表格中的連結至各個服務的 Github Releases 頁面下載最新的專案程式,隨著本系列文章的演進,筆者可能會隨時更新服務的內容,或者是修復可能的 Bug 。因此你可以在追蹤本系列文章時定期確認你的專案版本,或是透過 Git-Clone 的模式將專案建立於你的本機環境,並定期 Git-Pull 至最新版本。
以 User Service 為例,你可以直接下載 Source Code,並在你的系統環境中解壓縮。你將會在專案的根目錄中發現 app
資料夾,與包含 README.md
在內的一些檔案。不只 User Service ,其他專案也是如此。
在你的開發環境中打開 Command Line 介面,並將位置 cd 至專案根目錄,我們將會在這裡完成所有初始化專案的操作。
若你是第一次部署本系列的微服務專案,請先執行下列指令,在你的 Docker 環境中建立起一個共用的網路,未來所有的微服務都將在這個網路中溝通。
docker network create anser_project_network
接著,執行 docker compose up -d
將服務打開,順利的話你會看到下述畫面。
你可以透過 docker compose ps
確認你的服務是否一切安好。
觀察專案資料夾,你應該可以看見 {project_root}/app/vendor
與 {project_root}/user-db-data
資料夾,以及 app/.rr.yaml
檔案被依序建立出來。接著,你可以直接打開瀏覽器並前往 http://localhost:8080/
,若一切正常你應該能看到一個 404 畫面。
不必緊張,會出現 404 的原因僅僅只是在這些專案中並沒有處理根網址的顯示行為罷了。
回到你的 Command Line 介面,我們還得將一些幫助你開發的資料塞進資料庫中!
依據服務的不同,你所需要下的指令也會有些微的不同,你可以直接參考各個服務根目錄下的 README.md 檔案,這裡我們只會演示 User Service 的流程。
執行下列遷移指令,將專案所需的資料表一次建立起來。
docker-compose exec user-service php spark migrate
若順利的話,你應該會看到下列響應:
此時,若你的電腦中有支援 PostgreSQL 的資料庫管理工具(筆者使用:DBeaver Community),你可以直接連線資料庫,資料庫的連線資訊請參考 {project_root}/docker-compose.yml
中的的這個區塊:
對應到 DBeaver 的連線資訊如下:
連線至資料庫中你應該可以見到下列資料表:
User Service 與 Production Service 都有提供資料庫填充的指令,其用意是建立起初始資料幫助你進行後續的開發。
回到 Command Line 中,在專案根目錄執行:
docker-compose exec user-service php spark db:seed UserSeeder
沒意外的話你應該會看到這個畫面:
此時前往你的 User 資料表,你會看到這些使用者資訊被自動建立出來:
在剛才的指令中,將自動產生下列使用者:
帳號:user1@anser.io ~ user5@anser.io
密碼:password
執行到這裡,恭喜你已經建立起你的第一個服務,你可以依照上述指引,並參考其他專案根目錄的 README.md
檔案,依序建立起所有服務。
無論是哪個服務,在專案的根目錄中都提供了 Postman
的 Collection
匯出檔,筆者將在接下來的所有示範中使用 Postman。
點擊 Import
按鈕即可將專案根目錄下的 UserService.postman_collection.json
檔案匯入,就像下圖一樣,你將能看見可用的 API 出現在你的 Postman Workspace 中。
我們以 使用者登入
API為例,你可以發現在網址列上有著 {{user_service}}
Tag,如下圖:
請先至 Environments 功能中建立本機的連線 IP,筆者建議你可以直接建立起所有可能使用到的環境。若你沒有自己調整 docker-compose.yml
中服務的對外連接埠(Port),你就能直接參考下圖的組態設定:
上述環境建立完成後,回到 使用者登入
標籤,你應該能正常地發送出請求至剛才建立的範例微服務了:
當你完成了所有服務的建立後,我們要開始處理開發所需環境了!
在你喜歡的地方建立起一個開發資料夾,筆者叫做 main_service
。緊接著在資料夾底下建立起 docker-compose.yml
,你可以將以下內容直接貼上你的檔案。
version: "3"
services:
app:
image: webdevops/php-nginx-dev:8.1
platform: linux/x86_64
networks:
- anser_project_network
ports:
- 8083:80
working_dir: /app
environment:
- WEB_DOCUMENT_ROOT=/app
- PHP_DISPLAY_ERRORS=1
volumes:
- './:/app'
networks:
anser_project_network:
external: true
這是一個 PHP8.1
且使用 Nginx
作為網頁伺服器的 PHP 開發環境,如果你對這個映象檔感興趣,你可以直接前往它的 官方文件 了解細部使用方式。
打開 Command Line 介面,透過 cd
指令移動到專案根目錄下,執行下列指令打開環境 docker compose up -d
,順利的話你將能看見下列響應:
緊接著,在 main_service
資料夾中建立起 info.php
,並貼上下列內容。
<?php
phpinfo();
此時,你的專案資料夾應該會看起來像這樣:
最後,打開你的瀏覽器並前往下列網址 http://localhost:8083/info.php
,你就能看見你的環境資訊,就像這樣:
至此,恭喜你完成了所有的環境設置,好的開始是成功的一半!
本篇文章著重於環境的設定,在接下來的文章筆者將會預設所有讀者的開發環境已對齊本篇文章的設定,將不再贅述環境設定相關的議題。當然,若你是個十分嫺熟的 PHP 工程師,你當然能夠依你所好調整上述環境的布署方式。