天天看點

Dapr和Rainbond內建,實作雲原生BaaS和子產品化微服務開發

作者:Rainbond開源

背景

Dapr 是一個開源的分布式應用運作時,幫助開發者建構松耦合的分布式應用程式,具有良好的可擴充性和可維護性。Rainbond 是一款企業級的雲原生應用管理平台,提供了豐富的功能和工具,友善開發者管理和部署應用。Rainbond 和 Dapr 結合可以提供以下價值點:

  1. 為Dapr擴充雲原生支援:Rainbond 提供了一套完整的雲原生應用支援方案,包括應用開發、應用編排、應用傳遞、應用運維等應用全生命周期管理能力,而 Dapr 隻是應用開發架構,包括應用開發模型、服務發現、事件驅動等功能。将 Rainbond 和 Dapr 結合起來可以提供更完整的雲原生應用支援,幫助開發人員更快地建構和部署應用。
  2. 讓Dapr應用可移植性增強:Rainbond提供應用模版能力,Dapr開發的應用以模版的方式打包,可以友善傳遞和遷移到其他平台運作。
  3. 為Rainbond擴充服務治理能力:Rainbond 支援通過插件擴充服務治理能力,和 Dapr結合,可以通過Dapr的方式實作服務治理。将二者結合起來,可以提供更完整的服務治理功能,幫助開發人員更好地管理和控制應用中的服務。
  4. 為Rainbond增加BaaS能力:在Rainbond上開發軟體,需要自己安裝後端資料庫和中間件,而Dapr将後端能力以API的方式對外提供,開發者隻需要通過API統一通路後端能力,實作了BaaS體驗。

總之,Dapr和Rainbond能互相補充能力不足,Rainbond 解決了應用生命周期管理的問題,開發者不需要懂底層技術,但還是需要了解後端服務, Dapr 補足了這塊能力,讓開發者更加專注業務。

Rainbond和Dapr的整合思路

Dapr和Rainbond內建,實作雲原生BaaS和子產品化微服務開發

在 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 中是如何使用的

前提條件

  1. Rainbond 版本大于 v5.13。
  2. Rainbond 已經對接過開源應用商店并擁有推送權限。

實踐步驟

Dapr和Rainbond內建,實作雲原生BaaS和子產品化微服務開發

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 中的注冊資訊。

Dapr和Rainbond內建,實作雲原生BaaS和子產品化微服務開發

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 。

繼續閱讀