Kafka 在 Windows 主机和 Linux 客户机上同时运行

Kafka 在 Windows 主机和 Linux 客户机上同时运行

我关注Pluralsight 课程“Apache Kafka 入门”,进入模块 4,了解如何使用 Kafka 生产器生成消息。然后,我想重现作者的演示,其中包括用 Java 创建和运行 Apache Kafka 生产器应用程序。这个想法完全是用 shell 程序完成的。集群设置:三个分区、三个代理、复制因子为 3。分区之间没有全局顺序。由于冗长的原因,日志、脚本代码和/或属性被避免使用。

从一开始,作者就设定了先决条件:Linux 操作系统、Java 8 JDK 和 Scala 2.11.x 安装。获得的 Kafka 版本是 2.11-0.10.0.1,这正是我正在使用的版本。此外,技术栈也是一样的。使用虚拟机,一切都很顺利,就像课程中举例说明的那样。我从生产者那里写入消息,然后由消费者显示它们。

关键在于前面提到的章节。对于一个新的演示,它引入并设置了 Apache Kafka 开发环境,添加了自己的依赖项并浏览了 API。因此,除了已经描述的先决条件之外,还有 Maven 和对测试 Kafka 集群的访问。该项目采用 IntelliJ IDEA 2016.2.2,使用 Java 1.8 SDK。最后,应用程序运行并生成消息,并且与上一个演示一样,这些消息打印在消费者控制台上。

对我来说有什么变化?我使用 Windows 10 作为主机,使用 IntelliJ IDEA 2023.1.5 进行编码和执行。另一方面,其余模块在客户机中运行,定义如下Vagrant文​​件,其中第三行还有config.vm.network :forwarded_port, guest: 9092, host: 9092, id: "kafka" # Map host's port 9092 to guest's port 9092

Vagrant.configure("2") do |config|
  config.vm.box = "hashicorp/bionic64"
  config.vm.network :forwarded_port, guest: 80, host: 8080, id: "http"  # Map host's port 8080 to guest's port 80
  config.vm.synced_folder "./practice", "/home/vagrant", type: "virtualbox"
end

尽管应用程序从我的主机端输出与 SLF4J 相同的内容,但我的客户端没有任何效果,这意味着消费者仍在等待。对于端口 9092 的情况,不到一分钟就会终止。这是可重现的代码片段,其中bootstrap.servers被简单地设置为localhost:9092遵循 Vagrant 变体:

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerRecord;

import java.util.Properties;

public class KafkaProducerApp {
    public static void main(String[] args) {

        // Create a properties dictionary for the required/optional Producer config settings:
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092,localhost:9093");
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        KafkaProducer<String, String> myProducer = new KafkaProducer<String, String>(props);

        try {
            for (int i = 0; i < 150; i++){
                myProducer.send(new ProducerRecord<String, String>("my-topic", Integer.toString(i),
                        "MyMessage: " + Integer.toString(i)));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            myProducer.close();
        }
    }
}

我做错了什么导致 Kafka 中没有消息可用? 哪些 Vagrant 配置缺少两个操作系统之间的有效通信? 我仍然尝试进行相应的修改,并按照建议进行操作这个帖子但没有成功。尽管有一些有用的解释,WinRM 是适合逆向场景的通信器。另外,我推测OpenSSL可能会带来与可执行源相关的安全风险。

提前感谢您的回复。

相关内容