发布订阅代理
为 Dapr 发布订阅配置不同消息代理的指南
Dapr 与发布订阅消息总线集成,为应用程序提供创建事件驱动、松耦合架构的能力,在这种架构中,生产者通过主题向消费者发送事件。
Dapr 支持为每个应用配置多个命名的发布订阅组件。每个发布订阅组件都有一个名称,在发布消息主题时会使用该名称。有关如何发布和订阅主题的详细信息,请参阅 API 参考。
发布订阅组件是可扩展的。支持的发布订阅组件列表可以在这里找到,实现可以在 components-contrib 仓库中找到。
组件文件
发布订阅通过 Component 文件进行描述:
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: pubsub
namespace: default
spec:
type: pubsub.<NAME>
version: v1
metadata:
- name: <KEY>
value: <VALUE>
- name: <KEY>
value: <VALUE>
...
发布订阅的类型由 type 字段决定,连接字符串等属性和其他元数据放置在 .metadata 部分。
尽管元数据值可以明文形式包含密钥,但建议您使用 secretKeyRef 来引用密钥存储。
主题创建
根据您使用的发布订阅消息总线及其配置方式,主题可能会自动创建。即使消息总线支持自动主题创建,在生产环境中禁用它也是常见的治理实践。您可能仍需要使用 CLI、管理控制台或申请表单来手动创建应用程序所需的主题。虽然所有发布订阅组件都支持 consumerID 元数据,但如果您不提供,运行时会创建一个消费者 ID。所有组件元数据字段值都可以携带模板化元数据值,这些值在 Dapr 边车启动时解析。
例如,您可以选择使用 {namespace} 作为 consumerGroup,以便在不同命名空间中使用相同的 appId 和相同的主题,如本文所述。
访问本指南以获取配置和使用发布订阅组件的说明。
相关链接
1 - HowTo: 配置多命名空间的发布订阅组件
在多命名空间中使用 Dapr 发布订阅
在某些场景中,应用程序可以分布在多个命名空间中,并通过 PubSub 共享队列或主题。在这种情况下,必须在每个命名空间中配置 PubSub 组件。
Note
命名空间是用于限定应用程序和组件范围的 Dapr 概念。本示例使用 Kubernetes 命名空间,但 Dapr 组件命名空间范围限定可用于任何受支持的平台。阅读
How-To: 将组件限定到一个或多个应用程序 以了解有关组件范围限定的更多信息。
本示例使用 PubSub 示例。Redis 安装和订阅者位于 namespace-a 中,而发布者 UI 位于 namespace-b 中。如果 Redis 安装在另一个命名空间中,或者您使用托管云服务(如 Azure ServiceBus、AWS SNS/SQS 或 GCP PubSub),此解决方案也可以工作。
这是使用命名空间的示例图。

下表显示了哪些资源部署到哪些命名空间:
| 资源 | namespace-a | namespace-b |
|---|
| Redis master | ✅ | ❌ |
| Redis replicas | ✅ | ❌ |
| Dapr 的 PubSub 组件 | ✅ | ✅ |
| Node 订阅者 | ✅ | ❌ |
| Python 订阅者 | ✅ | ❌ |
| React UI 发布者 | ❌ | ✅ |
前置条件
设置 namespace-a
创建命名空间并切换 kubectl 以使用它。
kubectl create namespace namespace-a
kubectl config set-context --current --namespace=namespace-a
在 namespace-a 上安装 Redis(主节点和从节点),按照这些说明进行操作。
现在,配置 deploy/redis.yaml,注意包含 namespace-a 的主机名。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: pubsub
spec:
type: pubsub.redis
version: v1
metadata:
- name: "redisHost"
value: "redis-master.namespace-a.svc:6379"
- name: "redisPassword"
value: "YOUR_PASSWORD"
将资源部署到 namespace-a:
kubectl apply -f deploy/redis.yaml
kubectl apply -f deploy/node-subscriber.yaml
kubectl apply -f deploy/python-subscriber.yaml
设置 namespace-b
创建命名空间并切换 kubectl 以使用它。
kubectl create namespace namespace-b
kubectl config set-context --current --namespace=namespace-b
将资源部署到 namespace-b,包括 Redis 组件:
kubectl apply -f deploy/redis.yaml
kubectl apply -f deploy/react-form.yaml
现在,找到 react-form 的 IP 地址,在浏览器中打开它并向每个主题(A、B 和 C)发布消息。
kubectl get service -A
确认订阅者收到消息。
切换回 namespace-a:
kubectl config set-context --current --namespace=namespace-a
查找 POD 名称:
kubectl get pod # 复制 POD 名称并在下一个命令中使用。
显示日志:
kubectl logs node-subscriber-XYZ node-subscriber
kubectl logs python-subscriber-XYZ python-subscriber
在浏览器上发布的消息应显示在相应订阅者的日志中。Node.js 订阅者接收类型为 “A” 和 “B” 的消息,而 Python 订阅者接收类型为 “A” 和 “C” 的消息。
清理
kubectl delete -f deploy/redis.yaml --namespace namespace-a
kubectl delete -f deploy/node-subscriber.yaml --namespace namespace-a
kubectl delete -f deploy/python-subscriber.yaml --namespace namespace-a
kubectl delete -f deploy/react-form.yaml --namespace namespace-b
kubectl delete -f deploy/redis.yaml --namespace namespace-b
kubectl config set-context --current --namespace=default
kubectl delete namespace namespace-a
kubectl delete namespace namespace-b
相关链接