文章目录
一、中间件部署
1. 环境
- 服务器系统版本:CentOS 7.3.1611
- zookeeper使用版本:zookeeper-3.4.14
- kafka使用版本:kafka_2.12-2.3.1
2. 版本选择依据
-
kafka-zookeeper对应版本(最新可参考官网:http://kafka.apache.org/downloads):
-
springboot-kafka客户端对应版本(https://spring.io/projects/spring-kafka):
下载地址(多个镜像仓库可选):https://www.apache.org/dyn/closer.cgi?path=/kafka/2.3.1/kafka_2.12-2.3.1.tgz
3. 解压安装
3.1 zookeeper安装部署
-
下载并拷贝zookeeper-3.4.14.tar.gz文件到指定目录下(下面假设安装在/home/tools下)
-
解压、进入到/home/tools目录执行命令:
tar -xvf zookeeper-3.4.14.tar.gz
-
解压完成后,
cd /home/tools/zookeeper-3.4.14/conf
-
拷贝文件、执行命令:
cp zoo_sample.cfg zoo.cfg
-
创建数据文件夹/data/dataDir和日志文件夹/data/dataLogDir
cd /home/tools/zookeeper-3.4.14/ mkdir /data mkdir /data/dataDir mkdir /data/dataLogDir
-
编辑zoo.cfg文件,修改dataDir和dataLogDir的路径
-
启动zookeeper
执行命令:/home/tools/zookeeper-3.4.14/bin/zkServer.sh start
-
扩展:方便起见,为zookeeper设置启动脚本
- 进入到/etc/rc.d/init.d目录下:
cd /etc/rc.d/init.d
- 新建一个名为zookeeper的文件:
touch zookeeper
- 修改zookeeper内容:
vim zookeeper
注意文件中JAVA_HOME每个机子配置不同,查询命令:echo $JAVA_HOME
#!/bin/bash #chkconfig: 2345 10 90 #description: service zookeeper export JAVA_HOME=/usr/java/jdk1.8.0_181 export ZOOKEEPER_HOME=/home/tools/zookeeper-3.4.14 case "$1" in start) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh start;; start-foreground) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh start-foreground;; stop) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh stop;; status) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh status;; restart) su root ${ZOOKEEPER_HOME}/bin/zkServer.sh restart;; upgrade)su root ${ZOOKEEPER_HOME}/bin/zkServer.sh upgrade;; print-cmd)su root ${ZOOKEEPER_HOME}/bin/zkServer.sh print-cmd;; *) echo "requirestart|start-foreground|stop|status|restart|print-cmd";; esac
- 为新建的/etc/rc.d/init.d/zookeeper文件添加可执行权限:
chmod +x /etc/rc.d/init.d/zookeeper
- 把zookeeper这个脚本添加到开机启动项里面:
chkconfig --add zookeeper
- 查看是否添加成功:
chkconfig --list
- 最后就可以执行:
service zookeeper start/restart/stop/status
来快速启动、停止
3.2 kafka安装部署
-
下载并拷贝kafka_2.12-2.3.1.tgz文件到/home/tools目录下
-
在/home/tools目录下解压,执行命令:
tar -xvf kafka_2.12-2.3.1.tgz
-
进入/home/tools/kafka_2.12-2.3.1/config目录
-
编辑server.properties文件
注意:不修改listeners(本地访问),只修改advertised.listeners(远程访问),否则本地和远程都无法获取数据
修改日志路径:
配置zookeeper:
-
修改producer.properties和consumer.properties,都只修改地址
-
前台启动kafka
执行命令:/home/tools/kafka_2.12-2.3.1/bin/kafka-server-start.sh /home/tools/kafka_2.12-2.3.1/config/server.properties
查看日志是否报错,如果没有报错可以ctrl+c然后进行后台启动 -
后台启动kafka
执行命令:/home/tools/kafka_2.12-2.3.1/bin/kafka-server-start.sh -daemon /home/tools/kafka_2.12-2.3.1/config/server.properties
-
登录zookeeper验证是否连接成功
cd /home/tools/zookeeper-3.4.14/bin
./zkCli.sh -server localhost:2181
进入zookeeper命令行后执行
get /brokers/ids/0
-
创建topic
/home/tools/kafka_2.12-2.3.1/bin/kafka-topics.sh --create --bootstrap-server ip:9092 --replication-factor 1 --partitions 1 --topic test
-
多窗口测试消息收发
开两个窗口分别cd /home/tools/kafka_2.12-2.3.1
一个执行:
./bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
另一个执行:
./bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
获取到了数据则说明部署成功。 -
kafka数据维护
- 清空指定topic的数据(实测只清空数据,topic不会被删除):
./bin/kafka-topics.sh --zookeeper ip:2181 --delete --topic test
; - 清空所有数据,比较麻烦,自行查阅。
二、springboot整合
1. pom.xml添加依赖
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
2. application.yml添加kafka配置
spring:
application:
name: XXX
datasource:
...#其他配置项
kafka:
bootstrap-servers: kafka's-ip:9092
#=============== provider =======================
producer:
retries: 0
# 每次批量发送消息的数量
batch-size: 16384
buffer-memory: 33554432
# 指定消息key和消息体的编解码方式,StringSerializer支持Json对象的序列化
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
#=============== consumer =======================
# 指定默认消费者group id
consumer:
group-id: test-consumer-group
auto-offset-reset: earliest
enable-auto-commit: true
auto-commit-interval: 100
# 指定消息key和消息体的编解码方式,StringDeserializer支持Json对象的反序列化
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
3. service下创建kafka文件夹,新建生产者
@Component
public class KafkaProducer {
private static Logger logger = LoggerFactory.getLogger(KafkaProducer.class);
@Resource
private KafkaTemplate<String, String> kafkaTemplate;
private Gson gson = new GsonBuilder().create();
//发送消息方法
public void send() {
for(int i=0;i<5;i++){
Message message = new Message();
message.setId(System.currentTimeMillis());
message.setMsg(UUID.randomUUID().toString()+ "---" +i);
message.setSendTime(new Date());
logger.info("发送消息 => message = {}", gson.toJson(message));
kafkaTemplate.send("test", gson.toJson(message));
}
}
}
其中的Message对象如下:
//@Data使用了lombok,也可以手动写get/set
@Data
public class Message {
private long id;
private String msg;
private Date sendTime;
}
4. service.kafka文件夹下,新建消费者
@Component
public class KafkaReceiver {
private static Logger logger = LoggerFactory.getLogger(KafkaReceiver.class);
@KafkaListener(topics = {"test"})
public void listen(ConsumerRecord<?, ?> record) {
Optional<?> kafkaMessage = Optional.ofNullable(record.value());
if (kafkaMessage.isPresent()) {
Object message = kafkaMessage.get();
logger.info("----------------- record =" + record);
logger.info("----------------- message =" + message);
Gson gson = new GsonBuilder().create();
Message msg = gson.fromJson(message.toString(), Message.class);
System.out.println("content => "+msg.getMsg());
}
}
}
注意:上面两段代码中的 topics 均对应第一节中在中间件所在服务器创建的 topic
5. 测试
可以在服务器创建消息,也可以在本地项目中调用 producer.send()
方法测试。
完毕!