Java 远程Kafka连接问题-代理可能不可用

Java 远程Kafka连接问题-代理可能不可用,java,maven,apache-kafka,Java,Maven,Apache Kafka,我正在学习卡夫卡,并且已经跨越到使用Maven 我在AWS中有一个独立的Kafka实例,在笔记本电脑上有一个Maven应用程序。我已经编写了一个小应用程序,作为生产者 import org.apache.kafka.clients.KafkaClient; import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerConfig; import o

我正在学习卡夫卡,并且已经跨越到使用Maven

我在AWS中有一个独立的Kafka实例,在笔记本电脑上有一个Maven应用程序。我已经编写了一个小应用程序,作为生产者

import org.apache.kafka.clients.KafkaClient;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

public class ProducerDemo {

    public static void main(String[] args) {
        // create producer properties
        Properties properties = new Properties();

        properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "<IP_TO_REMOTE_SERVER>:9092");

        properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());

        //create producer
        KafkaProducer<String,String> producer = new KafkaProducer<String, String>(properties);

       //producer record
        ProducerRecord <String,String> record = new ProducerRecord<String, String>("first_topic", "jello there");
        System.out.println("SENDING RECORD");
        //send data - async
        producer.send(record);

        producer.flush();

        producer.close();
        System.out.println("complete");
    }
}

我应该如何在服务器上配置Kafka,使其可以远程访问和侦听

我想您面临的主要问题是从配置的角度来看。在通过制作人沟通之前,请检查您是否已进行了所有必要的更改。您需要进行以下更改:

卡夫卡变化: 您需要在Zookeeper.properties中为相关代理添加配置

AWS更改:连接到AWS时,需要设置传递.pem文件的方式。您可能需要在AWS实例中启用直接访问。默认情况下,它将阻止所有未知流量

其他方法: 我建议创建一个证书和密钥文件,将您自己的PC列为有效源。 将该证书添加到AWS服务器实例上的密钥库和信任库。
更改server.properties
listeners=SSL://your.host.name:9092
&您的引导\u SERVERS\u CONFIG

看到响应后,我开始考虑更改配置以使其正常工作。我发现了一篇很好的博客文章来解决这个问题

我的设置

我要强调的是,这不是生产

公共子网中VPC中的单个AWS EC2实例。卡夫卡已安装。我正在使用Maven从笔记本电脑远程连接到卡夫卡作为制作人

不对zookeeper.properties进行更改

更新了服务器.properties,特别是侦听器和播发的.listeners

############################# Socket Server Settings #############################

# The address the socket server listens on. It will get the value returned from 
# java.net.InetAddress.getCanonicalHostName() if not configured.
#   FORMAT:
#     listeners = listener_name://host_name:port
#   EXAMPLE:
#     listeners = PLAINTEXT://your.host.name:9092
listeners=PLAINTEXT://<PRIVATE_IP_ADDRESS>:9092

# Hostname and port the broker will advertise to producers and consumers. If not set, 
# it uses the value for "listeners" if configured.  Otherwise, it will use the value
# returned from java.net.InetAddress.getCanonicalHostName().
advertised.listeners=PLAINTEXT://<PUBLIC_IP_ADDRESS>:9092
<代码>################################################服务器设置############################# #套接字服务器侦听的地址。它将从中获取返回的值 #java.net.InetAddress.getCanonicalHostName()如果未配置。 #格式: #侦听器=侦听器_name://host_name:port #例如: #listeners=PLAINTEXT://your.host.name:9092 侦听器=纯文本://:9092 #代理将向生产者和消费者公布主机名和端口。如果没有设置, #如果已配置,它将使用“侦听器”的值。否则,它将使用该值 #从java.net.InetAddress.getCanonicalHostName()返回。 播发。侦听器=纯文本://:9092 然后在我的Maven代码中,对于引导\u服务器\u配置我引用了公共IP

import org.apache.kafka.clients.KafkaClient;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

public class ProducerDemo {

    public static void main(String[] args) {
        // create producer properties
        Properties properties = new Properties();

        properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "<PUBLIC_IP_ADRESS>:9092");

        properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());

        //create producer
        KafkaProducer<String,String> producer = new KafkaProducer<String, String>(properties);

       //producer record
        ProducerRecord <String,String> record = new ProducerRecord<String, String>("first_topic", "good pony");
        System.out.println("SENDING RECORD");
        //send data - async
        producer.send(record);

        producer.flush();

        producer.close();
        System.out.println("complete");
    }
}
import org.apache.kafka.clients.KafkaClient;
导入org.apache.kafka.clients.producer.KafkaProducer;
导入org.apache.kafka.clients.producer.ProducerConfig;
导入org.apache.kafka.clients.producer.ProducerRecord;
导入org.apache.kafka.common.serialization.StringSerializer;
导入java.util.Properties;
公共类产品{
公共静态void main(字符串[]args){
//创建生产者属性
属性=新属性();
properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,“:9092”);
properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.CLASS.getName());
properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.CLASS.getName());
//创建制作人
卡夫卡制作人=新卡夫卡制作人(属性);
//制作人唱片
生产记录=新生产记录(“第一主题”、“好小马”);
System.out.println(“发送记录”);
//发送数据-异步
制作人。发送(记录);
producer.flush();
producer.close();
系统输出打印项次(“完成”);
}
}
这是成功的

发送记录

[kafka制作人网络线程|制作人-1]信息 org.apache.kafka.clients.Metadata-[Producer clientId=Producer-1]

[main]INFOorg.apache.kafka.clients.producer.KafkaProducer-[producer clientId=producer-1]使用timeoutMillis关闭卡夫卡制作人= 9223372036854775807毫秒

完整的

我们看到文本被推送到消费者手中


为什么不在“侦听器”部分使用公共IP地址?IP必须是可访问的,以便您可以连接到代理。我无法将“侦听器”设置为公共IP,因为EC2 VPC实例只知道它们的私有IP,而不是公共IP,因为它是由AWS进行NAT的。然而,你让我想。。。这篇博文提到了使用广告地址——将其设置为公共地址确实起到了作用。
import org.apache.kafka.clients.KafkaClient;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

public class ProducerDemo {

    public static void main(String[] args) {
        // create producer properties
        Properties properties = new Properties();

        properties.setProperty(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "<PUBLIC_IP_ADRESS>:9092");

        properties.setProperty(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        properties.setProperty(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,StringSerializer.class.getName());

        //create producer
        KafkaProducer<String,String> producer = new KafkaProducer<String, String>(properties);

       //producer record
        ProducerRecord <String,String> record = new ProducerRecord<String, String>("first_topic", "good pony");
        System.out.println("SENDING RECORD");
        //send data - async
        producer.send(record);

        producer.flush();

        producer.close();
        System.out.println("complete");
    }
}