使用kafka-clients收发消息

1,698 阅读2分钟

Maven依赖

<dependency>
  <groupId>org.apache.kafka</groupId>
  <artifactId>kafka-clients</artifactId>
  <version>2.4.0</version>
</dependency>

生产者

public class MyProducer {

    private static Producer<String, String> producer;

    public static void init() {
        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");

        producer = new KafkaProducer<>(props);
    }

    public static void main(String[] args) {
        init();

        for (int i = 0; i < 100; i++){
            producer.send(new ProducerRecord<>("my-topic", "test-key:"+ Integer.toString(i), "test-val:"+ Integer.toString(i)));
        }

        producer.close();
    }
}

消费者

public class MyConsumer {

    static KafkaConsumer<String, String> consumer;
    static final Pattern TOPIC = Pattern.compile("my-topic");

    public static void init() {
        Properties properties = new Properties();
        properties.put("bootstrap.servers", "localhost:9092, localhost:9093");
        properties.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        properties.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        properties.put("group.id", "1");

        consumer = new KafkaConsumer<>(properties);
        consumer.subscribe(TOPIC);
    }

    public static void main(String[] args) {
        init();
        try {
            while (true) {
                ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(100));
                for (ConsumerRecord<String, String> record : records) {
                    System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record
                            .value());
                }
            }
        } finally {
            consumer.close();
        }

    }

}

注意点

1. bootstrap.servers配置

这个不需要指定集群中所有的broker地址,kafka会根据其中一个broker找到集群中其他broker信息。但是最好多配置几个,防止某个broker挂掉了,还可以连接配置中其他的broker。

2. server.properties配置

listeners=PLAINTEXT://<hostname>:9092
advertised.listeners=PLAINTEXT://<broker的外网IP>:<broker端口>

advertised.listeners 是用于发布到 zookeeper 中提供给客户端连接的broker地址,如果没有配置 advertised.listeners ,那么就会把 listeners 配置的地址发送给生产者客户端。

"PLAINTEXT"表示协议,可选的值有PLAINTEXT和SSL,hostname可以指定IP地址,也可以用"0.0.0.0"表示对所有的网络接口有效,如果hostname为空表示只对默认的网络接口有效,也就是说如果你没有配置advertised.listeners,就使用listeners的配置通告给消息的生产者和消费者,这个过程是在生产者和消费者获取源数据(metadata)。如果都没配置,那么就使用java.net.InetAddress.getCanonicalHostName()返回的值,对于ipv4,基本就是localhost了。然后生产者就会一直卡死,没有反应,原因是你的客户端连接的是127.0.0.1:9092,而不是你期望的服务器的地址。