聊聊微服務是什麼 – 服務通訊
這個 Tag 的第六個主題是「服務通訊」,講白話些就是「我要怎麼呼叫另一個服務的功能?」我們在第三個主題講了「服務通訊的大致邏輯」,以及在第四個和第五個主題花了很大的篇幅講了「服務怎麼 連線 到服務」,但好像從來都沒有真正說「服務怎麼和服務 互動」、「RPC 是什麼」,以及具體要怎麼通訊、有哪些通訊方法,以及有哪些通訊手段。這裡就要開始介紹了! 這篇是之前 SITCON 2025 的草稿,不是後面寫的,也還沒有做過 peer reviewing!如果有任何問題的話,也歡迎到 Threads 或 X 上標我指正。 「通訊」是什麼? 在單體服務的世界,你要呼叫一個方法,比如「選課」,你通常是用函式或 HTTP API 呼叫完成的。舉例來說: 你的前端往你的 API 發出了 POST /api/v1/course/:course/selection。我們會稱這個網址叫做端點 (endpoint)。 你的 API 有一個「選課」Controller,裡面有一個處理選課端點的「方法」(method),這裡叫做 SelectCourse 吧! 接著你的 SelectCourse 方法會透過呼叫 GetStudentInfo 方法來取得這個學生的資訊,以及透過 GetCourseContraints 方法取得課程的限修資訊 接著 SelectCourse 方法會根據這些資訊決定允不允許學生選這堂課,然後將選課結果插入資料庫當中。 📚 小提醒:在 MVCS 架構下,我們通常會叫這種功能性質的 class 為 Service。不過為了防止跟微服務的 Service 混淆(雖然其實概念是一樣的),這裡就不會用 Service 這個名詞。 如果你能理解上面這張圖,那我們把它換成微服務,你就很清楚我們要解決什麼「通訊」問題了: 上面這張圖的青色線段,就是我們這次要探討的問題了:這些服務都不在一起,我們要怎麼呼叫對方的方法——也就是「青色」這個線條,究竟怎麼實作? 🫨 選課服務是怎麼連線到使用者服務的?你可以往回看看「服務探索」這個章節!從這裡開始,我們都假定我們已經知道這些服務的 IP 和連線方式了,要處理的只是應用層的溝通問題。 用 HTTP 設計自己的 RPC 首先,最直覺的方法,就是你給每個服務開一個 HTTP 的 API,用 HTTP 的呼叫邏輯和其他服務溝通。因為這些 HTTP 方法只是內部使用的,你不用像 REST API 一樣,需要認真思考每個端點的命名,只需要讓每個服務看得懂就好。因此,你這樣設計你的微服務溝通方法: ...