前言:
前面文章對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]
格式說明:
字段 | 必填 | 詳情 | Example |
---|---|---|---|
apiVersion | Y | 您正在調用的Dapr版本(如果適用的話為 Kubernetes) API | dapr.io/v1alpha1 |
kind | Y | CRD的類型。 組件必須始終是 Component |
Component (組件) |
metadata | - | 有關組件注冊的信息 | |
metadata.name | Y | 組件的名稱 | prod-statestore |
metadata.namespace | N | 主機環境的命名空間 | myapp-namespace |
spec | - | 關於組件資源的詳細信息 | |
spec.type | Y | 組件類型 | state.redis |
spec.version | Y | 組件版本 | v1 |
spec.initTimeout | N | 組件初始化的超時時間 默認為30秒 | 5m , 1h , 20s |
spec.ignoreErrors | N | 如果組件加載失敗,請告訴Dapr sidecar 繼續初始化。 默認為 false | false |
spec.metadata | - | 一個組件特定配置的鍵/值。 查看你的組件字段定義 |
特殊值:
元數據值可以包含一個 {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
部分。
當前支持秘鑰存儲通用類型:
Name | 狀態 | 組件版本 | 自從 |
---|---|---|---|
Local environment variables | Beta | v1 | 1.0 |
Local file | Beta | v1 | 1.0 |
HashiCorp Vault | Alpha | v1 | 1.0 |
Kubernetes secrets | GA | v1 | 1.0 |
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包含:
Name | 說明 | 狀態 | 組件版本 |
---|---|---|---|
Rate limit | 限制每秒允許的 HTTP 請求的最大數量 | Alpha | v1 |
OAuth2 | 在Web API上啟用OAuth2授權授權流程 | Alpha | v1 |
OAuth2 client credentials | 在Web API上啟用OAuth2客戶端憑證授予流程 | Alpha | v1 |
Bearer | 使用 OpenID Connect在 Web API 上驗證 Bearer Token | Alpha | v1 |
Open Policy Agent | 將Rego/OPA策略應用到傳入的Dapr HTTP請求中 | Alpha | v1 |
Uppercase | 將請求的正文轉換為大寫字母 | GA (For local development) | v1 |
接下來在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深入了解及應用