docker pull zookeeper:3.4.14
(2)创建容器
docker run -d --restart=always --name zookeeper -p 2181:2181 zookeeper:3.4.14
2.安装Kafka
(1)拉取镜像(注意版本对应)
docker pull wurstmeister/kafka:2.12-2.3.1
(2)创建容器(注意修改成自己的ip地址)
docker run -d --name kafka \
--env KAFKA_ADVERTISED_HOST_NAME=4.24.52.122 \
--env KAFKA_ZOOKEEPER_CONNECT=4.24.52.122:2181 \
--env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://4.24.52.122:9092 \
--env KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
--env KAFKA_HEAP_OPTS="-Xmx256M -Xms256M" \
--restart=always \
-p 9092:9092 wurstmeister/kafka:2.12-2.3.1
(3)查看日志
docker logs kafka
如果你的也是云服务器,查看日志时候出现如下情况
这时候你就是你的2181端口还未开放,需要自己到防火墙上面进行端口开放设置,除了开放2181端口,9092端口也是需要开放的。
注意:要是你的服务器不是云服务器,你可以将-p 9092:9092替换成–net=host,表示直接使用容器宿主机的网络命名空间,即没有独立的网络环境,它使用宿主机的ip和端口。使用云服务器的话则使用-p参数进行端口映射。
三:入门案例
1.引入依赖
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
</dependency>
2.配置生产者
package com.my.kafka;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import java.util.Properties;
/**
* 生产者
*/
public class ProducerDemo {
public static void main(String[] args) {
//1.kafka的配置信息
Properties pro = new Properties();
//Kafka的连接地址
pro.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"4.234.52.122:9092");
//发送失败,失败重连次数
pro.put(ProducerConfig.RETRIES_CONFIG,5);
//消息key的序列化器
pro.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
//消息value的序列化器
pro.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
//2.生产者对象
KafkaProducer<String,String> producer = new KafkaProducer<String, String>(pro);
//3.封装发送消息
ProducerRecord<String, String> message = new ProducerRecord<>("my-topic", "asd007", "hello kafka");
//4.发送消息
producer.send(message);
//5.关闭消息通道(必选)
producer.close();
}
}
代码解释:上面设置序列化器时候,我们怎么知道序列化器的引用地址呢?你可以点击项目左下角的“外部库”:
往下翻找到org.apache.kafka并进入common包里面
然后找到serialization包,找到下面两个类:
直接复制引用即可(下面的消费者也是如此,只不过需要复制的是反序列化的类)。
3.配置消费者
package com.my.kafka;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import java.time.Duration;
import java.util.Collections;
import java.util.Properties;
/**
* 消费者
*/
public class ConsumerDemo {
public static void main(String[] args) {
//1.添加Kafka配置信息
Properties pro = new Properties();
//Kafka的连接地址
pro.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,"4.234.52.122:9092");
//消费者组
pro.put(ConsumerConfig.GROUP_ID_CONFIG,"group2");
//消息key的反序列化器
pro.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringDeserializer");
//消息value的反序列化器
pro.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringDeserializer");
//2.消费者对象
KafkaConsumer<String, String> consumer = new KafkaConsumer<>(pro);
//3.订阅主题
consumer.subscribe(Collections.singletonList("my-topic"));
//4.设置线程一种处于监听状态
while (true) {
//5.获取消息
ConsumerRecords<String, String> messages = consumer.poll(Duration.ofMillis(1000)); //设置每秒钟拉取一次
for (ConsumerRecord<String, String> message : messages) {
System.out.print(message.key() + ":");
System.out.println(message.value());
}
}
}
}
四:结果测试
1.单消费者
启动消费者,然后启动生产者,可以看到成功接收到消息:
2.多消费者同组
首先需要创建多个消费者
然后继续发送消息
可以看到只有一个消费者能够获取到消息。
3.多消费者不同组
将消费者1设置在group1,将消费者2设置在group2,然后生产者发送消息:
可以看到两个消费者都能接收到消息。
4.总结
- 生产者发送消息,多个消费者订阅同一个主题,只能有一个消费者收到消息(一对一)
- 生产者发送消息,多个消费者订阅同一个主题,所有消费者都能收到消息(一对多)
五:Kafka高可用设计(深入原理)
1.集群
- Kafka 的服务器端由被称为 Broker 的服务进程构成,即一个 Kafka 集群由多个 Broker 组成
- 这样如果集群中某一台机器宕机,其他机器上的 Broker 也依然能够对外提供服务。这其实就是 Kafka 提供高可用的手段之一
2.备份机制(Replication)
Kafka的副本分为领导者和追随者,只有Leader副本才能对外提供读写服务(也有资料说Kafka2.4之后社区通过引入新的Broker参数使得Follower副本能有限度地提供读服务),响应Client请求,Follower副本只是采用拉(PULL)方式被动地同步Leader中的数据,见下图:
首先我们先了解几个概念:
- AR(Assigned Repllicas):一个分区里面所有的副本(不区分leader和follower)
- ISR(In-Sync Replicas):能够和leader保持同步的follower+leader本身组成的集合
- OSR(Out-Sync Replicas):不能和leader保持同步的follower集合
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
)]
[外链图片转存中…(img-tqr20TaF-1714170050383)]
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!