Dapr初體驗之服務呼叫

藍曈魅發表於2021-11-24

初次理解服務呼叫

在微服務中,有一個難點就是:如果你想使用各個服務元件,你就得知道不同服務的地址和埠,也就是服務發現。
在傳統應用我們是怎麼做的?就是在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

相關文章