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]

 格式说明:  

字段必填详情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秒 5m1h20s
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深入了解及应用 

posted @ 2021-12-05 20:29  chaney1992  阅读(1143)  评论(0编辑  收藏  举报