我是GCP的新手。
我在Google Cloud Platform中创建了一个多节点Kafka和Zookeeper集群。通过使用gcloud shell
登录到VM,我可以访问Kafka二进制文件并在群集内进行通信。现在,我想在Java应用程序中访问这些Kafka代理。
每个VM提供内部IP和外部IP。当我使用外部IP时,我的Java应用程序无法识别该IP。拥有Google云经验的人可以帮助我在Java应用中访问这些节点。
这是我要使用的Java代码
public class AvroConsumer<T> {
private static Properties kafkaProps;
static {
kafkaProps = new Properties();
kafkaProps.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
kafkaProps.put("bootstrap.servers", "instance-1:9092,instance-2:9092,instance-3:9092");
kafkaProps.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class);
kafkaProps.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ByteArrayDeserializer.class);
kafkaProps.put(ConsumerConfig.GROUP_ID_CONFIG, "AvroConsumer-GroupOne");
}
public void recieveRecord() throws IOException {
try (KafkaConsumer<String, byte[]> kafkaConsumer = new KafkaConsumer<>(kafkaProps)) {
kafkaConsumer.subscribe(Arrays.asList("jason"));
while (true) {
ConsumerRecords<String, byte[]> records = kafkaConsumer.poll(100);
Schema.Parser parser = new Schema.Parser();
final Schema schema = parser
.parse(AvroProducer.class.getClassLoader().getResourceAsStream("syslog.avsc"));
records.forEach(record -> {
SpecificDatumReader<T> datumReader = new SpecificDatumReader<>(schema);
ByteArrayInputStream is = new ByteArrayInputStream(record.value());
BinaryDecoder binaryDecoder = DecoderFactory.get().binaryDecoder(is, null);
try {
T log = datumReader.read(null, binaryDecoder);
System.out.println("Value: " + log);
} catch (IOException e) {
e.printStackTrace();
}
});
}
}
}
}
Edit1:
我尝试如下配置server.properties。
listeners=INTERNAL://${internal-ip}:19092,EXTERNAL://${external-ip}:9092
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
advertised.listeners=INTERNAL://${internal-ip}:19092,EXTERNAL://${external-ip}:9092
inter.broker.listener.name=INTERNAL
它不起作用