背景
Dapr 是一個開源的分散式應用執行時,幫助開發者構建松耦合的分散式應用程式,具有良好的可擴充套件性和可維護性。Rainbond 是一款企業級的雲原生應用管理平臺,提供了豐富的功能和工具,方便開發者管理和部署應用。Rainbond 和 Dapr 結合可以提供以下價值點:
- 為Dapr擴充套件雲原生支援:Rainbond 提供了一套完整的雲原生應用支援方案,包括應用開發、應用編排、應用交付、應用運維等應用全生命週期管理能力,而 Dapr 只是應用開發框架,包括應用開發模型、服務發現、事件驅動等功能。將 Rainbond 和 Dapr 結合起來可以提供更完整的雲原生應用支援,幫助開發人員更快地構建和部署應用。
- 讓Dapr應用可移植性增強:Rainbond提供應用模版能力,Dapr開發的應用以模版的方式打包,可以方便交付和遷移到其他平臺執行。
- 為Rainbond擴充服務治理能力:Rainbond 支援透過外掛擴充套件服務治理能力,和 Dapr結合,可以透過Dapr的方式實現服務治理。將二者結合起來,可以提供更完整的服務治理功能,幫助開發人員更好地管理和控制應用中的服務。
- 為Rainbond增加BaaS能力:在Rainbond上開發軟體,需要自己安裝後端資料庫和中介軟體,而Dapr將後端能力以API的方式對外提供,開發者只需要透過API統一訪問後端能力,實現了BaaS體驗。
總之,Dapr和Rainbond能互相補充能力不足,Rainbond 解決了應用生命週期管理的問題,開發者不需要懂底層技術,但還是需要了解後端服務, Dapr 補足了這塊能力,讓開發者更加專注業務。
Rainbond和Dapr的整合思路
在 Dapr 微服務框架的業務體系中,Daprd 是整個業務的核心,應用程式透過執行時 API 傳送請求給 Daprd,Daprd 負責處理這些請求,並與底層服務進行互動。Daprd 是由 Dapr Services 中的 dapr-sidecar-injector 服務進行注入的,當 Pod 滿足注入條件後進行注入。同時 Dapr Services 中的 dapr-operator 會監聽整個叢集下的 Dapr 配置資源(CRD),當捕獲到有 Dapr 配置類資源的建立後,會記錄在記憶體中,再次注入的 Daprd 如果 Pod 宣告瞭使用該配置,則會提供對應的能力。
- Dapr Service 的安裝:Rainbond 將 Dapr Services 資源進行了整合,作為一個外掛應用上架到了應用商店,透過安裝便可以快速讓我們的叢集具備 dapr 微服務架構能力,避免了叢集中執行
dapr init -k
命令,同時解決了國外映象拉取的問題。 - DaprD注入:傳統注入方式我們需要手動新增註入條件欄位,費時費力且不易維護還容易出錯;Rainbond 支援透過切換應用的治理模式的方式,為我們的 Pod 新增不同屬性欄位以滿足不同微服務架構的注入條件,從而達到批次注入,快速使用、便於管理的效果。
- Dapr配置:Dapr 提供了四種配置 Daprd 的資源來擴充套件我們的服務治理能力,分別為Configuration、Component、Resiliency、Subscription,我們需要透過編寫 Yaml 的形式在叢集中建立這些資源供業務元件使用,Rainbond 平臺在應用的 k8s 資源的管理入口,其效果與
kubectl
有些類似但比kubectl
更易於管理。其中 Configuration 資源用於儲存應用程式的配置資訊,例如連線字串、金鑰、證書等,需要為 Pod 配置的annotations
屬性去宣告才可使用,Rainbond 的元件檢視提供對annotations
屬性配置,簡化了我們配置的流程。 - Dapr Component安裝和對接:Rainbond 的應用商店已經有很多後端實現,如 MySQL、Redis等,在Rainbond裡可以一鍵安裝便可使用。在Dapr應用的K8s資源管理裡配置Component的yaml,繫結後端服務的地址。
- Dapr應用開發:Dapr開發的應用可以用原始碼、映象、yaml部署到Rainbond平臺上,然後根據Dapr的API規範訪問後端服務,Rainbond提供對Dapr應用的持續整合、持續交付、環境管理、配置管理、日誌和效能監控、訪問閘道器、應用運維等能力,輔助Dapr應用的開發和管理。
部署和使用流程
基於 Rainbond 使用 Dpar 的目標:
- 一鍵部署 Dapr Service,讓叢集具備 Dapr 微服務架構能力。
- 自動為業務元件注入 Daprd。
- 視覺化管理 Dapr 配置。
- 簡化 Daprd 屬性引數配置流程。
- 多種方式交付你的 Dapr 業務。
下面我透過部署一個釋出訂閱的示例,供大家快速瞭解並掌握 Dapr 在 Rainbond 中是如何使用的
前提條件
- Rainbond 版本大於 v5.13。
- Rainbond 已經對接過開源應用商店並擁有推送許可權。
實踐步驟
1. 安裝 Rainbond Service Mesh 外掛
Rainbond ServiceMesh 外掛負責按照指定治理模式對應用元件進行加工調整,以滿足微服務治理外掛注入的基本條件。透過在平臺管理->應⽤市場->開源應⽤商店->搜尋 Rainbond-ServiceMesh 並進行安裝
2. 安裝Dapr 應用外掛
建立一個以 dapr-system 為英文名的團隊,安裝 Dapr Services 。透過在平臺管理->應⽤市場->開源應⽤商店->搜尋 Rainbond-Dapr 並進行安裝
。
3. 繫結 Component
Dapr 支援對接多種 Component 實現,如 Redis、Mysql、Oauth等,在 Rainbond 平臺中安裝也非常簡單,大部分實現都可以在 Rainbond 應用商店中找到,少數不支援的儲存也歡迎大家參與應用製作釋出到應用商店中來。本次示例我們需要安裝的是 Redis 透過在平臺管理->應⽤市場->開源應⽤商店->搜尋 Redis 並進行安裝
。安裝完成後,在應用檢視->k8s資源->編寫 Component 資源
進行繫結。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: pubsub
spec:
type: pubsub.redis
version: v1
metadata:
- name: "redisHost"
value: "YOUR_REDIS_HOST_HERE"
- name: "redisPassword"
value: "YOUR_REDIS_PASSWORD_HERE"
如果是 MySQL ,步驟是平臺管理->應⽤市場->開源應⽤商店->搜尋 MySQL 並進行安裝
,安裝完成後在 應用檢視->k8s資源->編寫 Component 資源
進行繫結。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: <NAME>
spec:
type: state.mysql
version: v1
metadata:
- name: connectionString
value: "<CONNECTION STRING>"
- name: schemaName
value: "<SCHEMA NAME>"
- name: tableName
value: "<TABLE NAME>"
- name: pemPath
value: "<PEM PATH>"
4. 切換應用治理模式
將業務應用的治理模式切換至 Dapr 。透過在 應用檢視->治理模式->選擇 Dapr 治理模式進行切換
。其中 dapr 治理模式會為我們元件的 annotations
屬性新增欄位dapr.io/enabled: "true"
以及dapr.io/app-id="xxx"
其中 xxx 為元件的英文名,由於dapr.io/app-id
是Dapr 體系中的唯一標識,Rainbond 支援自行配置,如果檢測到有該屬性欄位,則優先使用原配置。滿足注入條件後,dapr-sidecar-injector 服務開始工作,為我們的業務元件注入 Daprd。
5. 部署業務
Rainbond 提供了多種方式部署你的業務,映象、Helm、Yaml、原始碼等等。這裡我選擇使用映象部署,具體步驟為: 應用檢視->新增元件->指定映象->填寫映象地址
。
demo映象地址:
registry.cn-hangzhou.aliyuncs.com/zhangqihang/pubsub-node-subscriber:latest
registry.cn-hangzhou.aliyuncs.com/zhangqihang/pubsub-react-form:latest
registry.cn-hangzhou.aliyuncs.com/zhangqihang/pubsub-go-subscriber:latest
由於 Dapr 中訊息佇列需要為元件 annotations
屬性設定 dapr.io/app-port
欄位,切換治理模式的時候並沒有自動生成,所以我們需要在元件檢視->其他設定->Kubernetes屬性->新增屬性->選擇 annotations->新增 dapr.io/app-port=元件埠欄位
。同理其他擴充套件的 annotations
屬性欄位均在此處配置。
6. 部署最終效果
在pubsub-react-form 元件的元件檢視->埠->開啟對外服務
便可實現訪問訊息釋出元件,向訂閱 A、B、C中釋出訊息,透過觀察pubsub-node-subscriber
和pubsub-go-subscriber
元件的日誌可看到訂閱的內容,日誌位置:元件檢視->日誌
。
7. 透過Dapr控制檯管理
訪問 dapr dashboard 可以檢視到我們的微服務元件在 Dapr 中的註冊資訊。
8.釋出應用模版
Rainbond提供應用一鍵釋出應用模版的能力,在Dapr開發應用的應用檢視,點選釋出
來發布應用模版,並透過應用模版線上和離線快速安裝到其他環境。不過在其他環境使用時需要先安裝Rainbond和Dapr基礎環境。
在Rainbond上擴充套件Dapr
鏈路追蹤
鏈路追蹤是一種網路監控和故障排除技術,用於追蹤資料包在網路中的路徑和經過的節點,以便最佳化網路效能和發現問題,在 Dapr 中是透過配置Configuration資源
繫結追蹤器實現進行工作的。下面是以 Zipkin 追蹤器實現的Configuration
資源配置示例。更多詳見 Dapr Observability。
在應用檢視->k8s資源->編寫 Configuration 資源
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: daprConfig
namespace: default
spec:
tracing:
samplingRate: "1"
zipkin:
endpointAddress: "http://localhost:9411/api/v2/spans"
熔斷限流
限制每秒允許的最大 HTTP 請求數,速率限制可以保護您的應用程式免受拒絕服務 (DOS) 攻擊。我們需要配置component
資源作為中介軟體,然後透過Configuration 資源
進行繫結,然後在業務元件中配置掛載使用。
在應用檢視->k8s資源->編寫 Component 資源
作為中介軟體,設定每秒的最大請求數為 10。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: ratelimit
spec:
type: middleware.http.ratelimit
version: v1
metadata:
- name: maxRequestsPerSecond
value: 10
在應用檢視->k8s資源->編寫 Configuration 配置資源
繫結中介軟體。
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
spec:
httpPipeline:
handlers:
- name: ratelimit
type: middleware.http.ratelimit
在元件檢視->其他設定->Kubernetes屬性->新增屬性->選擇annotations->新增 dapr.io/config 屬性欄位
繫結 Configuration 。