Kafka报错:java.net.ConnectException: Connection refused: no further information

Kafka报Connection refused错基本是每个新手都会遇见的挺常见的一个错误,大半原因都是因为配置文件配置错误(要么配置ip有问题,要么是端口问题)。我们都知道,关于消息的发布和订阅,从某种角度而言,Kafka比activeMQ更高效。但是启动kafka,首先要确保安装了zookeeper(建议安装zookeeper,避免采用Kafka自带)。

import java.util.Properties;

import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;

public class ProducerTest {

	public static void main(String[] args) {

		Properties props = new Properties(); //读取配置文件
		props.put("bootstrap.servers", "http://128.1.136.129:9092");
		
		//设置为all将导致记录的完整提交阻塞,最慢的,但最持久的设置。
		props.put("acks", "all");
		//如果请求失败,生产者也会自动重试,即使设置成0
		props.put("retries", 0);

		props.put("batch.size", 16384);
		// 默认立即发送,这里这是延时毫秒数
		props.put("linger.ms", 1);
		// 生产者缓冲大小,当缓冲区耗尽后,额外的发送调用将被阻塞。时间超过max.block.ms将抛出TimeoutException
		props.put("buffer.memory", 33554432);
		
		props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
		props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

		// 创建kafka的生产者类
		Producer<String, String> producer = new KafkaProducer<String, String>(props);
		// 生产者的主要方法
		producer.send(new ProducerRecord<String, String>("show", "测试Kafka"));

		producer.close();

	}

}

启动运行就会抛出如下异常:

java.net.ConnectException: Connection refused: no further information
    at sun.nio.ch.SocketChannelImpl.checkConnect(Native Method)
    at sun.nio.ch.SocketChannelImpl.finishConnect(SocketChannelImpl.java:739)
    at org.apache.kafka.common.network.PlaintextTransportLayer.finishConnect(PlaintextTransportLayer.java:51)
    at org.apache.kafka.common.network.KafkaChannel.finishConnect(KafkaChannel.java:73)
    at org.apache.kafka.common.network.Selector.pollSelectionKeys(Selector.java:323)
    at org.apache.kafka.common.network.Selector.poll(Selector.java:291)
    at org.apache.kafka.clients.NetworkClient.poll(NetworkClient.java:260)
    at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:236)
    at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:148)
    at java.lang.Thread.run(Thread.java:745)

首先检查配置,IP和端口没错,那么确认该9092的防火墙是否关闭(防火墙开启也会Connection refused),如果确认防火墙已经关闭,那么检查Kafka的配置:在/config/service.properties中,添加配置:host.name=128.1.136.129
为什么要配置IP呢?是因为kafka默认监听localhost的端口,所以如果你要连接远程服务器,必须配置IP。

启动自己安装的zookeeper服务命令:
nohup ./bin/kafka-server-start config/server-properties &

关闭防火墙将9092端口设置通过:
vi /etc/sysconfig/iptables
添加 -A INPUT -m state --state NEW -m tcp -p tcp --dport 9092 -j ACCEPT

然后重启防火墙:
systemctl restart iptables.service


启动自带的zookeeper服务命令(在kafka安装目录):
bin/zookeeper-server-start.sh config/zookeeper.properties

启动kafka服务
bin/kafka-server-start.sh config/server.properties

使用消费者客户端,监听show的topic,验证是否已经启动了Kafka
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic show --from-beginning

上述技巧基本可以解决大部分Connected Refused问题,但是今天我遇见个很有意思的,在windows环境下连接被拒,原因就是启动zookeeper以后就未管(其实zookeeper已经闪退),而是直接启动kafka。

需要注意啊,为什么建议自己安装zookeeper,而且启动命令用nohup(Linux环境下),就是避免退出窗口导致启动失效,windows环境下,如果启动zookeeper闪退,需要配置(网上教程很多)以保证zookeeper启动成功。

Connected Refused常见解决办法:

1.确认config里面的server.properties 正确(包括IP+端口,用hostname的话记得etc/hostnames下面查看全部配置上没,建议用hostname方便以后维护也减少错误)

2.服务器之间时间要统一

3.zkServer.sh start要确认全部启动(至少启动一半) 可以用JPS查看

4.java -version记得查看(确认jdk版本)

发布了185 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_39309402/article/details/103660085
今日推荐