不懂kafka的可以看理论学习以下再来:https://blog.csdn.net/qq_39276448/article/details/86024940
要先安装jdk
切记
新手不安装zk安装kafka移步:https://www.cnblogs.com/adolfmc/p/7345333.html
安装zk单机版安装kafka下文
集成boot移步骤二。
步骤一:安装kafka
版本对应springboot2.1+--kafka2.2
springboot2.0+--kafka2.1
博主是2.1,所以其他版本要自己找了。
已经有linux经验的请先看官方:http://kafka.apache.org/quickstart
下载kafka
cd ~ 切到当前用户home目录
wget http://mirror.bit.edu.cn/apache/kafka/2.2.0/kafka_2.12-2.2.0.tgz
解压
tar -zxvf kafka_2.12-2.2.0.tgz
新建立一个文件夹:kafka 把解压后的kafka_2.12-2.2.0文件夹放进去,并在kafka目录下创建logs文件夹
修改配置文件
vim /usr/local/kafka/kafka_2.11-2.1.0/config/server.properties
外网访问问题配置
Cannot assign requested这个问题也是这样配置
初级工程师不要去学网上的配置port,和hostname;你会发现绝对性的失败,添加这两行!!!!
(2020/2/22修正:host.name/port已过时,PLAINTEXT:明文传输)
外部连接要求:明文传输(不需加密协议),任意机器访问本机,访问本机的端口:listeners=PLAINTEXT://0.0.0.0:9092
对外发布地址:advertised.listeners=PLAINTEXT://你自己的外网地址:9092
配置kafka存在zk的节点
配置borkr.id=0,因为zk为0,单机zk默认0就行了。(默认就ok)
如图:
修改日志文件地址
路径是你刚刚创建logs文件夹的地址
切换到bin目录下
启动zook单机节点 后台启动&
sh zookeeper-server-start.sh ../config/zookeeper.properties & 这里配置文件路径。写你自己的
启动kafka
sh kafka-server-start.sh ../config/server.properties & 这里配置文件路径。写你自己的
测试:
建立topic
sh kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
查看kafka内所有topic
sh kafka-topics.sh --list --zookeeper localhost:2181
如果看到test说明成功!
其他测试请自便
步骤一.1:服务器空闲内存2G以上的请忽略,注意是空闲(很多博客忽略了)
1G空闲的注意内存分配问题,不熟的要改以下配置:要不然内存不够用,kafka默认1G,zk默认512M
修改原则最好(伪\静\态分配):kafka-jvm申请最大内存+zk申请最大内存<空闲内存(推荐)
或者是业务不大的时候(动态分配):kafka-jvm申请最小内存+zk申请最小内存<空闲内存
博主服务器大概内存为闲时为700M,忙时500M,zk256+kakfa-jvm256<700 勉强够。。只是玩玩也不需要很高内存
修改bin目录下:
设置内存看自己服务器空闲内存而定
1.vim zookeeper-server-start.sh
export KAFKA_HEAP_OPTS="-Xmx256M -Xms20M"
2.vim kafka-server-start.sh
export KAFKA_HEAP_OPTS="-Xmx256M -Xms128M"
3.切换到config目录 (很多博客忽略了)
vim server.properties
加上
log.cleaner.dedupe.buffer.size=10485760 单位是字节(10M)
上面三个最大内存加起来不能超过空闲内存!
注意:(高手请跳过)
博主服务器动态分配内存:全部最大内存可能都要4G.....实际我只有1G
可以支撑单服务某时刻某服务能使用更高,省服务器,前提所有服务不能同时使用很高!
重点:
背景:博主服务器大概内存为闲时为700M,忙时500M
补充:kafka内部还申请了内存默认128m
场景:kafka有时候能行,有时候无缘无故duang机.重启又没事了(或者是某个服务无缘无故duang机)
这是主要可能发生duang服务原因之一
1.闲时内存:
博主的其他服务没有太高使用(redis,tomcat),此时服务器空闲内存为700M
kafka,zk没有太高使用率那么全部jvm内存大概使用为20+128+128=276M
那还剩下700-276=424M,
那么服务器正常运行
2.忙时内存
博主的其他服务先使用特别频繁(redis,tomcat),此时服务器空闲内存为500M
kafka,zk使用率很高那么全部jvm内存大概使用为256+256+128=640M,
其他内存占用情况不列举:排列分组同理问题
明显内存不够了!那么zk或者kafka就会报内存分配错误了,就duang服务了
如果重启短时间内kakfa又能运行一段时间,超过空闲内存时又会duang服务了
如果不能对内存很好的把控,就一定要按照伪\静\态分配内存!
反之无所谓!
步骤二:springboot2整合kafka
依赖包
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
yml
server:
port: 11000
spring:
kafka:
producer:
batch-size: 16384
retries: 0
buffer-memory: 33554432
value-serializer: org.apache.kafka.common.serialization.StringSerializer
key-serializer: org.apache.kafka.common.serialization.StringSerializer
bootstrap-servers: 你的服务器外网地址:9092
consumer:
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
group-id: test-consumer-group
auto-offset-reset: earliest
auto-commit-interval: 100
enable-auto-commit: true
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
编写接口
package com.bj.kafka.Kafka;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Date;
import java.util.UUID;
@RestController
public class KafkaController {
private Gson gson = new GsonBuilder().create();
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@RequestMapping("/send")
public String send(String name) {
Message message = new Message();
message.setId(System.currentTimeMillis());
message.setMsg(name);
message.setSendTime(new Date());
System.out.println("+++++++++++++++++++++ message = {}"+ gson.toJson(message));
//这里发送到那个消息topic(xiaobaii),并设置发送的数据
kafkaTemplate.send("xiaobaii", gson.toJson(message));
return name;
}
}
编写message类
package com.bj.kafka.Kafka;
import lombok.Data;
import java.util.Date;
@Data
public class Message {
private Long id; //id
private String msg; //消息
private Date sendTime; //时间戳
}
编写消费端
package com.bj.kafka.Kafka;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
public class MyConsumer {
//这里便是监听了xiaobaii,只要程序不停止就会持续消费!
@KafkaListener(topics = "xiaobaii")
public void listen(ConsumerRecord<?,String> record) {
Optional<?> kafkaMessage = Optional.ofNullable(record.value());
if (kafkaMessage.isPresent()) {
Object message = kafkaMessage.get();
System.out.println(message);
}
}
}