初次理解服務呼叫
在微服務中,有一個難點就是:如果你想使用各個服務元件,你就得知道不同服務的地址和埠,也就是服務發現。
在傳統應用我們是怎麼做的?就是在web專案裡配置上api地址,如下:
在一個web對應一個api的時候,這種方式非常簡單並且實用。但是,這不適用微服務專案,在超過三個服務部署的時候,光記住各個服務的地址和埠就給部署帶來不小的困難。
於是,微服務框架的服務發現和呼叫就排上了用場。
Dapr中的服務註冊
在上一篇 Dapr初體驗之Hello World 我們使用了命令 dapr run --app-id nodeapp --app-port 3000 --dapr-http-port 3500 node app.js
啟動了一個nodejs應用。
--app-id
指定了註冊到dapr的應用名稱--app-port
指定了註冊到dapr的應用埠號
Dapr採用邊車(Sidecar)方式,在不修改原服務程式碼的方式,就能通過這兩種引數完成服務的註冊。
Dapr中的呼叫邏輯
下圖描述了Dapr服務呼叫是如何工作的
https://docs.dapr.io/developing-applications/building-blocks/service-invocation/service-invocation-overview/
這個是Dapr官方手冊服務呼叫的例子,具體呼叫步驟大家直接訪問連線來閱讀,我不在做官方文件的搬運工了。這裡,我只提取一下要點資訊:
- 服務A和服務B是兩個api服務,通過dapr邊車方式進行了服務註冊
- Dapr通過服務A和服務B的
--app-id
,來確定不同的元件 - 所有的請求首先到dapr上之後有dapr轉發到應用
- 所以,這些請求都需要使用dapr的api才能完成
Dapr服務呼叫API
通過Dapr服務呼叫的api,就可以呼叫註冊到Dapr的服務方法
請求地址
POST/GET/PUT/DELETE http://localhost:<daprPort>/v1.0/invoke/<appId>/method/<method-name>
- daprPort : dapr服務的埠
- appId:註冊到dapr服務的應用id,也就是
--app-id
指定的引數 - method-name:方法名稱
來舉個例子
一個api服有get方法請求資料的介面/mydata嗎,通過命令dapr run --app-id myapi --app-port 5000 --dapr-http-port 3500 dotnet MyApi.dll
註冊了到了dapr。
那麼你訪問http://localhost:3500/v1.0/invoke/myapi/method/mydata
就可以訪問到這個api的介面。
寫個例項
利用官方quickstarts庫中的hello-world專案,增加一get介面,程式碼類似:
app.get('/test',(_req, res)=>{
return res.status(200).send({message: 'server 1'});;
});
使用命令 dapr run --app-id nodeapp --app-port 3000 node app.js
啟動應用,那麼使用dapr訪問此應用的介面就應該是http://localhost:3500/v1.0/invoke/nodeapp/method/test
使用postman訪問如下圖所示:
總結
這次我們簡單體驗了一下Dapr中服務發現和呼叫。通過Dapr邊車(sidecar)方式,我們在不修改原專案程式碼的情況下部署專案。通過這種方式,我們有很多優勢:
- 無感知的進行服務發現和呼叫,向其他服務提供了一種友好的介面呼叫方式
- 通過閱讀dapr文件,dapr能夠友好的為我們提供服務間安全性、介面重試、mDNS輪訓負載均衡和介面呼叫追蹤等高階功能
https://docs.dapr.io/zh-hans/developing-applications/building-blocks/service-invocation/service-invocation-overview/
https://github.com/dapr/quickstarts