原因:经过几天的配置,摸索,百度,终于将这个集群搞了出来。
网上的大多不是很详细,在这里特地记录一下,供自己以及其他需要这篇文章的人看
关于kafka的一些基本知识不在叙述
言归正传,开始进行。。
启动kafka以及创建生产者消费者命令
此处参考:https://blog.csdn.net/woshixiazaizhe/article/details/80610432
建议将localhost换成你的本机ip
如遇到连接被拒绝,可以将防火墙关掉试一试
kafka启动命令
bin\windows\kafka-server-start.bat config\server.properties
创建主题topic,topic = demo
bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
查看创建的topic
bin\windows\kafka-topics.bat --list --zookeeper localhost:2181
启动生产者 producer
bin\windows\kafka-console-producer.bat --broker-list localhost:9092 --topic demo
启动消费者 customer
bin\windows\kafka-console-consumer.bat --zookeeper localhost:2181 --topic demo --from-beginning
一、下载zookeeper
1、我这里下的版本是3.55的解压版。解压后目录结构大概是。
2、打开conf,进行我们一些必要的配置
双击打开里面的zoo.cfg
关于这些参数的解释,推荐大家移步这里
https://blog.csdn.net/kingmax54212008/article/details/83380545
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
dataDir=C:/DEVELOP/zk_kafka/zoo_logs/zk1_logs
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
server.1=192.168.0.152:28881:38881
server.2=192.168.0.152:28882:38882
server.3=192.168.0.152:28883:38883
在这里我们需要注意的点就是 clientPort dataDir
上面的格式我们可以简单的总结为 server.num=B:C:D。
num:是正整数代表的服务的唯一标识。这个要和后面说道的myid文件保持一致。
B: 标识Zookeeper集群中某一个服务的ip或者域名 192.168.1.130
C:表示server.num这个服务于集群中leader进行信息交流的端口。在kafka中我们leader和follower需要进行数据备份。具体服务就是通过这个地方制定的端口进行通信的。
D:表示万一leader宕机了,我们就通过这个端口来进行再follower中选举新的leader。
3、将我们配置好的zookeeper复制三份,在这里我的日志文件也分为了三份,分别定义成了zk1_logs,zk2_logs,zk3_logs
注意:我们需要在日志目录下,也就是你在上面定义的 dataDir文件夹下面创建myid文件
分别是你在上面所配置的server.1 里面的1,
新建txt文档,将所对应的的 服务号(如1)存入txt文档,然后将txt后缀去掉
4、将以上工作完成后,配置完相应的环境变量,每一个复制的zookeeper都需要建一个环境变量,JDK的安装以及环境变量的配置则不在本次安装过程中,需要的话,自行百度,完成后,即可启动zookeeper,双击打开 bin目录下面的zkServer.cmd
注意 如果在这里又闪退现象,则需要用编辑模式打开,在配置的最后加上 pause
即可知道错误原因,
5、到了这里,zookeeper已经可以启动了,在启动的时候,可能会报错误,是因为在你启动一个的时候,会去连接另外两个,当每一个都启动的时候,错误消失。
附两张图片
全部启动完成以后
二、下载kafka,我这里下载的是kafka_2.11-1.1.0解压版
解压目录如下
这里修改一下config里面的配置
打开server.properties
配置如下,在这里只写几个关键点,其余的暂时不用管
broker.id要保持唯一,一会需要复制三份
broker.id=1
port=9091
host.name=192.168.0.152
日志配置
log.dirs=C:/DEVELOP/zk_kafka/kafka_logs/ka1_logs
在上面所配置的zookeeper连接
zookeeper.connect=192.168.0.152:2181,192.168.0.152:2182,192.168.0.152:2183
到这里将kafka复制三份以后,将以上主要配置修改完成以后,执行文章最上面的命名,既可启动kafka
如果报错,出现找不到jdk什么的
在这里建议打开bin目录下面的Windows里面的kafka-run-class.bat
将里面的set COMMAND=%JAVA% %KAFKA_HEAP_OPTS% %KAFKA_JVM_PERFORMANCE_OPTS%
%KAFKA_JMX_OPTS% %KAFKA_LOG4J_OPTS% -cp "%CLASSPATH%"
找到这句,将里面的classpath 加上双引号,就可以了
到了这一步,应该都可以全部启动成功了
附几张启动过程中的图,想看就看一下,不看就直接略过就好了
启动kafka
创建topic
生产者
消费者
在上面的图片里可以看到,我们虽然在2181端口创建的topic,在2183端口里面里面也可以看到
如果做到了这一步,那么恭喜你,已经成功了
三、整合springboot
新建一个springboot项目
在pom.xml文件中添加下面的依赖
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.1.10.RELEASE</version>
</dependency>
下面这个不加应该也是可以的
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-streams</artifactId>
<version>1.0.2</version>
</dependency>
yml文件配置
spring:
kafka:
# kafka服务器地址(可以多个)
bootstrap-servers: 192.168.0.152:9091,192.168.0.152:9092,192.168.0.152:9093
consumer:
# 指定一个默认的组名
group-id: kafka2
# earliest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,从头开始消费
# latest:当各分区下有已提交的offset时,从提交的offset开始消费;无提交的offset时,消费新产生的该分区下的数据
# none:topic各分区都存在已提交的offset时,从offset后开始消费;只要有一个分区不存在已提交的offset,则抛出异常
auto-offset-reset: earliest
# key/value的反序列化
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
producer:
# key/value的序列化
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
# 批量抓取
batch-size: 65536
# 缓存容量
# 服务器地址
bootstrap-servers: 192.168.0.152:9091,192.168.0.152:9092,192.168.0.152:9093
server:
port: 7070
新建 KafkaController
这里参考https://blog.csdn.net/AkiraNicky/article/details/86562444
package com.zeshan.kafkaconsumer;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class KafkaController {
/**
* 注入kafkaTemplate
*/
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
/**
* 发送消息的方法
*
* @param key
* 推送数据的key
* @param data
* 推送数据的data
*/
private void send(String key, String data) {
// topic 名称 key data 消息数据
kafkaTemplate.send("test1", key, data);
}
// test 主题 1 my_test 3
@RequestMapping("/kafka")
public String testKafka() {
int iMax = 15;
for (int i = 12; i < iMax; i++) {
send("key" + i, "data" + i);
}
return "success";
}
/**
* 消费者使用日志打印消息
*/
@KafkaListener(topics = "test1")
public void receive(ConsumerRecord<?, ?> consumer) {
System.out.println("topic名称:" + consumer.topic()
+ ",key:" + consumer.key() + ",分区位置:" + consumer.partition()
+ ", 下标" + consumer.offset()+ ",数值"+consumer.value());
}
}
到这里应该就差不多了,感谢上面我所参考的,在配置的过程中,每个人遇到的问题都不一样,要学会自己独立解决问题,
有什么问题,大家可以在下面讨论,如果帮到你了,就点个赞吧!如果没帮到,emmmmm,打扰了!