这篇博文还是很详细的
在安装及测试过程中,可能会发生些错误,那是因为新版本的kafka的一些命令发生了改变。
本人使用的是2.5.0版本
WARN [Consumer clientId=consumer-console-consumer-47753-1, groupId=console-consumer-47753] Bootstrap broker 127.0.0.1:2181 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
在做kafka测试的时候,使用命令bin/kafka-console-consumer.sh --zookeeper
新版本不适用端口2181,而是9092
zookeeper is not a recognized option
bin/kafka-console-consumer.sh --zookeeper 127.0.0.1:2181 --tpoic Rising-topic --from-beginning
启动消费者,发现一直报错consumer zookeeper is not a recognized option,发现在启动的时候说使用 --zookeeper是一个过时的方法,此时,才知道原来在最新的版本中,这种启动方式已经被删除了,
0.90版本之后启动消费者的方法
bin/kafka-console-consumer.sh --bootstrap-server 127.0.0.1:9092 --topic test --from-beginning
详细可阅览这篇博文
有时启动zk,显示started,但其实zk并不成功启动,可采用如下方式:
telnet 127.0.0.1 2181
然后输入stat,出现下面这些信息即正常启动
遇到一些问题可阅览这篇博文
阿里云有自己的安全组,禁止访问某些端口,明明防火墙已经关了,但除了22端口其他依然无法访问。
可以参考下这篇博文
打开linux下的etc目录下的hosts文件,另起一行添加ip+域名(ip和域名之间使用空格分开),这里的域名就是阿里云的主机名。
修改了可能不会立即生效,我是重启服务器之后才行的。
本地java测试显示
Connection refused: no further information
这是需要修改配置文件/config/server.properties
advertised.listener=PLAINTEXT://阿里云外网IP:9092
把这一项注释打开,就可以了
其他博文说创建host.name=外网地址,老版本是可以,但新版本没有host.name这一项,加上去kafka会无法启动,在新属性advertised.listener修改就可以了。
引入依赖
org.apache.kafka
kafka-clients
2.3.0
org.springframework.kafka
spring-kafka
2.3.0.RELEASE
注意这里的依赖是有对应关系的,随便对应有可能会出错,对应关系可见Kafka官网,截图如下:
配置文件application.yml
server:
port: 8081
spring:
application:
name: producer
kafka:
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
group-id: Springboot-groupid
auto-offset-reset: earliest
enable-auto-commit: true
bootstrap-servers: IP地址:9092
可使用KafkaTemplate,producer举例:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;
/**
* @author Rising
* @date 2020/4/23
*/
@Component
public class Producer {
@Autowired
KafkaTemplate kafkaTemplate;
public void send(){
kafkaTemplate.send("topic", "msgKey", "msgData");
}
}
consumer举例:
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
import java.util.Optional;
/**
* @author Rising
* @date 2020/4/23
*/
@Component
public class Consumer {
@KafkaListener(topics = {"topic"})
public void listener(ConsumerRecord record){
Optional msg = Optional.ofNullable(record.value());
if (msg.isPresent()){
System.out.println(msg.get());
}
}
}
启动application即可
/**
* @author Administrator
*/
@SpringBootApplication
public class ProducerApplication {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext context = SpringApplication.run(ProducerApplication.class, args);
Producer producer = context.getBean(Producer.class);
for (int i = 0; i < 10; i++) {
producer.send();
TimeUnit.SECONDS.sleep(2);
}
}
}
———————————————————华丽的分割线—————————————————————
物理上把topic分成一个或多个paticition
无论消息是否被消费,kafka都会保存所有消息,有两种策略可以删除旧数据:
tips:producer不在zk中注册,消费者在zk注册
不能自己控制offset,不能重复读
可以自己控制offset,但过于复杂