Java 远程Kafka连接问题-代理可能不可用
我正在学习卡夫卡,并且已经跨越到使用Maven 我在AWS中有一个独立的Kafka实例,在笔记本电脑上有一个Maven应用程序。我已经编写了一个小应用程序,作为生产者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
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");
}
}