使用java代码进行远程k
文章目录
afka集群的生产者写消息(Produce)操作
本文面向的读者是:通过xsehll等工具在远程服务器上操作kafka集群正确,此时想使用java代码操作远程kafka集群的读者。因为其中还是有不少坑,希望可以帮到跟我有相同的困扰的同学。
本人使用的kafka版本为2.8.0,使用版本在kafka2.x的本文均有效。
1、修改kafka配置
配置文件在 你的kafka解压目录下的config/server.properties中
broker.id=1
listeners=PLAINTEXT://ranYanQiang:9092
advertised.listeners=PLAINTEXT://公网ip:9092 #这里为了防止哪位同学来我的服务器上捣乱,就隐藏我的公网ip
log.dirs=/usr/local/kafka-cluster/kafka-1/log
zookeeper.connect=ranYanQiang:2181,ranYanQiang:2182,17ranYanQiang:2183 #我这里搭建的是伪集群,但是真集群与伪集群差别不大,也就是真集群以ip区分服务,伪集群以端口区分服务。
其中除了advertised.listeners之外,都是kafka集群的基本配置,不必多说。这里想强调的是listeners和advertised.listeners,容易看出,前者和后者均配置了ip加端口号,其中前者为内网ip后者为公网ip,kafka集群通过内网ip进行通信,外部程序可以通过公网ip访问远程服务器。
远程linux服务器的的公网ip与内网ip的查看
公网ip:使用ssh连接远程服务器的ip,如果是在你的xshell工具中应该在左下角
内网ip:打开你的
etc/hosts
配置文件,可以看到两个ip,一个是localhost,另一个即你的主机名且为内网ip。通常我们不使用127.0.0.0这种形式的ip名,而是使用配置文件的别名。(可以在云服务台进行主机名的更改)
etc/hosts
配置文件:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tWZ8jvdv-1629374363266)(C:\Users\1\AppData\Roaming\Typora\typora-user-images\image-20210819192430639.png)]
上述配置需要配置你集群中的所有kafka配置文件,并重启kafka集群。通过jps命令发现我们的三台kafka已经重启成功
配置的坑:
如果将如下配置写成了公网ip,将会导致你的启动kafka后会几秒钟之内kafka服务挂掉(废了我不少时间)。
listeners=PLAINTEXT://ranYanQiang:9092
2、搭建maven并编写java代码
相信大家都是会搭maven项目的,我们这里只搭建一个最简单的maven项目即可,即搭建时不需要引入任何依赖。
(1)在pom文件中映入kafka相关依赖
<dependencies>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<!-- 我的版本为2.13-2.80,前面为scale版本,后面为kafka版本。-->
<version>2.8.0</version>
</dependency>
<!-- 想要获取kafka的异常信息需要引入slf4j包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-nop</artifactId>
<version>1.7.2</version>
</dependency>
</dependencies>
(2)编写java代码
在java文件夹下新建一个包,在其中编写kafka消费者的java测试代码
该代码来自B站的尚硅谷Kafka教程(kafka框架快速入门),我的kafka就是在这里学习的。
该代码的功能:
连接远程服务器上的kafka集群,并向second主题中写入second-0 到second-9这失调数据
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 CustomProducer {
public static void main(String[] args) {
Properties props = new Properties();
// kafka 集群, broker-list
props.put("bootstrap.servers", "119.23.53.2:9092");
//可用ProducerConfig.ACKS_CONFIG 代替 "acks"
//props.put(ProducerConfig.ACKS_CONFIG, "all");
props.put("acks", "all");
// 重试次数
props.put("retries", 1);
// 批次大小
props.put("batch.size", 16384);
// 等待时间
props.put("linger.ms", 1);
// RecordAccumulator 缓冲区大小
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");
Producer<String, String> producer = new KafkaProducer<>(props);
for (int i = 0; i < 10; i++) {
producer.send(new ProducerRecord<String, String>("second", "second-" + Integer.toString(i),
"second-" + Integer.toString(i)));
}
producer.close();
}
}
(3)运行代码
程序能在短时间结束即为生产者生产消息成功。
(4)远程服务端验证是否produce成功。
进入某一kafka的文件夹中,运行以下消费者命令查看second主题的消息。
bin/kafka-console-consumer.sh --topic second --bootstrap-server ranYanQiang:9093 --from-beginning
结果如下:
我们发现我们循环写入的 second-0 到 second-9 写入成功!