教程:配置状态存储和发布/订阅消息代理

为 Dapr 配置状态存储和发布/订阅消息代理组件

要使用状态和发布/订阅功能,您需要配置两个组件:

  • 用于数据持久化和恢复的状态存储组件。
  • 用于异步消息传递的发布/订阅消息代理组件。

您可以在以下链接找到支持的组件列表:

本教程将介绍如何使用 Redis 进行配置。

步骤 1:创建 Redis 存储

Dapr 可以使用任何 Redis 实例,无论是:

  • 在本地开发环境中运行的容器化实例,还是
  • 托管在云服务上的实例。

如果您已经有一个 Redis 实例,请直接跳到配置部分。


在自托管环境中,Dapr CLI 会在初始化过程中自动安装 Redis。您可以直接进行下一步


您可以使用 Helm 在 Kubernetes 集群中创建 Redis 实例。在开始之前,请确保已安装 Helm v3

在集群中安装 Redis:

helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
helm install redis bitnami/redis --set image.tag=6.2

Dapr 的发布/订阅功能至少需要 Redis 版本 5。对于状态存储,您可以使用更低版本。 如果您在本地环境中工作,可以在 install 命令中添加 --set architecture=standalone,以创建单副本 Redis 设置,从而节省内存和资源。

运行 kubectl get pods 查看集群中运行的 Redis 容器:

$ kubectl get pods
NAME             READY   STATUS    RESTARTS   AGE
redis-master-0   1/1     Running   0          69s
redis-replicas-0    1/1     Running   0          69s
redis-replicas-1    1/1     Running   0          22s

在 Kubernetes 中:

  • 主机名为 redis-master.default.svc.cluster.local:6379
  • secret redis 会自动创建。

确保您拥有 Azure 订阅。

  1. 打开并登录 Azure 门户 以创建 Azure Redis 缓存。
  2. 填写必要的信息。
    • Dapr 发布/订阅使用 Redis 5.0 引入的 Redis 流。要使用 Azure Redis 缓存进行发布/订阅,请将版本设置为 (PREVIEW) 6
  3. 点击 创建 以启动 Redis 实例的部署。
  4. 从 Azure 门户的 概览 页面中记下 Redis 实例主机名以备后用。
    • 它应该看起来像 xxxxxx.redis.cache.windows.net:6380
  5. 实例创建后,获取您的访问密钥:
    1. 导航到 设置 下的 访问密钥

    2. 创建一个 Kubernetes secret 来存储您的 Redis 密码:

      kubectl create secret generic redis --from-literal=redis-password=*********
      

  1. AWS Redis 部署一个 Redis 实例。

  2. 记下 AWS 门户中的 Redis 主机名以备后用。

  3. 创建一个 Kubernetes secret 来存储您的 Redis 密码:

    kubectl create secret generic redis --from-literal=redis-password=*********
    

  1. GCP Cloud MemoryStore 部署一个 MemoryStore 实例。

  2. 记下 GCP 门户中的 Redis 主机名以备后用。

  3. 创建一个 Kubernetes secret 来存储您的 Redis 密码:

    kubectl create secret generic redis --from-literal=redis-password=*********
    

步骤 2:配置 Dapr 组件

Dapr 使用组件定义来管理构建块功能。以下步骤将指导您如何将上面创建的资源连接到 Dapr,以用于状态和发布/订阅。

定位您的组件文件


在自托管模式下,组件文件会自动创建在:

  • Windows: %USERPROFILE%\.dapr\components\
  • Linux/MacOS: $HOME/.dapr/components

由于 Kubernetes 文件是通过 kubectl 应用的,因此可以在任何目录中创建。

创建状态存储组件

创建一个名为 redis-state.yaml 的文件,并粘贴以下内容:


apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
  namespace: default
spec:
  type: state.redis
  version: v1
  metadata:
  - name: redisHost
    value: localhost:6379
  - name: redisPassword
    secretKeyRef:
      name: redis
      key: redis-password
  # 取消注释以下内容以通过 TLS 连接到 redis 缓存实例(例如 - Azure Redis 缓存)
  # - name: enableTLS
  #   value: true 

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
  namespace: default
spec:
  type: state.redis
  version: v1
  metadata:
  - name: redisHost
    value: <REPLACE WITH HOSTNAME FROM ABOVE - for Redis on Kubernetes it is redis-master.default.svc.cluster.local:6379>
  - name: redisPassword
    secretKeyRef:
      name: redis
      key: redis-password
  # 取消注释以下内容以通过 TLS 连接到 redis 缓存实例(例如 - Azure Redis 缓存)
  # - name: enableTLS
  #   value: true 

请注意,上述代码示例使用了您在设置集群时创建的 Kubernetes secret。

创建发布/订阅消息代理组件

创建一个名为 redis-pubsub.yaml 的文件,并粘贴以下内容:


apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: pubsub
  namespace: default
spec:
  type: pubsub.redis
  version: v1
  metadata:
  - name: redisHost
    value: localhost:6379
  - name: redisPassword
    secretKeyRef:
      name: redis
      key: redis-password
 # 取消注释以下内容以通过 TLS 连接到 redis 缓存实例(例如 - Azure Redis 缓存)
  # - name: enableTLS
  #   value: true 

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: pubsub
  namespace: default
spec:
  type: pubsub.redis
  version: v1
  metadata:
  - name: redisHost
    value: <REPLACE WITH HOSTNAME FROM ABOVE - for Redis on Kubernetes it is redis-master.default.svc.cluster.local:6379>
  - name: redisPassword
    secretKeyRef:
      name: redis
      key: redis-password
 # 取消注释以下内容以通过 TLS 连接到 redis 缓存实例(例如 - Azure Redis 缓存)
  # - name: enableTLS
  #   value: true 

请注意,上述代码示例使用了您在设置集群时创建的 Kubernetes secret。

硬编码密码(不推荐)

仅用于开发目的,您可以跳过创建 Kubernetes secret 并将密码直接放入 Dapr 组件文件中:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: statestore
  namespace: default
spec:
  type: state.redis
  version: v1
  metadata:
  - name: redisHost
    value: <HOST>
  - name: redisPassword
    value: <PASSWORD>
  # 取消注释以下内容以通过 TLS 连接到 redis 缓存实例(例如 - Azure Redis 缓存)
  # - name: enableTLS
  #   value: true 
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: pubsub
  namespace: default
spec:
  type: pubsub.redis
  version: v1
  metadata:
  - name: redisHost
    value: <HOST>
  - name: redisPassword
    value: <PASSWORD>
  # 取消注释以下内容以通过 TLS 连接到 redis 缓存实例(例如 - Azure Redis 缓存)
  # - name: enableTLS
  #   value: true 

步骤 3:应用配置


当您运行 dapr init 时,Dapr 会在您的本地机器上创建一个默认的 redis pubsub.yaml。通过打开您的组件目录进行验证:

  • 在 Windows 上,位于 %UserProfile%\.dapr\components\pubsub.yaml
  • 在 Linux/MacOS 上,位于 ~/.dapr/components/pubsub.yaml

对于新的组件文件:

  1. 在您的应用程序文件夹中创建一个包含 YAML 文件的 components 目录。
  2. 使用 --resources-path 标志为 dapr run 命令提供路径

如果您在精简模式(无 Docker)下初始化了 Dapr,您需要手动创建默认目录,或者始终使用 --resources-path 指定组件目录。


运行 kubectl apply -f <FILENAME> 以应用状态和发布/订阅文件:

kubectl apply -f redis-state.yaml
kubectl apply -f redis-pubsub.yaml

下一步

尝试 Dapr 快速入门