Dapr - 組件 -Components-
前言:
前面文章對 Dapr 的構建塊進行了解,接下來對 Dapr 中對構建塊的實現——組件
一、組件
Dapr 使用模塊化設計,將功能作爲組件來提供。每個組件都有接口定義。所有的組件都是可插拔的,因此在理想的情況下,你可以用一個具有相同接口的組件換掉另一個。用於生產的每個組件, 需要保持一套技術要求,以確保組件的功能兼容性和強度。
組件需包含:
-
符合定義的 Dapr 接口
-
功能正確和強健
-
完善的文檔和維護
當前支持組件類型:
-
狀態存儲:狀態存儲組件是存儲鍵值對的數據存儲(數據庫、文件、內存),其作爲 狀態管理 的構建模塊之一。
-
服務發現:服務發現組件與 服務調用 構建塊配合使用,與託管環境集成以提供服務到服務發現。
-
中間件:Dapr 允許將自定義 中間件 插入請求處理管道。中間件可以在請求路由到用戶代碼之前,或者在將請求返回給客戶端之前,對請求執行額外的操作(例如,認證,加密和消息轉換)。中間件組件與 服務調用 基礎結構塊一起使用。
-
Pub/Sub 代理:發佈 / 訂閱 組件是消息分發器,可以作爲應用程序之間進行消息發佈 & 訂閱 構建塊。
-
綁定:綁定 構建塊使得外部資源可以連接到 Dapr 以觸發服務或作從應用觸發外部服務。
-
祕鑰存儲:在 dapr 中,密鑰 是指任何你不想給不受歡迎的人(例如:黑客)知道的私有信息。密鑰存儲被用來存儲可以在服務中被獲取以及被使用的密鑰
可以發現當前支持的組件類型與構建塊相對應。
二、組件定義格式
Dapr 使用 CustomResourceDefinition 定義和註冊組件。所有組件都定義爲 CRD,可應用於 Dapr 運行的任何託管環境。
格式:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: [COMPONENT-NAME]
namespace: [COMPONENT-NAMESPACE]
spec:
type: [COMPONENT-TYPE]
version: v1
initTimeout: [TIMEOUT-DURATION]
ignoreErrors: [BOOLEAN]
metadata:
- name: [METADATA-NAME]
value: [METADATA-VALUE]
格式說明:
特殊值:
元數據值可以包含一個 {uuid}
標籤,當 Dapr sidecar 啓動時,該標記將被隨機生成的 UUID 所取代。每個啓動都會生成新的 UUID。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: messagebus
spec:
type: pubsub.mqtt
version: v1
metadata:
- name: consumerID
value: "{uuid}"
- name: url
value: "tcp://admin:public@localhost:1883"
- name: qos
value: 1
- name: retain
value: "false"
- name: cleanSession
value: "false"
三、組件應用
1、祕鑰倉儲組件:
描述文件格式:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: secretstore
namespace: default
spec:
type: secretstores.<NAME>
version: v1
metadata:
- name: <KEY>
value: <VALUE>
- name: <KEY>
value: <VALUE>
...
密鑰存儲的類型由type
字段決定,連接地址和其他元數據等放在**.metadata
**部分。
當前支持祕鑰存儲通用類型:
2、中間件組件
Dapr 允許通過鏈接一系列中間件組件來定義自定義處理管道。請求在路由到用戶代碼之前經過所有已定義的中間件組件,然後在返回到客戶機之前,按相反順序經過已定義的中間件,如下圖中所示。
中間件描述文件格式:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: <COMPONENT NAME>
namespace: <NAMESPACE>
spec:
type: middleware.http.<MIDDLEWARE TYPE>
version: v1
metadata:
- name: <KEY>
value: <VALUE>
- name: <KEY>
value: <VALUE>
...
中間件類型由 type
字段決定。組件設置值,如速率限制,OAuth 憑據和其他設置被放入 metadata
部分。
當前支持 http 類型 type 包含:
接下來在 Dapr 配置中配置中間件順序,格式如下:
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
spec:
httpPipeline:
handlers:
- name: <COMPONENT NAME>
type: middleware.http.<MIDDLEWARE TYPE>
- name: <COMPONENT NAME>
type: middleware.http.<MIDDLEWARE TYPE>
3、限定組件作用作用域
Dapr 組件的名稱空間(注意與 Kubernetes 名稱空間概念區分),這意味着 Dapr runtime 實例只能訪問已部署到同一名稱空間的組件。
當 Dapr 運行時,它將自己的配置名稱空間與其加載的組件的命名空間進行匹配,並且僅初始化與其名稱空間匹配的組件。並且不會加載不同命名空間中的所有其他組件。
名稱空間可用於限制組件訪問特定的 Dapr 實例。
例如:指定組件的命名空間
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: statestore
namespace: production
spec:
type: state.redis
version: v1
metadata:
- name: redisHost
value: redis-master:6379
如果設置命名空間後,則在調用服務時需指定命名空間:如
https://localhost:3500/v1.0/invoke/myapp.production/method/ping
開發人員和操作員可能希望將一個數據庫的訪問權限限制爲某個應用程序或一組特定應用程序。爲此,Dapr 允許您在組件 YAML 上指定 scopes` 作用域。添加到組件的這些應用程序作用域僅限制具有特定 ID 的應用程序才能使用該組件。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: statestore
namespace: production
spec:
type: state.redis
version: v1
metadata:
- name: redisHost
value: redis-master:6379
scopes:
- app1
- app2
上面示例演示如何給予兩個啓用的 Dapr 應用訪問權限, 使用 app1和app2 兩個應用程序可以訪問名爲 `statestore` 的 Redis 組件,這個組件部署在 `production` 命名空間
四、總結
組件就是構建塊的功能實現,接來下準備對 Dapr 實現的商場項目進一步探索。進一步對 Dapr 深入瞭解及應用
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/Vyuv_Ox76unyCZ50ZlIIrQ