1 - AWS 集成

Dapr 集成 AWS 服务

1.1 - AWS 认证

关于 AWS 的认证和配置选项的信息

Dapr 组件通过 AWS SDK 使用 AWS 服务(例如,DynamoDB、SQS、S3),并支持标准化的配置属性。了解更多关于 AWS SDK 如何处理凭证的信息

您可以使用 AWS SDK 的默认提供者链,或者选择以下列出的预定义 AWS 认证配置文件之一来进行认证配置。通过测试和检查 Dapr 运行时日志来验证组件配置,确保正确初始化。

术语

  • ARN (Amazon Resource Name): 用于唯一标识 AWS 资源的标识符。格式为:arn:partition:service:region:account-id:resource。示例:arn:aws:iam::123456789012:role/example-role
  • IAM (Identity and Access Management): AWS 提供的用于安全管理对 AWS 资源访问的服务。

认证配置文件

访问密钥 ID 和秘密访问密钥

使用静态访问密钥和秘密密钥凭证,可以通过组件元数据字段或通过默认 AWS 配置进行配置。

属性必需描述示例
regionY要连接的 AWS 区域。“us-east-1”
accessKeyNAWS 访问密钥 ID。在 Dapr v1.17 中将是必需的。“AKIAIOSFODNN7EXAMPLE”
secretKeyNAWS 秘密访问密钥,与 accessKey 一起使用。在 Dapr v1.17 中将是必需的。“wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY”
sessionTokenNAWS 会话令牌,与 accessKeysecretKey 一起使用。对于 IAM 用户密钥通常不需要。

假设 IAM 角色

此配置文件允许 Dapr 假设特定的 IAM 角色。通常在 Dapr sidecar 在 EKS 或链接到 IAM 策略的节点/pod 上运行时使用。目前由 Kafka 和 PostgreSQL 组件支持。

属性必需描述示例
regionY要连接的 AWS 区域。“us-east-1”
assumeRoleArnN具有 AWS 资源访问权限的 IAM 角色的 ARN。在 Dapr v1.17 中将是必需的。“arn:aws:iam::123456789:role/mskRole”
sessionNameN角色假设的会话名称。默认是 "DaprDefaultSession"“MyAppSession”

从环境变量获取凭证

使用环境变量进行认证。这对于在自托管模式下运行的 Dapr 特别有用,因为 sidecar 注入器不会配置环境变量。

此认证配置文件不需要任何元数据字段。

IAM Roles Anywhere

IAM Roles Anywhere 将基于 IAM 角色的认证扩展到外部工作负载。通过使用加密签名的证书,消除了长期凭证的需求,这些证书基于 Dapr PKI 的信任关系。Dapr SPIFFE 身份 X.509 证书用于认证到 AWS 服务,Dapr 在会话生命周期的一半时处理凭证轮换。

要配置此认证配置文件:

  1. 使用 Dapr 证书包作为 外部证书包 在信任的 AWS 账户中创建一个信任锚。
  2. 创建一个具有必要资源权限策略的 IAM 角色,以及一个为 Roles Anywhere AWS 服务指定的信任实体。在此处,您指定允许的 SPIFFE 身份。
  3. 在 Roles Anywhere 服务下创建一个 IAM 配置文件,链接 IAM 角色。
属性必需描述示例
trustAnchorArnY在 AWS 账户中授予 Dapr 证书颁发机构信任的信任锚的 ARN。arn:aws:rolesanywhere:us-west-1:012345678910:trust-anchor/01234568-0123-0123-0123-012345678901
trustProfileArnY在信任的 AWS 账户中的 AWS IAM 配置文件的 ARN。arn:aws:rolesanywhere:us-west-1:012345678910:profile/01234568-0123-0123-0123-012345678901
assumeRoleArnY在信任的 AWS 账户中要假设的 AWS IAM 角色的 ARN。arn:aws:iam:012345678910:role/exampleIAMRoleName

其他字段

一些 AWS 组件包括额外的可选字段:

属性必需描述示例
endpointN端点通常由 AWS SDK 内部处理。然而,在某些情况下,可能需要在本地设置它 - 例如,如果针对 DynamoDB Local 进行开发。

此外,支持 AWS 认证配置文件的非原生 AWS 组件(如 Kafka 和 PostgreSQL)具有触发 AWS 认证逻辑的元数据字段。请务必查看特定组件文档。

在组件清单文件中显式指定凭证的替代方案

在生产场景中,建议使用以下解决方案:

如果在 AWS EKS 上运行,您可以将 IAM 角色链接到 Kubernetes 服务账户,您的 pod 可以使用该账户。

所有这些解决方案都解决了同一个问题:它们允许 Dapr 运行时进程(或 sidecar)动态检索凭证,因此不需要显式凭证。这提供了几个好处,例如自动密钥轮换,以及避免管理 secret。

Kiam 和 Kube2IAM 都通过拦截对实例元数据服务的调用来工作。

在 AWS EC2 上以独立模式运行时使用实例配置文件

如果直接在 AWS EC2 实例上以独立模式运行 Dapr,您可以使用实例配置文件。

  1. 配置一个 IAM 角色。
  2. 将其附加到实例配置文件以用于 ec2 实例。

然后,Dapr 在 Dapr 组件清单中不指定凭证的情况下认证到 AWS。

在本地以独立模式运行 dapr 时认证到 AWS

在独立模式下运行 Dapr(或直接运行 Dapr 运行时)时,您可以将环境变量注入到进程中,如以下示例:

FOO=bar daprd --app-id myapp

如果您在本地配置了命名的 AWS 配置文件,您可以通过指定 “AWS_PROFILE” 环境变量来告诉 Dapr(或 Dapr 运行时)使用哪个配置文件:

AWS_PROFILE=myprofile dapr run...

AWS_PROFILE=myprofile daprd...

您可以使用任何支持的环境变量以这种方式配置 Dapr。

在 Windows 上,需要在启动 daprdaprd 命令之前设置环境变量,像在 Linux/MacOS 中那样内联设置是不支持的。

如果使用基于 AWS SSO 的配置文件认证到 AWS

如果您使用 AWS SSO 认证到 AWS,某些 AWS SDK(包括 Go SDK)尚不支持此功能。您可以使用几个实用程序来“弥合” AWS SSO 凭证和“传统”凭证之间的差距,例如:

如果使用 AwsHelper,像这样启动 Dapr:

AWS_PROFILE=myprofile awshelper dapr run...

AWS_PROFILE=myprofile awshelper daprd...

在 Windows 上,需要在启动 awshelper 命令之前设置环境变量,像在 Linux/MacOS 中那样内联设置是不支持的。

下一步

参考 AWS 组件规范 >>

相关链接

有关更多信息,请参阅如何 AWS SDK(Dapr 使用的)处理凭证

2 - Azure 集成

Dapr 集成 Azure 服务

2.1 - Azure 身份验证

了解如何使用 Microsoft Entra ID 或托管身份来进行 Azure 组件的身份验证

2.1.1 - Azure 身份验证

如何使用 Microsoft Entra ID 和/或托管身份验证 Azure 组件

大多数 Dapr 的 Azure 组件支持使用 Microsoft Entra ID 进行身份验证。通过这种方式:

  • 管理员可以充分利用 Azure 基于角色的访问控制 (RBAC) 的精细权限。
  • 在 Azure 服务(如 Azure 容器应用、Azure Kubernetes 服务、Azure 虚拟机或其他 Azure 平台服务)上运行的应用程序可以使用 托管身份 (MI)工作负载身份。这些功能使您的应用程序能够在不需要管理敏感凭据的情况下进行身份验证。

关于 Microsoft Entra ID 的身份验证

Microsoft Entra ID 是 Azure 的身份和访问管理 (IAM) 解决方案,用于对用户和服务进行身份验证和授权。

Microsoft Entra ID 基于 OAuth 2.0 等开放标准,允许服务(应用程序)获取访问令牌以请求 Azure 服务,包括 Azure 存储、Azure 服务总线、Azure 密钥保管库、Azure Cosmos DB、Azure PostgreSQL 数据库、Azure SQL 等。

在 Azure 术语中,应用程序也被称为“服务主体”。

一些 Azure 组件提供其他身份验证方法,例如基于“共享密钥”或“访问令牌”的系统。尽管这些方法在 Dapr 中是有效且受支持的,但建议尽可能使用 Microsoft Entra ID 对 Dapr 组件进行身份验证,以利用其众多优势,包括:

托管身份和工作负载身份

使用托管身份 (MI),您的应用程序可以通过 Microsoft Entra ID 进行身份验证并获取访问令牌以请求 Azure 服务。当您的应用程序在支持的 Azure 服务(如 Azure 虚拟机、Azure 容器应用、Azure Web 应用等)上运行时,可以在基础设施级别为您的应用程序分配一个身份。

使用 MI 后,您的代码无需处理凭据,这样可以:

  • 消除安全管理凭据的挑战
  • 允许开发和运营团队之间更好的职责分离
  • 减少有权访问凭据的人员数量
  • 简化操作,尤其是在使用多个环境时

在 Azure Kubernetes 服务上运行的应用程序可以类似地利用 工作负载身份 自动为单个 pod 提供身份。

基于角色的访问控制

使用支持服务的 Azure 基于角色的访问控制 (RBAC) 时,可以对应用程序授予的权限进行精细调整。例如,您可以限制对数据子集的访问或将访问权限设为只读。

审计

使用 Microsoft Entra ID 提供了改进的访问审计体验。租户的管理员可以查阅审计日志以跟踪身份验证请求。

(可选)使用证书进行身份验证

虽然 Microsoft Entra ID 允许您使用 MI,但您仍然可以选择使用证书进行身份验证。

对其他 Azure 环境的支持

默认情况下,Dapr 组件配置为与“公共云”中的 Azure 资源交互。如果您的应用程序部署到其他云(如 Azure 中国或 Azure 政府“主权云”),您可以通过将 azureEnvironment 元数据属性设置为以下支持的值之一来启用该功能:

  • Azure 公共云(默认):"AzurePublicCloud"
  • Azure 中国:"AzureChinaCloud"
  • Azure 政府:"AzureUSGovernmentCloud"

对主权云的支持是实验性的。

凭据元数据字段

要使用 Microsoft Entra ID 进行身份验证,您需要将以下凭据作为值添加到您的 Dapr 组件 的元数据中。

元数据选项

根据您向 Dapr 服务传递凭据的方式,您有多种元数据选项。

使用客户端凭据进行身份验证

字段必需详情示例
azureTenantIdYMicrosoft Entra ID 租户的 ID"cd4b2887-304c-47e1-b4d5-65447fdd542b"
azureClientIdY客户端 ID(应用程序 ID)"c7dd251f-811f-4ba2-a905-acd4d3f8f08b"
azureClientSecretY客户端密钥(应用程序密码)"Ecy3XG7zVZK3/vl/a2NSB+a1zXLa8RnMum/IgD0E"

在 Kubernetes 上运行时,您还可以使用对 Kubernetes secret 的引用来获取上述任何或所有值。

使用证书进行身份验证

字段必需详情示例
azureTenantIdYMicrosoft Entra ID 租户的 ID"cd4b2887-304c-47e1-b4d5-65447fdd542b"
azureClientIdY客户端 ID(应用程序 ID)"c7dd251f-811f-4ba2-a905-acd4d3f8f08b"
azureCertificateazureCertificateazureCertificateFile 之一证书和私钥(PFX/PKCS#12 格式)"-----BEGIN PRIVATE KEY-----\n MIIEvgI... \n -----END PRIVATE KEY----- \n -----BEGIN CERTIFICATE----- \n MIICoTC... \n -----END CERTIFICATE-----
azureCertificateFileazureCertificateazureCertificateFile 之一包含证书和私钥的 PFX/PKCS#12 文件的路径"/path/to/file.pem"
azureCertificatePasswordN如果加密,证书的密码"password"

在 Kubernetes 上运行时,您还可以使用对 Kubernetes secret 的引用来获取上述任何或所有值。

使用托管身份 (MI) 进行身份验证

字段必需详情示例
azureClientIdN客户端 ID(应用程序 ID)"c7dd251f-811f-4ba2-a905-acd4d3f8f08b"

使用托管身份,通常推荐使用 azureClientId 字段。使用系统分配的身份时该字段是可选的,但使用用户分配的身份时可能是必需的。

在 AKS 上使用工作负载身份进行身份验证

在 Azure Kubernetes 服务 (AKS) 上运行时,您可以使用工作负载身份对组件进行身份验证。请参阅 Azure AKS 文档以了解如何为您的 Kubernetes 资源 启用工作负载身份

使用 Azure CLI 凭据进行身份验证(仅限开发)

重要提示: 此身份验证方法仅推荐用于 开发

此身份验证方法在本地机器上开发时可能很有用。您将需要:

  • 安装 Azure CLI
  • 使用 az login 命令成功进行身份验证

当 Dapr 在主机上运行时,如果 Azure CLI 有可用的凭据,组件可以自动使用这些凭据进行身份验证,而无需配置其他身份验证方法。

使用此身份验证方法不需要设置任何元数据选项。

在 Dapr 组件中的示例用法

在此示例中,您将设置一个使用 Microsoft Entra ID 进行身份验证的 Azure 密钥保管库 secret 存储组件。

要使用 客户端密钥,请在组件目录中创建一个名为 azurekeyvault.yaml 的文件,并填写上述设置过程中的详细信息:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: azurekeyvault
  namespace: default
spec:
  type: secretstores.azure.keyvault
  version: v1
  metadata:
  - name: vaultName
    value: "[your_keyvault_name]"
  - name: azureTenantId
    value: "[your_tenant_id]"
  - name: azureClientId
    value: "[your_client_id]"
  - name: azureClientSecret
    value : "[your_client_secret]"

如果您想使用保存在本地磁盘上的 证书,请改用:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: azurekeyvault
  namespace: default
spec:
  type: secretstores.azure.keyvault
  version: v1
  metadata:
  - name: vaultName
    value: "[your_keyvault_name]"
  - name: azureTenantId
    value: "[your_tenant_id]"
  - name: azureClientId
    value: "[your_client_id]"
  - name: azureCertificateFile
    value : "[pfx_certificate_file_fully_qualified_local_path]"

在 Kubernetes 中,您将客户端密钥或证书存储到 Kubernetes Secret Store 中,然后在 YAML 文件中引用它们。

要使用 客户端密钥

  1. 使用以下命令创建一个 Kubernetes secret:

    kubectl create secret generic [your_k8s_secret_name] --from-literal=[your_k8s_secret_key]=[your_client_secret]
    
    • [your_client_secret] 是上面生成的应用程序客户端密钥
    • [your_k8s_secret_name] 是 Kubernetes secret store 中的 secret 名称
    • [your_k8s_secret_key] 是 Kubernetes secret store 中的 secret 键
  2. 创建一个 azurekeyvault.yaml 组件文件。

    组件 yaml 使用 auth 属性引用 Kubernetes secretstore,并且 secretKeyRef 引用存储在 Kubernetes secret store 中的客户端密钥。

    apiVersion: dapr.io/v1alpha1
    kind: Component
    metadata:
      name: azurekeyvault
      namespace: default
    spec:
      type: secretstores.azure.keyvault
      version: v1
      metadata:
      - name: vaultName
        value: "[your_keyvault_name]"
      - name: azureTenantId
        value: "[your_tenant_id]"
      - name: azureClientId
        value: "[your_client_id]"
      - name: azureClientSecret
        secretKeyRef:
          name: "[your_k8s_secret_name]"
          key: "[your_k8s_secret_key]"
    auth:
      secretStore: kubernetes
    
  3. 应用 azurekeyvault.yaml 组件:

    kubectl apply -f azurekeyvault.yaml
    

要使用 证书

  1. 使用以下命令创建一个 Kubernetes secret:

    kubectl create secret generic [your_k8s_secret_name] --from-file=[your_k8s_secret_key]=[pfx_certificate_file_fully_qualified_local_path]
    
    • [pfx_certificate_file_fully_qualified_local_path] 是您之前获取的 PFX 文件的路径
    • [your_k8s_secret_name] 是 Kubernetes secret store 中的 secret 名称
    • [your_k8s_secret_key] 是 Kubernetes secret store 中的 secret 键
  2. 创建一个 azurekeyvault.yaml 组件文件。

    组件 yaml 使用 auth 属性引用 Kubernetes secretstore,并且 secretKeyRef 引用存储在 Kubernetes secret store 中的证书。

    apiVersion: dapr.io/v1alpha1
    kind: Component
    metadata:
      name: azurekeyvault
      namespace: default
    spec:
      type: secretstores.azure.keyvault
      version: v1
      metadata:
      - name: vaultName
        value: "[your_keyvault_name]"
      - name: azureTenantId
        value: "[your_tenant_id]"
      - name: azureClientId
        value: "[your_client_id]"
      - name: azureCertificate
        secretKeyRef:
          name: "[your_k8s_secret_name]"
          key: "[your_k8s_secret_key]"
    auth:
      secretStore: kubernetes
    
  3. 应用 azurekeyvault.yaml 组件:

    kubectl apply -f azurekeyvault.yaml
    

下一步

生成新的 Microsoft Entra ID 应用程序和服务主体 >>

参考资料

2.1.2 - 如何创建新的 Microsoft Entra ID 应用程序和服务主体

了解如何创建 Microsoft Entra ID 应用程序并将其用作服务主体

先决条件

使用 Azure CLI 登录 Azure

在新终端中,运行以下命令:

az login
az account set -s [your subscription id]

创建 Microsoft Entra ID 应用程序

使用以下命令创建 Microsoft Entra ID 应用程序:

# 应用程序 / 服务主体的友好名称
APP_NAME="dapr-application"

# 创建应用程序
APP_ID=$(az ad app create --display-name "${APP_NAME}"  | jq -r .appId)

选择传递凭据的方式。

要创建一个客户端密钥,运行以下命令。

az ad app credential reset \
  --id "${APP_ID}" \
  --years 2

这将生成一个基于 base64 字符集的随机40字符长的密码。此密码有效期为2年,之后需要更新。

请保存返回的输出值;您将需要它们来让 Dapr 通过 Azure 进行身份验证。预期输出:

{
  "appId": "<your-app-id>",
  "password": "<your-password>",
  "tenant": "<your-azure-tenant>"
}

在将返回的值添加到您的 Dapr 组件的元数据时:

  • appIdazureClientId 的值
  • passwordazureClientSecret 的值(这是随机生成的)
  • tenantazureTenantId 的值

对于 PFX (PKCS#12) 证书,运行以下命令以创建自签名证书:

az ad app credential reset \
  --id "${APP_ID}" \
  --create-cert

注意: 自签名证书仅建议用于开发环境。在生产环境中,您应使用由 CA 签名并通过 --cert 标志导入的证书。

上述命令的输出应如下所示:

请保存返回的输出值;您将需要它们来让 Dapr 通过 Azure 进行身份验证。预期输出:

{
  "appId": "<your-app-id>",
  "fileWithCertAndPrivateKey": "<file-path>",
  "password": null,
  "tenant": "<your-azure-tenant>"
}

在将返回的值添加到您的 Dapr 组件的元数据时:

  • appIdazureClientId 的值
  • tenantazureTenantId 的值
  • fileWithCertAndPrivateKey 表示自签名 PFX 证书和私钥的位置。使用该文件的内容作为 azureCertificate(或将其写入服务器上的文件并使用 azureCertificateFile

注意: 虽然生成的文件具有 .pem 扩展名,但它包含编码为 PFX (PKCS#12) 的证书和私钥。

创建服务主体

一旦您创建了 Microsoft Entra ID 应用程序,为该应用程序创建一个服务主体。通过此服务主体,您可以授予其访问 Azure 资源的权限。

要创建服务主体,运行以下命令:

SERVICE_PRINCIPAL_ID=$(az ad sp create \
  --id "${APP_ID}" \
  | jq -r .id)
echo "服务主体 ID: ${SERVICE_PRINCIPAL_ID}"

预期输出:

服务主体 ID: 1d0ccf05-5427-4b5e-8eb4-005ac5f9f163

上面返回的值是服务主体 ID,它与 Microsoft Entra ID 应用程序 ID(客户端 ID)不同。服务主体 ID 在 Azure 租户内定义,用于授予应用程序访问 Azure 资源的权限。
您将使用服务主体 ID 授予应用程序访问 Azure 资源的权限。

同时,客户端 ID 由您的应用程序用于身份验证。您将在 Dapr 清单中使用客户端 ID 来配置与 Azure 服务的身份验证。

请记住,刚刚创建的服务主体默认没有访问任何 Azure 资源的权限。需要根据需要为每个资源授予访问权限,如组件文档中所述。

下一步

使用托管身份

2.1.3 - 如何使用托管身份

学习如何使用托管身份

托管身份可以自动进行身份验证,因为您的应用程序运行在具有系统分配或用户分配身份的 Azure 服务上。

要开始使用,您需要在各种 Azure 服务中启用托管身份作为服务选项/功能,这与 Dapr 无关。启用后,会在后台为 Microsoft Entra ID(以前称为 Azure Active Directory ID)创建一个身份(或应用程序)。

然后,您的 Dapr 服务可以利用该身份与 Microsoft Entra ID 进行认证,过程是透明的,您无需指定任何凭据。

在本指南中,您将学习如何:

  • 通过官方 Azure 文档将您的身份授予您正在使用的 Azure 服务
  • 在您的组件中设置系统管理或用户分配身份

以上是全部内容。

授予服务访问权限

为特定 Azure 资源(由资源范围标识)设置必要的 Microsoft Entra ID 角色分配或自定义权限给您的系统管理或用户分配身份。

您可以为新的或现有的 Azure 资源设置托管身份。说明取决于所使用的服务。请查看以下官方文档以获取最合适的说明:

在为您的 Azure 资源分配系统管理身份后,您将获得如下信息:

{
    "principalId": "<object-id>",
    "tenantId": "<tenant-id>",
    "type": "SystemAssigned",
    "userAssignedIdentities": null
}

请注意 principalId 值,这是为您的身份创建的 服务主体 ID。使用它来授予您的 Azure 资源组件访问权限。

在您的组件中设置身份

默认情况下,Dapr Azure 组件会查找其运行环境的系统管理身份并以此进行认证。通常,对于给定组件,除了服务名称、存储帐户名称和 Azure 服务所需的任何其他属性(在文档中列出)外,没有使用系统管理身份的必需属性。

对于用户分配身份,除了您正在使用的服务所需的基本属性外,您还需要在组件中指定 azureClientId(用户分配身份 ID)。确保用户分配身份已附加到 Dapr 运行的 Azure 服务上,否则您将无法使用该身份。

以下示例演示了在 Azure KeyVault secrets 组件中设置系统管理或用户分配身份。

如果您使用 Azure KeyVault 组件设置系统管理身份,YAML 将如下所示:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: azurekeyvault
spec:
  type: secretstores.azure.keyvault
  version: v1
  metadata:
  - name: vaultName
    value: mykeyvault

在此示例中,系统管理身份查找服务身份并与 mykeyvault 保管库通信。接下来,授予您的系统管理身份访问所需服务的权限。

如果您使用 Azure KeyVault 组件设置用户分配身份,YAML 将如下所示:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: azurekeyvault
spec:
  type: secretstores.azure.keyvault
  version: v1
  metadata:
  - name: vaultName
    value: mykeyvault
  - name: azureClientId
    value: someAzureIdentityClientIDHere

一旦您在组件 YAML 中设置了 azureClientId 属性,您就可以授予您的用户分配身份访问您的服务。

有关 Kubernetes 或 AKS 中的组件配置,请参阅 工作负载身份指南。

故障排除

如果您收到错误或托管身份未按预期工作,请检查以下项目是否为真:

  • 系统管理身份或用户分配身份没有目标资源的所需权限。

  • 用户分配身份未附加到您加载组件的 Azure 服务(容器应用或 pod)。这尤其可能发生在:

    • 您有一个未限定范围的组件(由环境中的所有容器应用或 AKS 集群中的所有部署加载的组件)。
    • 您仅将用户分配身份附加到 AKS 中的一个容器应用或一个部署(使用 Azure 工作负载身份)。

    在这种情况下,由于身份未附加到 AKS 中的每个其他容器应用或部署,引用用户分配身份的组件通过 azureClientId 失败。

最佳实践: 使用用户分配身份时,请确保将您的组件范围限定在特定应用上!

下一步

参考 Azure 组件规范 >>

2.2 - Azure API Management 与 Dapr 的集成策略

通过 Azure API Management 策略发布 Dapr 服务和组件的 API

Azure API Management 是一种用于为后端服务创建一致且现代的 API 网关的方法,其中也包括使用 Dapr 构建的服务。您可以在自托管的 API Management 网关中启用 Dapr 支持,从而实现以下功能:

  • 将请求转发至 Dapr 服务
  • 向 Dapr 发布/订阅主题发送消息
  • 激活 Dapr 输出绑定

试用 Dapr & Azure API Management 集成示例

了解更多关于 Dapr 集成策略的信息

2.3 - Azure Functions 运行时的 Dapr 扩展

在 Azure Functions 运行时应用程序中访问 Dapr 功能

Dapr 通过一个扩展与 Azure Functions 运行时 集成,使函数能够轻松地与 Dapr 交互。

  • Azure Functions 提供了一种事件驱动的编程模型。
  • Dapr 提供了云原生的构建模块。

该扩展结合了两者的优势,适用于无服务器和事件驱动的应用程序。

体验 Dapr 扩展 for Azure Functions

2.4 - 适用于 Azure Kubernetes Service (AKS) 的 Dapr 扩展

通过 Dapr 扩展在您的 Azure Kubernetes Service (AKS) 集群上部署 Dapr

在 AKS 上安装 Dapr 的推荐方法是使用 AKS Dapr 扩展。该扩展提供以下功能:

  • 通过 Azure CLI 命令行参数支持所有原生 Dapr 配置功能
  • 可选择自动升级 Dapr 运行时的小版本

使用 AKS 的 Dapr 扩展的先决条件:

了解有关 AKS 的 Dapr 扩展的更多信息

3 - Diagrid 集成

Dapr 和 Diagrid 的集成

3.1 - Conductor: 企业级 Dapr 的 Kubernetes 解决方案

自动化操作,执行安全最佳实践,提高系统稳定性,并增强 Dapr 集群的可视化能力


Diagrid Conductor 图示

Diagrid Conductor 能快速且安全地连接到所有运行 Dapr 和 Dapr 化应用程序的 Kubernetes 集群,提供卓越的操作管理、安全性、可靠性以及洞察力和协作能力。

Dapr 管理自动化

一键完成 Dapr 的安装、升级和修补,选择性应用更新并自动回滚,确保您始终使用最新版本。

智能顾问:发现并自动化最佳实践

提供信息并自动应用生产环境的最佳实践,持续监测以防止配置错误,提高安全性、可靠性和性能。

资源使用报告与优化

通过分析历史资源使用情况,推荐应用程序的资源优化方案,显著降低 CPU 和内存成本。

应用程序可视化工具

应用程序图表提供服务和基础设施组件的动态概览,促进开发与运维团队之间的协作。

了解更多关于 Diagrid Conductor

3.2 - 如何使用 Testcontainers Dapr 模块进行集成

在 Java 应用中集成 Dapr Testcontainer 模块

您可以通过 Diagrid 提供的 Testcontainers Dapr 模块,在本地为您的 Java 应用集成 Dapr。只需在您的 Maven 项目中添加以下依赖项:

<dependency>
    <groupId>io.diagrid.dapr</groupId>
    <artifactId>testcontainers-dapr</artifactId>
    <version>0.10.x</version>
</dependency>

如果您使用 Spring Boot,也可以使用 Spring Boot Starter。

了解更多关于 Testcontainers Dapr 模块

4 - 如何:使用 KEDA 自动扩展 Dapr 应用

如何配置您的 Dapr 应用程序以使用 KEDA 进行自动扩展

Dapr 通过其构建块 API 方法和众多 pubsub 组件,简化了消息处理应用程序的编写。由于 Dapr 可以在虚拟机、裸机、云或边缘 Kubernetes 等多种环境中运行,因此 Dapr 应用程序的自动扩展由其运行环境的管理层负责。

在 Kubernetes 环境中,Dapr 与 KEDA 集成,KEDA 是一个用于 Kubernetes 的事件驱动自动扩展器。Dapr 的许多 pubsub 组件与 KEDA 提供的扩展器功能相似,因此可以轻松配置您的 Dapr 部署在 Kubernetes 上使用 KEDA 根据负载进行自动扩展。

在本指南中,您将配置一个可扩展的 Dapr 应用程序,并在 Kafka 主题上进行负载管理。不过,您可以将此方法应用于 Dapr 提供的 任何 pubsub 组件

安装 KEDA

要安装 KEDA,请按照 KEDA 网站上的部署 KEDA说明进行操作。

安装和部署 Kafka

如果您无法访问 Kafka 服务,可以使用 Helm 将其安装到您的 Kubernetes 集群中以进行此示例:

helm repo add confluentinc https://confluentinc.github.io/cp-helm-charts/
helm repo update
kubectl create ns kafka
helm install kafka confluentinc/cp-helm-charts -n kafka \
		--set cp-schema-registry.enabled=false \
		--set cp-kafka-rest.enabled=false \
		--set cp-kafka-connect.enabled=false

检查 Kafka 部署的状态:

kubectl rollout status deployment.apps/kafka-cp-control-center -n kafka
kubectl rollout status deployment.apps/kafka-cp-ksql-server -n kafka
kubectl rollout status statefulset.apps/kafka-cp-kafka -n kafka
kubectl rollout status statefulset.apps/kafka-cp-zookeeper -n kafka

安装完成后,部署 Kafka 客户端并等待其准备就绪:

kubectl apply -n kafka -f deployment/kafka-client.yaml
kubectl wait -n kafka --for=condition=ready pod kafka-client --timeout=120s

创建 Kafka 主题

创建本示例中使用的主题(demo-topic):

kubectl -n kafka exec -it kafka-client -- kafka-topics \
		--zookeeper kafka-cp-zookeeper-headless:2181 \
		--topic demo-topic \
		--create \
		--partitions 10 \
		--replication-factor 3 \
		--if-not-exists

主题 partitions 的数量与 KEDA 为您的部署创建的最大副本数相关。

部署 Dapr pubsub 组件

为 Kubernetes 部署 Dapr Kafka pubsub 组件。将以下 YAML 粘贴到名为 kafka-pubsub.yaml 的文件中:

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: autoscaling-pubsub
spec:
  type: pubsub.kafka
  version: v1
  metadata:
    - name: brokers
      value: kafka-cp-kafka.kafka.svc.cluster.local:9092
    - name: authRequired
      value: "false"
    - name: consumerID
      value: autoscaling-subscriber

上述 YAML 定义了您的应用程序订阅的 pubsub 组件,以及 您之前创建的 (demo-topic)

如果您使用了 Kafka Helm 安装说明,可以保持 brokers 值不变。否则,请将此值更改为您的 Kafka brokers 的连接字符串。

注意为 consumerID 设置的 autoscaling-subscriber 值。此值用于确保 KEDA 和您的部署使用相同的 Kafka 分区偏移量,以便正确进行扩展。

现在,将组件部署到集群:

kubectl apply -f kafka-pubsub.yaml

为 Kafka 部署 KEDA 自动扩展器

部署 KEDA 扩展对象,该对象:

  • 监控指定 Kafka 主题上的滞后
  • 配置 Kubernetes 水平 Pod 自动扩展器 (HPA) 以扩展您的 Dapr 部署

将以下内容粘贴到名为 kafka_scaler.yaml 的文件中,并在需要的地方配置您的 Dapr 部署:

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: subscriber-scaler
spec:
  scaleTargetRef:
    name: <REPLACE-WITH-DAPR-DEPLOYMENT-NAME>
  pollingInterval: 15
  minReplicaCount: 0
  maxReplicaCount: 10
  triggers:
  - type: kafka
    metadata:
      topic: demo-topic
      bootstrapServers: kafka-cp-kafka.kafka.svc.cluster.local:9092
      consumerGroup: autoscaling-subscriber
      lagThreshold: "5"

让我们回顾一下上面文件中的一些元数据值:

描述
scaleTargetRef/name在部署中定义的应用程序的 Dapr ID(dapr.io/id 注释的值)。
pollingIntervalKEDA 检查 Kafka 当前主题分区偏移量的频率(以秒为单位)。
minReplicaCountKEDA 为您的部署创建的最小副本数。如果您的应用程序启动时间较长,最好将其设置为 1 以确保您的部署始终至少有一个副本在运行。否则,设置为 0,KEDA 会为您创建第一个副本。
maxReplicaCount您的部署的最大副本数。鉴于 Kafka 分区偏移量 的工作原理,您不应将该值设置得高于主题分区的总数。
triggers/metadata/topic应设置为您的 Dapr 部署订阅的相同主题(在本示例中为 demo-topic)。
triggers/metadata/bootstrapServers应设置为 kafka-pubsub.yaml 文件中使用的相同 broker 连接字符串。
triggers/metadata/consumerGroup应设置为 kafka-pubsub.yaml 文件中 consumerID 的相同值。

将 KEDA 扩展器部署到 Kubernetes:

kubectl apply -f kafka_scaler.yaml

全部完成!

查看 KEDA 扩展器工作

现在 ScaledObject KEDA 对象已配置,您的部署将根据 Kafka 主题的滞后进行扩展。了解有关为 Kafka 主题配置 KEDA 的更多信息

如 KEDA 扩展器清单中定义的,您现在可以开始向您的 Kafka 主题 demo-topic 发布消息,并在滞后阈值高于 5 个主题时观察 pod 自动扩展。使用 Dapr 发布 CLI 命令向 Kafka Dapr 组件发布消息。

下一步

了解有关在 Azure 容器应用中使用 KEDA 扩展 Dapr pubsub 或绑定应用程序的信息

5 - 如何:在 GitHub Actions 工作流中使用 Dapr CLI

将 Dapr CLI 集成到您的 GitHub Actions 中,以便在您的环境中部署和管理 Dapr。

Dapr 可以通过 GitHub Marketplace 上的 Dapr 工具安装器与 GitHub Actions 进行集成。这个安装器会将 Dapr CLI 添加到您的工作流中,使您能够在不同环境中部署、管理和升级 Dapr。

使用 Dapr 工具安装器安装 Dapr CLI

请将以下代码片段复制并粘贴到您的应用程序的 YAML 文件中:

- name: Dapr 工具安装器
  uses: dapr/setup-dapr@v1

dapr/setup-dapr action 可以在 macOS、Linux 和 Windows 运行器上安装指定版本的 Dapr CLI。安装完成后,您可以运行任何 Dapr CLI 命令 来管理您的 Dapr 环境。

有关所有输入的详细信息,请参阅 action.yml 元数据文件

示例

例如,如果您的应用程序使用了 Azure Kubernetes Service (AKS) 的 Dapr 扩展,那么您的应用程序 YAML 文件可能如下所示:

- name: 安装 Dapr
  uses: dapr/setup-dapr@v1
  with:
    version: '1.15.5'

- name: 初始化 Dapr
  shell: bash
  run: |
    # 获取用于 dapr init 的 K8s 凭据
    az aks get-credentials --resource-group ${{ env.RG_NAME }} --name "${{ steps.azure-deployment.outputs.aksName }}"

    # 初始化 Dapr    
    # 将 Dapr init 日志分组,以便可以折叠这些行。
    echo "::group::初始化 Dapr"
    dapr init --kubernetes --wait --runtime-version ${{ env.DAPR_VERSION }}
    echo "::endgroup::"

    dapr status --kubernetes
  working-directory: ./demos/demo3

下一步

6 - 如何:在你的 Dapr 应用中使用 gRPC 接口

在你的应用中使用 Dapr gRPC API

Dapr 提供了用于本地调用的 HTTP 和 gRPC API。gRPC 适用于低延迟、高性能的场景,并通过 proto 客户端进行语言集成。

在 Dapr SDK 文档中查找自动生成的客户端列表

Dapr 运行时提供了一个 proto 服务,应用可以通过 gRPC 与其通信。

除了通过 gRPC 调用 Dapr,Dapr 还支持通过代理方式进行服务到服务的调用。在 gRPC 服务调用指南中了解更多

本指南演示了如何使用 Go SDK 配置和调用 Dapr 的 gRPC。

配置 Dapr 通过 gRPC 与应用通信

在自托管模式下运行时,使用 --app-protocol 标志指定 Dapr 使用 gRPC 与应用通信。

dapr run --app-protocol grpc --app-port 5005 node app.js

这使 Dapr 通过端口 5005 使用 gRPC 与应用进行通信。

在 Kubernetes 上,在你的部署 YAML 中设置以下注解:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  namespace: default
  labels:
    app: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
      annotations:
        dapr.io/enabled: "true"
        dapr.io/app-id: "myapp"
        dapr.io/app-protocol: "grpc"
        dapr.io/app-port: "5005"
...

使用 gRPC 调用 Dapr

以下步骤展示了如何创建一个 Dapr 客户端并调用其 SaveStateData 操作。

  1. 导入包:

    package main
    
    import (
    	"context"
    	"log"
    	"os"
    
    	dapr "github.com/dapr/go-sdk/client"
    )
    
  2. 创建客户端:

    // 仅用于此演示
    ctx := context.Background()
    data := []byte("ping")
    
    // 创建客户端
    client, err := dapr.NewClient()
    if err != nil {
      log.Panic(err)
    }
    defer client.Close()
    
    1. 调用 SaveState 方法:
    // 使用键 key1 保存状态
    err = client.SaveState(ctx, "statestore", "key1", data)
    if err != nil {
      log.Panic(err)
    }
    log.Println("数据已保存")
    

现在你可以探索 Dapr 客户端上的所有不同方法。

使用 Dapr 创建 gRPC 应用

以下步骤将展示如何创建一个应用,该应用暴露一个服务器,Dapr 可以与之通信。

  1. 导入包:

    package main
    
    import (
    	"context"
    	"fmt"
    	"log"
    	"net"
    
    	"github.com/golang/protobuf/ptypes/any"
    	"github.com/golang/protobuf/ptypes/empty"
    
    	commonv1pb "github.com/dapr/dapr/pkg/proto/common/v1"
    	pb "github.com/dapr/dapr/pkg/proto/runtime/v1"
    	"google.golang.org/grpc"
    )
    
  2. 实现接口:

    // server 是我们的用户应用
    type server struct {
         pb.UnimplementedAppCallbackServer
    }
    
    // EchoMethod 是一个简单的演示方法
    func (s *server) EchoMethod() string {
    	return "pong"
    }
    
    // 当远程服务通过 Dapr 调用应用时,此方法被调用
    // 负载携带一个方法以识别方法、一组元数据属性和一个可选负载
    func (s *server) OnInvoke(ctx context.Context, in *commonv1pb.InvokeRequest) (*commonv1pb.InvokeResponse, error) {
    	var response string
    
    	switch in.Method {
    	case "EchoMethod":
    		response = s.EchoMethod()
    	}
    
    	return &commonv1pb.InvokeResponse{
    		ContentType: "text/plain; charset=UTF-8",
    		Data:        &any.Any{Value: []byte(response)},
    	}, nil
    }
    
    // Dapr 将调用此方法以获取应用想要订阅的主题列表。在此示例中,我们告诉 Dapr
    // 订阅名为 TopicA 的主题
    func (s *server) ListTopicSubscriptions(ctx context.Context, in *empty.Empty) (*pb.ListTopicSubscriptionsResponse, error) {
    	return &pb.ListTopicSubscriptionsResponse{
    		Subscriptions: []*pb.TopicSubscription{
    			{Topic: "TopicA"},
    		},
    	}, nil
    }
    
    // Dapr 将调用此方法以获取应用将被调用的绑定列表。在此示例中,我们告诉 Dapr
    // 使用名为 storage 的绑定调用我们的应用
    func (s *server) ListInputBindings(ctx context.Context, in *empty.Empty) (*pb.ListInputBindingsResponse, error) {
    	return &pb.ListInputBindingsResponse{
    		Bindings: []string{"storage"},
    	}, nil
    }
    
    // 每当从注册的绑定触发新事件时,此方法被调用。消息携带绑定名称、负载和可选元数据
    func (s *server) OnBindingEvent(ctx context.Context, in *pb.BindingEventRequest) (*pb.BindingEventResponse, error) {
    	fmt.Println("从绑定调用")
    	return &pb.BindingEventResponse{}, nil
    }
    
    // 每当消息发布到已订阅的主题时,此方法被触发。Dapr 在 CloudEvents 0.3 信封中发送已发布的消息。
    func (s *server) OnTopicEvent(ctx context.Context, in *pb.TopicEventRequest) (*pb.TopicEventResponse, error) {
    	fmt.Println("主题消息到达")
            return &pb.TopicEventResponse{}, nil
    }
    
  3. 创建服务器:

    func main() {
    	// 创建监听器
    	lis, err := net.Listen("tcp", ":50001")
    	if err != nil {
    		log.Fatalf("监听失败: %v", err)
    	}
    
    	// 创建 grpc 服务器
    	s := grpc.NewServer()
    	pb.RegisterAppCallbackServer(s, &server{})
    
    	fmt.Println("客户端启动中...")
    
    	// 并开始...
    	if err := s.Serve(lis); err != nil {
    		log.Fatalf("服务失败: %v", err)
    	}
    }
    

    这将在端口 50001 上为你的应用创建一个 gRPC 服务器。

运行应用

要在本地运行,使用 Dapr CLI:

dapr run --app-id goapp --app-port 50001 --app-protocol grpc go run main.go

在 Kubernetes 上,如上所述,在你的 pod 规范模板中设置所需的 dapr.io/app-protocol: "grpc"dapr.io/app-port: "50001 注解。

其他语言

你可以使用任何 Protobuf 支持的语言与 Dapr 一起使用,而不仅限于当前可用的生成 SDK。

使用 protoc 工具,你可以为其他语言(如 Ruby、C++、Rust 等)生成 Dapr 客户端。

相关主题

7 - 如何使用 Dapr Kubernetes Operator

通过 Dapr Kubernetes Operator 管理 Dapr 控制平面

您可以通过 Dapr Kubernetes Operator 来管理 Dapr 的控制平面。这个工具可以帮助您自动化管理在 Kubernetes 环境中 Dapr 控制平面的生命周期任务。

安装和使用 Dapr Kubernetes Operator

8 - 如何:与 Kratix 集成

使用 Dapr promise 与 Kratix 集成

Kratix 市场 中,Dapr 可以用于构建满足您需求的定制平台。

只需安装 Dapr Promise,即可在所有匹配的集群上安装 Dapr。

安装 Dapr Promise