Dapr 官方教程第五章(Dapr 绑定kafka) 电脑版发表于:2021/9/4 15:54 ![](https://img.tnblog.net/arcimg/hb/896fd38e95b346f9a0d98c54b135bb94.jpg) >#Dapr 官方教程第五章(Dapr 绑定kafka) [TOC] tn2>在本快速入门中,您将创建两个微服务,一个具有输入绑定,另一个具有输出绑定。您将绑定到 Kafka,但请注意,Dapr 可以绑定无数组件(请参阅 Dapr 组件)。 本快速入门包括两个微服务: ——使用输入绑定的 Node.js 微服务 ——使用输出绑定的 Python 微服务 这些绑定连接到 Kafka,允许我们将消息推送到 Kafka 实例(来自 Python 微服务)并从该实例(来自 Node 微服务)接收消息,而无需知道该实例的托管位置。相反,使用 Dapr API 通过 sidecar 进行连接。查看架构图以了解组件如何在本地互连: ![](https://img.tnblog.net/arcimg/hb/5c102938226243299fcca8ed4657386c.png) 先决条件 ------------ >### 在本地运行的先决条件 tn2>Dapr CLI 与 Dapr 初始化 Node.js 8 或更高版本 Python 3.4 或更高版本 ![](https://img.tnblog.net/arcimg/hb/ead0e91e20e545cbb36fae0f0f5f2657.png) >### 在 Kubernetes 中运行的先决条件 tn2>有dapr的k8s集群环境即可 本地运行 ------------ tn2>将此快速入门存储库克隆到您的本地计算机: ```bash git clone https://github.com/dapr/quickstarts.git cd quickstarts/bindings/ ``` 在本地运行 Kafka Docker 容器 ------------ tn2>为了在本地运行 Kafka 绑定快速入门,您将在机器上的 docker 容器中运行Kafka 代理服务器。 ```bash docker-compose -f ./docker-compose-single-kafka.yml up -d docker ps ``` ![](https://img.tnblog.net/arcimg/hb/8a47c33e6b4a41d8811b657fa02fa4a1.png) 使用输入绑定运行Node微服务 ------------ tn2>现在您的机器上本地运行了 Kafka,您需要运行微服务。您将首先运行使用输入绑定的 Node 微服务: ```bash # 在 CLI 中导航到 Node 订阅者目录 cd nodeapp/ # 安装依赖 npm install # 使用 Dapr 运行 Node 应用 dapr run --app-id bindings-nodeapp --app-port 3000 node app.js --components-path ../components ``` 使用输出绑定运行 Python 微服务 ------------ tn2>接下来,运行使用输出绑定的 Python 微服务 ```bash # 打开一个新的 CLI 窗口并导航到 CLI 中的 Python 订阅者目录 cd pythonapp/ # 安装依赖 pip3 install requests # 使用 Dapr 运行 Python 应用程序 dapr run --app-id bindings-pythonapp python3 app.py --components-path ../components ``` 观察日志 ------------ tn2>观察 Python 日志,其中显示了与 Kafka 的成功输出绑定: ![](https://img.tnblog.net/arcimg/hb/2bfa8cd29749474984eb6819d812a874.png) tn2>观察 Node 日志,其中显示了与 Kafka 的成功输入绑定: ![](https://img.tnblog.net/arcimg/hb/e6eacd284d934ed4b18e18c8f48744ee.png) 清理 ------------ tn2>要彻底停止 dapr 微服务,请运行: ```bash dapr stop --app-id bindings-nodeapp dapr stop --app-id bindings-pythonapp ``` ![](https://img.tnblog.net/arcimg/hb/24d57a75d4b0466c9f0326f0d9ee5a7a.png) tn2>完成后,您可以通过运行以下命令来关闭本地 Kafka Docker 容器: ```bash docker-compose -f ./docker-compose-single-kafka.yml down ``` ![](https://img.tnblog.net/arcimg/hb/06e84b6ad2a0408cb7df6e62605fa8a8.png) 在 Kubernetes 中运行 ------------ >### 在 Kubernetes 中设置 Kafka tn2>通过bitnami/kafka安装 Kafka ```bash helm repo add bitnami https://charts.bitnami.com/bitnami helm repo update kubectl create ns kafka helm install dapr-kafka bitnami/kafka --wait --namespace kafka -f ./kafka-non-persistence.yaml ``` tn2>等待 kafka pod 运行 ```bash kubectl -n kafka get pods -w ``` ![](https://img.tnblog.net/arcimg/hb/3f60709e197a4e9d81818e5d232365b8.png) k8s部署应用 ------------ tn2>现在 Kafka 绑定已设置,马上部署应用。 ```bash # 在您的 CLI 窗口中,在 bindings 目录中运行 kubectl apply -f ./deploy ``` tn2>这将部署 bindings-nodeapp 和 bindings-pythonapp 微服务。它还将应用您在上一步中设置的 Kafka 绑定组件配置。 Kubernetes 部署是异步的。这意味着您需要等待部署完成,然后才能继续下一步。您可以使用以下命令执行此操作: ```bash kubectl rollout status deploy/bindings-nodeapp kubectl rollout status deploy/bindings-pythonapp ``` ![](https://img.tnblog.net/arcimg/hb/d646a98cf133419c8f4fdd95240882b4.png) 观察日志 ------------ tn2>观察 Python 应用程序日志,其中显示了与 Kafka 的成功输出绑定: ```bash kubectl get pods ``` tn2>运行以下命令查看 Python 应用程序日志: ```bash kubectl logs --selector app=bindingspythonapp -c python --tail=-1 ``` ![](https://img.tnblog.net/arcimg/hb/a4ee8230fd994f1a9b1d1a1958961738.png) tn2>观察 Node 应用程序日志,其中显示了与 Kafka 的成功输入合并: ```bash kubectl logs --selector app=bindingsnodeapp -c node --tail=-1 ``` ![](https://img.tnblog.net/arcimg/hb/88d24eb6e57f445ab888085f294f6a70.png) 清理 ------------ tn2>完成后,您可以通过运行以下命令来减少 Kubernetes 删除: ```bash kubectl delete -f ./deploy ``` tn2>这将删除deploy目录中.yaml 文件定义的每个资源,包括 kafka 组件。 删除所有快速入门应用程序后,请删除集群中的 Kafka ```bash helm uninstall dapr-kafka --namespace kafka ``` tn2>最后,您可以删除 kafka 命名空间 ```bash kubectl delete ns kafka ``` 这个怎么运作 ------------ tn2>现在您已经在本地和/或 Kubernetes 中运行了快速入门,让我们解开这一切的工作原理。该应用程序分为输入绑定应用程序和输出绑定应用程序。 >### Kafka 绑定 yaml tn2>看应用程序代码之前,让我们看到了 kafka 绑定组件yamls(本地和Kubernetes)。 ——其中`brokers`规定了 kafka 的连接 ——topics并`consumerGroup`为消费者 ——`publishTopic`发行商的话题。 tn>看到HOWTO文档引用了输入和输出绑定的细节 此配置 yaml 创建`sample-topic`组件以通过 Kafkasample主题设置 Kafka 输入和输出绑定。 ```yaml apiVersion: dapr.io/v1alpha1 kind: Component metadata: name: sample-topic spec: type: bindings.kafka version: v1 metadata: # Kafka代理连接设置 - name: brokers value: [kafka broker address] # 消费者配置:主题和消费者组 - name: topics value: sample - name: consumerGroup value: group1 # 发布服务器配置:主题 - name: publishTopic value: sample - name: authRequired value: "false" ``` >### Node输入绑定应用 tn2>导航到该nodeapp目录并打开app.jsNode.js 输入绑定示例应用程序的代码。在这里,您使用 公开了一个 API 端点express。API 名称必须与 Kafka 绑定组件 yaml 中指定的组件名称相同。然后 Dapr 运行时将使用来自sample主题的事件,然后将带有事件负载的 POST 请求发送到 Node 应用程序。 ![](https://img.tnblog.net/arcimg/hb/45b08ffbad714b71ae6c49e5a73c7f82.png) >### Python 输出绑定应用程序 tn2>导航到`pythonapp`目录并打开`app.py`输出绑定示例应用程序的代码。这将每秒向 Dapr http 端点发送`http://localhost:3500/v1.0/bindings/<output_bindings_name>`带有事件负载的POST 请求。此应用程序使用`sample-topic`绑定组件名称作为`<output_bindings_name>`. 然后 Dapr 运行时将事件发送到sample上述 Kafka 绑定组件 yaml 中指定的主题。 ![](https://img.tnblog.net/arcimg/hb/57ae665c4eb2495aaf43c793dcaa07b5.png)