如何在Java应用程序中访问Google Compute Engine VM的外部ips

时间:2018-11-01 17:09:03

标签: java apache-kafka google-cloud-platform

我是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

它不起作用

0 个答案:

没有答案