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

Return to the regular view of this page.

配置存储组件说明

与Dapr接口的支持配置存储

Table headers to note:

HeaderDescriptionExample
StatusComponent certification statusAlpha
Beta
Stable
Component versionThe version of the componentv1
Since runtime versionThe version of the Dapr runtime when the component status was set or updated1.11

Generic

ComponentStatusComponent versionSince runtime version
PostgreSQLStablev11.11
RedisStablev11.11

Microsoft Azure

ComponentStatusComponent versionSince runtime version
Azure App ConfigurationAlphav11.9

1 - Azure 应用配置

详细介绍 Azure 应用配置组件

组件格式

要设置 Azure 应用配置,需创建一个类型为 configuration.azure.appconfig 的组件。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: <NAME>
spec:
  type: configuration.azure.appconfig
  version: v1
  metadata:
  - name: host # 使用 Azure 身份验证时应使用此项。
    value: <HOST>
  - name: connectionString # 使用 Azure 身份验证时不应使用此项。
    value: <CONNECTIONSTRING>
  - name: maxRetries
    value: # 可选
  - name: retryDelay
    value: # 可选
  - name: maxRetryDelay
    value: # 可选
  - name: azureEnvironment # 可选,默认为 AZUREPUBLICCLOUD
    value: "AZUREPUBLICCLOUD"
  # 请参阅下方的身份验证部分以了解所有选项
  - name: azureTenantId # 可选
    value: "[your_service_principal_tenant_id]"
  - name: azureClientId # 可选
    value: "[your_service_principal_app_id]"
  - name: azureCertificateFile # 可选
    value : "[pfx_certificate_file_fully_qualified_local_path]"
  - name: subscribePollInterval # 可选
    value: #可选 [格式示例 - 24h]

规格元数据字段

字段必需详情示例
connectionStringY*Azure 应用配置实例的连接字符串。无默认值。可以使用 secretKeyRef 引用 secret。*与 host 字段互斥。*在使用 Azure 身份验证 时不使用Endpoint=https://foo.azconfig.io;Id=osOX-l9-s0:sig;Secret=00000000000000000000000000000000000000000000
hostN*Azure 应用配置实例的端点。无默认值。*与 connectionString 字段互斥。*在使用 Azure 身份验证 时使用https://dapr.azconfig.io
maxRetriesN最大重试次数,默认为 35, 10
retryDelayN初始重试延迟时间,默认为 4 秒;"-1" 禁用重试延迟。延迟会随着每次重试呈指数增长,直到达到 maxRetryDelay 指定的最大值。4s
maxRetryDelayN允许的最大重试延迟时间,通常大于或等于 retryDelay。默认为 120 秒;"-1" 禁用限制120s
subscribePollIntervalN轮询订阅键以检测更改的间隔时间(以纳秒为单位)。未来将更新为 Go 时间格式。默认间隔为 24 小时。24h

注意:必须指定 hostconnectionString

使用连接字符串进行身份验证

通过连接字符串访问应用配置实例,该字符串可在 Azure 门户中获取。由于连接字符串包含敏感信息,建议将其视为 secret 并使用 secret 存储

使用 Microsoft Entra ID 进行身份验证

Azure 应用配置组件还支持使用 Microsoft Entra ID 进行身份验证。在启用此组件之前:

  • 阅读Azure 身份验证文档。
  • 创建一个 Microsoft Entra ID 应用程序(也称为服务主体)。
  • 或者,为您的应用程序平台创建托管身份。

设置 Azure 应用配置

您需要一个 Azure 订阅来设置 Azure 应用配置。

  1. 启动 Azure 应用配置创建流程。如有必要,请登录。

  2. 点击 创建 以启动 Azure 应用配置实例的部署。

  3. 创建实例后,获取 端点连接字符串

    • 对于端点:导航到资源的 概览 并复制 端点
    • 对于连接字符串:导航到 设置 > 访问密钥 并复制连接字符串。
  4. 将端点或连接字符串添加到 Dapr 的 azappconfig.yaml 文件中。

    host 键设置为 [Endpoint] 或将 connectionString 键设置为您之前保存的值。

Azure 应用配置请求元数据

在 Azure 应用配置中,您可以为同一键定义不同标签的值。例如,您可以为开发和生产环境定义不同的值。您可以指定在连接到应用配置时要加载的标签。

Azure 应用配置组件支持以下可选的 label 元数据属性:

label:要检索的配置的标签。如果不存在,配置存储将返回指定键和空标签的配置。

标签可以通过请求 URL 中的查询参数指定:

GET curl http://localhost:<daprPort>/v1.0/configuration/<store-name>?key=<key name>&metadata.label=<label value>

相关链接

2 - PostgreSQL

PostgreSQL 配置存储组件的详细说明

组件格式

要配置 PostgreSQL 作为配置存储,您需要创建一个类型为 configuration.postgresql 的组件。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: <NAME>
spec:
  type: configuration.postgresql
  version: v1
  metadata:
    # 连接字符串
    - name: connectionString
      value: "host=localhost user=postgres password=example port=5432 connect_timeout=10 database=config"
    # 存储配置信息的表名
    - name: table
      value: "[your_configuration_table_name]" 
    # 数据库操作的超时时间,以秒为单位(可选)
    #- name: timeoutInSeconds
    #  value: 20
    # 存储状态的表名(可选)
    #- name: tableName
    #  value: "state"
    # 存储 Dapr 使用的元数据的表名(可选)
    #- name: metadataTableName
    #  value: "dapr_metadata"
    # 清理过期行的间隔时间,以秒为单位(可选)
    #- name: cleanupIntervalInSeconds
    #  value: 3600
    # 该组件池化的最大连接数(可选)
    #- name: maxConns
    #  value: 0
    # 连接关闭前的最大空闲时间(可选)
    #- name: connectionMaxIdleTime
    #  value: 0
    # 控制查询执行的默认模式。(可选)
    #- name: queryExecMode
    #  value: ""
    # 如果希望使用 PostgreSQL 作为 actor 的状态存储,请取消注释此项(可选)
    #- name: actorStateStore
    #  value: "true"

规格元数据字段

使用连接字符串进行身份验证

以下元数据选项是通过 PostgreSQL 连接字符串进行身份验证时必需的。

字段必需详情示例
connectionStringYPostgreSQL 数据库的连接字符串。有关如何定义连接字符串的信息,请参阅 PostgreSQL 数据库连接文档"host=localhost user=postgres password=example port=5432 connect_timeout=10 database=my_db"

使用 Microsoft Entra ID 进行身份验证

使用 Microsoft Entra ID 进行身份验证支持 Azure Database for PostgreSQL。Dapr 支持的所有身份验证方法都可以使用,包括客户端凭据(“服务主体”)和托管身份。

字段必需详情示例
useAzureADY必须设置为 true 以使组件能够从 Microsoft Entra ID 检索访问令牌。"true"
connectionStringYPostgreSQL 数据库的连接字符串。
这必须包含用户,该用户对应于 PostgreSQL 内部创建的用户的名称,该用户映射到 Microsoft Entra ID 身份;这通常是相应主体的名称(例如 Microsoft Entra ID 应用程序的名称)。此连接字符串不应包含任何密码。
"host=mydb.postgres.database.azure.com user=myapplication port=5432 database=my_db sslmode=require"
azureTenantIdNMicrosoft Entra ID 租户的 ID"cd4b2887-304c-…"
azureClientIdN客户端 ID(应用程序 ID)"c7dd251f-811f-…"
azureClientSecretN客户端 secret(应用程序密码)"Ecy3X…"

使用 AWS IAM 进行身份验证

使用 AWS IAM 进行身份验证支持所有版本的 PostgreSQL 类型组件。 连接字符串中指定的用户必须是数据库中已存在的用户,并且是授予 rds_iam 数据库角色的 AWS IAM 启用用户。 身份验证基于 AWS 身份验证配置文件,或提供的 AccessKey/SecretKey。 AWS 身份验证令牌将在其到期时间之前动态旋转。

字段必需详情示例
useAWSIAMY必须设置为 true 以使组件能够从 AWS IAM 检索访问令牌。此身份验证方法仅适用于 AWS Relational Database Service for PostgreSQL 数据库。"true"
connectionStringYPostgreSQL 数据库的连接字符串。
这必须包含一个已存在的用户,该用户对应于 PostgreSQL 内部创建的用户的名称,该用户映射到 AWS IAM 策略。此连接字符串不应包含任何密码。请注意,数据库名称字段由 AWS 中的 dbname 表示。
"host=mydb.postgres.database.aws.com user=myapplication port=5432 dbname=my_db sslmode=require"
awsRegionN这保持与现有字段的向后兼容性。它将在 Dapr 1.17 中被弃用。请改用 ‘region’。AWS Relational Database Service 部署到的 AWS 区域。"us-east-1"
awsAccessKeyN这保持与现有字段的向后兼容性。它将在 Dapr 1.17 中被弃用。请改用 ‘accessKey’。与 IAM 帐户关联的 AWS 访问密钥"AKIAIOSFODNN7EXAMPLE"
awsSecretKeyN这保持与现有字段的向后兼容性。它将在 Dapr 1.17 中被弃用。请改用 ‘secretKey’。与访问密钥关联的 secret 密钥"wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
awsSessionTokenN这保持与现有字段的向后兼容性。它将在 Dapr 1.17 中被弃用。请改用 ‘sessionToken’。要使用的 AWS 会话令牌。仅当您使用临时安全凭证时才需要会话令牌。"TOKEN"

其他元数据选项

字段必需详情示例
tableY配置信息的表名,必须小写。configtable
timeoutN数据库操作的超时时间,作为 Go duration。整数被解释为秒数。默认为 20s"30s", 30
maxConnsN该组件池化的最大连接数。设置为 0 或更低以使用默认值,默认值为 4 或 CPU 数量中的较大者。"4"
connectionMaxIdleTimeN在连接池中未使用的连接自动关闭之前的最大空闲时间。默认情况下,没有值,这由数据库驱动程序选择。"5m"
queryExecModeN控制查询执行的默认模式。默认情况下,Dapr 使用扩展协议并自动准备和缓存准备好的语句。然而,这可能与代理如 PGBouncer 不兼容。在这种情况下,可能更适合使用 execsimple_protocol"simple_protocol"

设置 PostgreSQL 作为配置存储

  1. 启动 PostgreSQL 数据库。

  2. 连接到 PostgreSQL 数据库并设置具有以下模式的配置表:

    字段数据类型可为空详情
    KEYVARCHARN持有配置属性的 "Key"
    VALUEVARCHARN持有配置属性的值
    VERSIONVARCHARN持有配置属性的版本
    METADATAJSONY以 JSON 形式持有元数据
    CREATE TABLE IF NOT EXISTS table_name (
      KEY VARCHAR NOT NULL,
      VALUE VARCHAR NOT NULL,
      VERSION VARCHAR NOT NULL,
      METADATA JSON
    );
    
  3. 在配置表上创建一个 TRIGGER。创建 TRIGGER 的示例函数如下:

    CREATE OR REPLACE FUNCTION notify_event() RETURNS TRIGGER AS $$
        DECLARE 
            data json;
            notification json;
    
        BEGIN
    
            IF (TG_OP = 'DELETE') THEN
                data = row_to_json(OLD);
            ELSE
                data = row_to_json(NEW);
            END IF;
    
            notification = json_build_object(
                              'table',TG_TABLE_NAME,
                              'action', TG_OP,
                              'data', data);
            PERFORM pg_notify('config',notification::text);
            RETURN NULL; 
        END;
    $$ LANGUAGE plpgsql;
    
  4. 使用标记为 data 的字段封装数据创建触发器:

    notification = json_build_object(
      'table',TG_TABLE_NAME,
      'action', TG_OP,
      'data', data
    );
    
  5. 在订阅配置通知时,应使用作为 pg_notify 属性提到的通道。

  6. 由于这是一个通用创建的触发器,将此触发器映射到 configuration table

    CREATE TRIGGER config
    AFTER INSERT OR UPDATE OR DELETE ON configtable
        FOR EACH ROW EXECUTE PROCEDURE notify_event();
    
  7. 在订阅请求中添加一个额外的元数据字段,键为 pgNotifyChannel,值应设置为在 pg_notify 中提到的相同 channel name。从上面的示例中,它应设置为 config

相关链接

3 - Redis

Redis 配置存储组件的详细信息

组件格式

要设置 Redis 配置存储,请创建一个类型为 configuration.redis 的组件。请参阅本指南了解如何创建和应用配置存储配置。

apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
  name: <NAME>
spec:
  type: configuration.redis
  version: v1
  metadata:
  - name: redisHost
    value: <address>:6379
  - name: redisPassword
    value: **************
  - name: useEntraID
    value: "true"
  - name: enableTLS
    value: <bool>

规格元数据字段

字段必需说明示例
redisHostYRedis 主机地址"localhost:6379"
redisPasswordNRedis 密码"password"
redisUsernameNRedis 主机的用户名。默认为空。确保您的 Redis 服务器版本为 6 或更高,并已正确创建 acl 规则。"username"
enableTLSN如果 Redis 实例支持带有公共证书的 TLS,则可以配置启用或禁用 TLS。默认为 "false""true", "false"
clientCertN客户端证书的内容,用于需要客户端证书的 Redis 实例。必须与 clientKey 一起使用,并且 enableTLS 必须设置为 true。建议使用秘密存储,如此处所述"----BEGIN CERTIFICATE-----\nMIIC..."
clientKeyN客户端私钥的内容,与 clientCert 一起用于身份验证。建议使用秘密存储,如此处所述"----BEGIN PRIVATE KEY-----\nMIIE..."
failoverN启用故障转移配置的属性。需要设置 sentinelMasterName。默认为 "false""true", "false"
sentinelMasterNameNSentinel 主名称。请参阅 Redis Sentinel 文档"", "127.0.0.1:6379"
redisTypeNRedis 的类型。有两个有效值,一个是 "node" 表示单节点模式,另一个是 "cluster" 表示 Redis 集群模式。默认为 "node""cluster"
redisDBN连接到 Redis 后选择的数据库。如果 "redisType""cluster",则忽略此选项。默认为 "0""0"
redisMaxRetriesN在放弃之前重试命令的最大次数。默认情况下不重试失败的命令。"5"
redisMinRetryIntervalN每次重试之间 Redis 命令的最小回退。默认为 "8ms"; "-1" 禁用回退。"8ms"
redisMaxRetryIntervalN每次重试之间 Redis 命令的最大回退。默认为 "512ms";"-1" 禁用回退。"5s"
dialTimeoutN建立新连接的拨号超时。默认为 "5s""5s"
readTimeoutN套接字读取的超时。如果达到,Redis 命令将因超时而失败而不是阻塞。默认为 "3s""-1" 表示无超时。"3s"
writeTimeoutN套接字写入的超时。如果达到,Redis 命令将因超时而失败而不是阻塞。默认为 readTimeout。"3s"
poolSizeN最大套接字连接数。默认情况下,每个 CPU 的连接数为 10 个,由 runtime.NumCPU 报告。"20"
poolTimeoutN如果所有连接都忙,客户端在返回错误之前等待连接的时间。默认值为 readTimeout + 1 秒。"5s"
maxConnAgeN客户端退役(关闭)连接的连接年龄。默认情况下不关闭老化连接。"30m"
minIdleConnsN保持打开的最小空闲连接数,以避免与创建新连接相关的性能下降。默认为 "0""2"
idleCheckFrequencyN空闲连接清理器进行空闲检查的频率。默认为 "1m""-1" 禁用空闲连接清理器。"-1"
idleTimeoutN客户端关闭空闲连接的时间。应小于服务器的超时。默认为 "5m""-1" 禁用空闲超时检查。"10m"

设置 Redis

Dapr 可以使用任何 Redis 实例:无论是容器化的、在本地开发机器上运行的,还是托管的云服务。

当您运行 dapr init 时,会自动创建一个 Redis 实例作为 Docker 容器。

您可以使用 Helm 在 Kubernetes 集群中快速创建一个 Redis 实例。此方法需要安装 Helm

  1. 将 Redis 安装到您的集群中。请注意,我们显式设置了一个镜像标签以获取版本大于 5 的版本,这是 Dapr 的 pubsub 功能所需的。如果您打算仅将 Redis 用作状态存储(而不是用于 pubsub),则无需设置镜像版本。

    helm repo add bitnami https://charts.bitnami.com/bitnami
    helm install redis bitnami/redis --set image.tag=6.2
    
  2. 运行 kubectl get pods 查看现在在您的集群中运行的 Redis 容器。

  3. 在您的 redis.yaml 文件中将 redis-master:6379 添加为 redisHost。例如:

        metadata:
        - name: redisHost
          value: redis-master:6379
    
  4. 接下来,获取 Redis 密码,这在我们使用的操作系统上略有不同:

    • Windows: 运行 kubectl get secret --namespace default redis -o jsonpath="{.data.redis-password}" > encoded.b64,这将创建一个包含您编码密码的文件。接下来,运行 certutil -decode encoded.b64 password.txt,这将把您的 redis 密码放入一个名为 password.txt 的文本文件中。复制密码并删除这两个文件。

    • Linux/MacOS: 运行 kubectl get secret --namespace default redis -o jsonpath="{.data.redis-password}" | base64 --decode 并复制输出的密码。

    将此密码作为 redisPassword 值添加到您的 redis.yaml 文件中。例如:

        metadata:
        - name: redisPassword
          value: lhDOkwTlp0
    
  1. 使用官方 Microsoft 文档创建 Azure Cache for Redis 实例。

  2. 实例创建后,从 Azure 门户获取主机名(FQDN)和访问密钥。

    • 对于主机名:
      • 导航到资源的概览页面。
      • 复制主机名值。
    • 对于访问密钥:
      • 导航到设置 > 访问密钥
      • 复制并保存您的密钥。
  3. 将您的密钥和主机名添加到 Dapr 可以应用于您的集群的 redis.yaml 文件中。

    • 如果您正在运行示例,请将主机和密钥添加到提供的 redis.yaml 中。
    • 如果您从头开始创建项目,请按照组件格式部分中指定的创建 redis.yaml 文件。
  4. redisHost 键设置为 [HOST NAME FROM PREVIOUS STEP]:6379,并将 redisPassword 键设置为您之前保存的密钥。

    注意: 在生产级应用程序中,请遵循秘密管理说明以安全管理您的秘密。

  5. 启用 EntraID 支持:

    • 在您的 Azure Redis 服务器上启用 Entra ID 身份验证。这可能需要几分钟。
    • 设置 useEntraID"true" 以实现对 Azure Cache for Redis 的 EntraID 支持。
  6. 设置 enableTLS"true" 以支持 TLS。

注意:useEntraID 假设您的 UserPrincipal(通过 AzureCLICredential)或 SystemAssigned 托管身份具有 RedisDataOwner 角色权限。如果使用用户分配的身份,您需要指定 azureClientID 属性

相关链接