操作:配置具有多个命名空间的 Pub/Sub 组件

多个命名空间下使用Dapr Pub/Sub

在某些场景下,应用程序分布在不同的命名空间,并通过PubSub共享一个队列或主题。 在这种情况下,必须在每个命名空间上都提供PubSub组件。

Note

命名空间是一个Dapr里的,用于确定应用程序和组件的作用范围概念。 这个例子使用的是Kubernetes的命名空间,然而Dapr组件的命名空间范围可以在任何支持的平台上使用。 Read How-To: Scope components to one or more applications for more information on scoping components.

这个例子使用了PubSub示例。 Redis安装和其订阅者在namespace-a中,而发布者UI在namespace-b中。 如果Redis安装在另一个命名空间上,或者使用Azure ServiceBus、AWS SNS/SQS或GCP PubSub等云服务,该解决方案也同样奏效。

这是一个使用命名空间的示例图片。

Multiple namespaces - 图1

下表描述了部署的资源和所在命名空间的对应关系:

资源namespace-anamespace-b
Redis masterX
Redis slaveX
Dapr’s PubSub componentXX
Node subscriberX
Python subscriberX
React UI publisherX

前提

设置namespace-a

创建命名空间并用kubectl切入。

  1. kubectl create namespace namespace-a
  2. kubectl config set-context --current --namespace=namespace-a

Install Redis (master and slave) on namespace-a, following these instructions.

现在,配置deploy/redis.yaml,注意包含namespace-a的主机名。

  1. apiVersion: dapr.io/v1alpha1
  2. kind: Component
  3. metadata:
  4. name: pubsub
  5. spec:
  6. type: pubsub.redis
  7. version: v1
  8. metadata:
  9. - name: "redisHost"
  10. value: "redis-master.namespace-a.svc:6379"
  11. - name: "redisPassword"
  12. value: "YOUR_PASSWORD"

将资源部署到namespace-a

  1. kubectl apply -f deploy/redis.yaml
  2. kubectl apply -f deploy/node-subscriber.yaml
  3. kubectl apply -f deploy/python-subscriber.yaml

设置namespace-b

创建命名空间并用kubectl切入。

  1. kubectl create namespace namespace-b
  2. kubectl config set-context --current --namespace=namespace-b

将资源部署到namespace-b,包括Redis组件:

  1. kubectl apply -f deploy/redis.yaml
  2. kubectl apply -f deploy/react-form.yaml

现在,找到react-form的IP地址,在浏览器上打开它,并将消息发布到每个主题(A、B、C)。

  1. kubectl get service -A

确认订阅者收到信息

切换回 namespace-a:

  1. kubectl config set-context --current --namespace=namespace-a

查找POD名称:

  1. kubectl get pod # 复制POD名称并在接下来的命令中使用。

显示日志:

  1. kubectl logs node-subscriber-XYZ node-subscriber
  2. kubectl logs python-subscriber-XYZ python-subscriber

浏览器上发布的消息应该会显示在相应用户的日志中。 Node.js订阅者接收的消息类型为 “A “和 “B”,而Python订阅者接收的消息类型为 “A “和 “C”。

清理

  1. kubectl delete -f deploy/redis.yaml --namespace namespace-a
  2. kubectl delete -f deploy/node-subscriber.yaml --namespace namespace-a
  3. kubectl delete -f deploy/python-subscriber.yaml --namespace namespace-a
  4. kubectl delete -f deploy/react-form.yaml --namespace namespace-b
  5. kubectl delete -f deploy/redis.yaml --namespace namespace-b
  6. kubectl config set-context --current --namespace=default
  7. kubectl delete namespace namespace-a
  8. kubectl delete namespace namespace-b

相关链接