一旦微服務數量及版本暴增,企業內就必須要建置服務架構,以統合的入口提供各項服務註冊與呼叫,稱之為【服務導向架構】(Service-oriented architecture, SOA),以下我們就來研究這個課題。
即使不採用SOA,以FastAPI開發,預設就會整合Swagger UI,只要URL加上【/docs】,就可以顯示程式的API清單及規格,類似Web API的UDDI機制,可參閱【UDDI - 維基百科】說明。
Swagger UI的操作程序如下:
fastapi dev fastapi_calendar.py
http://localhost:8000/docs
執行結果:顯示程式的API清單。
顯示程式的API規格:輸入參數,點擊【Try it out】,還可以執行API。下圖顯示【加入行事曆】的API規格。
在SOA架構下,眾多服務必須統一管理,提供新服務註冊,並讓用戶端能呼叫已註冊的服務,這類負責管理的伺服器稱為【Discovery Server】,知名的工具軟體有Eureka、Consul、Etcd...等。
以下就【fastapi-eureka-docker-service-discovery】範例,說明Eureka相關作法。
Eureka是Netflix公司開源的工具軟體,它提供的功能包括:
Eureka是以Java Spring Boot開發的框架,必須先安裝Java SDK,才能安裝範例,架構如下:
安裝程序如下:
自【fastapi-eureka-docker-service-discovery】下載檔案,並解壓縮。
先啟動Docker Desktop。
再建置Eureka Server的虛擬容器image:
cd eureka-server
./mvnw clean install
docker build -t eureka-server .
cd ../service-alice
docker build -t service-alice .
cd ../service-bob
docker build -t service-bob .
cd ../eureka-sidecar
./mvnw clean install
docker build -t eureka-sidecar .
cd ..
docker-compose up -d
docker-compose down
fastapi-eureka-docker-service-discovery-master\docker-compose.yml內容包括Eureka Server、Eureka Client及服務的IP及Port。可使用瀏覽器測試以下項目:
http://localhost:8761/eureka/apps
執行結果:部份資訊如下,可以看到服務(Apps)的IP、Port及健康狀況。
呼叫Alice服務的方法(/)。
http://localhost:8001
Hello world, from BobAlice
@app.get("/call-bob", response_class=PlainTextResponse)
def call_bob():
r = requests.get('http://sidecar-alice:5678/hosts/bob')
json = r.json()
if len(json) == 0:
return 'Service bob is not available yet.'
uri = json[0]['uri'] # 取得bob的URL
nr = requests.get(uri)
return nr.text + ' Through Alice.'
http://localhost:8001/call-bob
Hello world, from Bob. Through Alice.
@app.get("/test", response_class=PlainTextResponse)
async def root():
return "test from Bob."
@app.get("/call-bob-test", response_class=PlainTextResponse)
def call_bob_test():
r = requests.get('http://sidecar-alice:5678/hosts/bob')
json = r.json()
if len(json) == 0:
return 'Service bob is not available yet.'
uri = json[0]['uri']
nr = requests.get(uri+'/test')
return nr.text + ' Through Alice.\n'
http://localhost:8001/call-bob-test
test from Bob. Through Alice.
以上測試可以看到Eureka不僅可以註冊服務,服務之間還可以彼此呼叫。
參照上圖及fastapi-eureka-docker-service-discovery-master\docker-compose.yml內容如下:
version: "3"
services:
eureka-server:
image: "eureka-server"
ports:
- "8761:8761"
alice:
image: "service-alice"
ports:
- "8001:80"
depends_on:
- "eureka-server"
sidecar-alice:
image: "eureka-sidecar"
environment:
- SERVICE_NAME=alice
depends_on:
- "alice"
alice服務的程式包括:
Eureka Client的程式包括:
以上主要是以Java開發,不免有些遺憾,筆者搜尋是否有純粹以Python開發的方式,找到【python-eureka-client】,測試並未成功,可以順利找到alice/bob服務,也可以註冊服務,但是並無法找到代理alice/bob服務的Eureka Client,相關程式如26\discovery1.py、discovery2.py,未來如果找到問題,再修正嘍。
本次透過Eureka,可以讓微服務(Microservices)之間互相溝通,並能統一管理,可避免微服務像散落各地的孤島,各自維運,也可以串連多個微服務構成一個完整的服務,例如旅館訂房:
以上假設每一項都是微服務,要串連起來其實是一個很服雜的任務,值得深究。
本系列的程式碼會統一放在GitHub,本篇的程式放在src/26資料夾,歡迎讀者下載測試,如有錯誤或疏漏,請不吝指正。