虽然在本地机器上或特定网络内设置Kafka并产生/消耗消息可能不是一项艰巨的任务,但当人们试图让它在网络上运行时,确实面临着挑战。
让我们考虑一个混合场景,即你的软件解决方案分布在两个不同的平台上(例如AWS和Azure或内部部署和Azure),并且需要将消息从一个平台上的Kafka集群路由到另一个平台上的Kafka集群。这可能是一个有效的业务场景,你正试图用一个云平台来整合你的解决方案,在这期间,你需要有这种路由,直到你完成迁移。即使从长远来看,由于各种业务和技术原因,也可能需要在多个平台上维护解决方案。
在这篇文章中,我们将讨论一个涉及本地机器(macOS)和Azure VM的简单设置。我们将讨论从本地机器向托管在Azure VM上的Kafka代理生成事件,以及在本地机器上消费这些事件的分步程序。虽然这并不包括上面描述的确切场景,但它给出了一个关于Kafka消息如何在网络上交换的合理想法。
前提条件
- 带有Ubuntu服务器的Azure虚拟机
- 安装了Homebrew的MacOS机器
在Azure VM上设置Kafka
更新软件包。
$ apt-get update
安装Java。
$ apt install default-jdk
下载Kafka。
$ wget https://downloads.apache.org/kafka/3.1.0/kafka_2.13-3.1.0.tgz
解压下载的文件。
$ tar -xzf kafka_2.13–3.1.0.tgz
改变目录到kafka_2.13-3.1.0。
$ cd kafka_2.13–3.1.0
启动ZooKeeper服务(在终端1)。
$ bin/zookeeper-server-start.sh config/zookeeper.properties
启动Kafka代理服务(在终端2)。
$ bin/kafka-server-start.sh config/server.properties
创建一个主题(在终端3)。
$ bin/kafka-topics.sh --create --topic azure-events --bootstrap-server localhost:9092
启动Kafka生产者(在终端3)并将事件写入上述主题。
$ bin/kafka-console-producer.sh --topic azure-events --bootstrap-server localhost:9092
启动Kafka消费者(在终端4)并从上述主题中读取事件。
$ bin/kafka-console-consumer.sh --topic azure-events --from-beginning --bootstrap-server localhost:9092
如果我们能够在Azure VM上无缝地生产和消费事件,这意味着上述设置是成功的,我们可以继续前进。
在本地机器(macOS)上设置Kafka
安装Java。
$ brew cask install java
安装Kafka。
$ brew install kafka
启动ZooKeeper服务(在终端1)。
$ zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties
启动Kafka代理服务(在终端2)。
$ kafka-server-start /usr/local/etc/kafka/server.properties
创建一个主题(在终端3)。
$ kafka-topics --create --topic local-events --bootstrap-server localhost:9092
启动Kafka生产者(在终端3)并将事件写到上述主题中。
$ kafka-console-producer --topic local-events --bootstrap-server localhost:9092
启动Kafka消费者(在终端4)并从上述主题中读取事件。
$ kafka-console-consumer --topic local-events --from-beginning --bootstrap-server localhost:9092
如果你能够在本地机器上无缝地生产和消费事件,这意味着上述设置是成功的,我们可以继续前进。
将本地机器连接到Azure VM以交换Kafka消息
通过创建入站安全规则,在Azure VM上打开9092端口。这可以通过Azure门户在VM的网络设置下完成。
转到本地机器上的/usr/local/etc/kafka/server.properties文件。取消注释并更新广告监听器。添加Azure VM的公共IP地址来代替你的.host.name。
advertised.listeners=PLAINTEXT://your.host.name:9092)
在本地机器上重新启动ZooKeeper服务(在终端1)。
$ zookeeper-server-start /usr/local/etc/kafka/zookeeper.properties
在本地机器上重新启动Kafka代理服务(在终端2)。
$ kafka-server-start /usr/local/etc/kafka/server.properties
重启Kafka生产者(在终端3),但这次要把事件写入Azure VM上的Kafka主题,而不是本地Kafka主题。另外,使用Azure VM的公共IP而不是本地主机。
$ kafka-console-producer --topic azure-events --bootstrap-server <Azure VM Public IP>:9092
重新启动Kafka消费者(在终端4),但这次要从Azure VM上的Kafka主题而不是本地Kafka主题中读取事件。同时,使用Azure VM的公共IP,而不是localhost。
$ kafka-console-consumer --topic azure-events --from-beginning --bootstrap-server <Azure VM Public IP>:9092
确保ZooKeeper和Kafka代理服务仍在Azure VM上照常运行。如果你能够无缝地生产和消费事件,这意味着上述设置是成功的。
这样我们就到了本文的结尾。虽然这里考虑了带有Ubuntu服务器的Azure虚拟机和带有macOS的本地机器,但类似的练习也可以在Azure虚拟机上使用任何其他Linux风味,在本地机器上使用Windows操作系统。在这种情况下,命令会有一些不同。