This is the multi-page printable view of this section. Click here to print.

Return to the regular view of this page.

Dapr 教程

通过深入的示例学习如何使用 Dapr 概念

您已经初始化了 Dapr 并尝试了一些构建块,现在可以浏览我们更详细的教程。

在您开始之前

教程

得益于我们庞大的 Dapr 社区,我们提供的教程既托管在 Dapr 文档上,也托管在我们的 GitHub 仓库上。

Dapr 文档教程描述
定义一个组件创建一个组件定义文件以与 Secrets 构建块交互。
配置 State & Pub/sub为 Dapr 配置状态存储和发布/订阅消息代理组件。
GitHub 教程描述
Hello World推荐
演示如何在本地运行 Dapr,主要展示服务调用和状态管理。
Hello World Kubernetes推荐
演示如何在 Kubernetes 中运行 Dapr,主要展示服务调用和状态管理。
分布式计算器演示一个分布式计算器应用,使用 Dapr 服务驱动 React Web 应用。主要展示多语言编程、服务调用和状态管理。
Pub/Sub演示如何使用 Dapr 启用发布/订阅应用,使用 Redis 作为发布/订阅组件的实现。
Bindings演示如何使用 Dapr 创建与其他组件的输入和输出绑定,使用 Kafka 作为绑定的实现。
可观测性演示 Dapr 的追踪能力,使用 Zipkin 作为追踪组件。
Secret Store演示使用 Dapr Secrets API 访问密钥存储。

1 - 定义一个组件

创建一个组件定义文件以与secrets构建块交互

在构建应用程序时,通常需要根据所需的构建块和特定组件创建组件文件定义。

在本教程中,您将创建一个组件定义文件以与secrets构建块API交互:

  • 创建一个本地JSON密钥存储。
  • 使用组件定义文件向Dapr注册密钥存储。
  • 使用Dapr HTTP API获取密钥。

步骤1:创建一个JSON密钥存储

  1. 创建一个名为my-components的新目录以保存新的密钥和组件文件:

    mkdir my-components
    
  2. 进入此目录。

    cd my-components
    
  3. Dapr支持多种类型的密钥存储,但在本教程中,创建一个名为mysecrets.json的本地JSON文件,其中包含以下密钥:

{
   "my-secret" : "I'm Batman"
}

步骤2:创建一个密钥存储Dapr组件

  1. 创建一个新文件localSecretStore.yaml,内容如下:

    apiVersion: dapr.io/v1alpha1
    kind: Component
    metadata:
      name: my-secret-store
      namespace: default
    spec:
      type: secretstores.local.file
      version: v1
      metadata:
      - name: secretsFile
        value: ./mysecrets.json
      - name: nestedSeparator
        value: ":"
    

在上述文件定义中:

  • type: secretstores.local.file 指定Dapr使用本地文件组件作为密钥存储。
  • 元数据字段提供了与此组件一起使用所需的特定信息。在这种情况下,密钥存储JSON路径是相对于您执行dapr run命令的位置。

步骤3:运行Dapr sidecar

启动一个Dapr sidecar,它将在端口3500上监听一个名为myapp的空应用程序:

对于PowerShell环境:

dapr run --app-id myapp --dapr-http-port 3500 --resources-path ../

对于非PowerShell环境:

dapr run --app-id myapp --dapr-http-port 3500 --resources-path .

步骤4:获取一个密钥

在一个单独的终端中,运行:

curl http://localhost:3500/v1.0/secrets/my-secret-store/my-secret
Invoke-RestMethod -Uri 'http://localhost:3500/v1.0/secrets/my-secret-store/my-secret'

输出:

{"my-secret":"I'm Batman"}
下一步:设置一个Pub/sub代理 >>

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

为 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 快速入门