kafka概述
kafka是一个分布式流处理平台
- Kafka作为一个集群,运行在一台或者多台服务器上.
- Kafka 通过 topic 对存储的流数据进行分类。
- 每条记录中包含一个key,一个value和一个timestamp(时间戳)。
流处理平台有以下三个特性:
- 可以让你发布和订阅流式的记录。这一方面与消息队列或者企业消息系统类似。
- 可以储存流式的记录,并且有较好的容错性。
- 可以在流式记录产生时就进行处理。
Kafka有四个核心的API:
- The Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。
- The Consumer API 允许一个应用程序订阅一个或多个 topic ,并且对发布给他们的流式数据进行处理。
- The Streams API 允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。
- The Connector API 允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表(table)的所有变更内容。
那么kafka使用的场景有哪些??
它可以用于两大类别的应用:
- 构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。 (相当于message queue)
- 构建实时流式应用程序,对这些流数据进行转换或者影响。 (就是流处理,通过kafka stream topic和topic之间内部进行变化)
Kafka下载安装
传送门
上传并解压到Linux的指定文件目录下:
解压命令:tar -zxvf kafka_2.11-1.0.0.tar.gz
解压完之后新建文件夹:kafka_logs用来存放kafka运行日志
接下来修改 /etc/profile环境配置文件
#kafka配置
export KAFKA_HOME=/home/projectTool/kafka_2.11-1.0.0
export PATH=${KAFKA_HOME}/bin:$PATH
然后退出并保存配置文件
使用 source /etc/profile 进行刷新环境变量
打开解压目录下的/config文件夹中的server.properties文件
进行以下配置修改:
#本地所有IP监听端口号:8099
listeners=PLAINTEXT://0.0.0.0:8099
#对外开放IP:端口号
advertised.listeners=PLAINTEXT://1.15.240.215:8099
#设置端口号
port=8099
#这个配置的是kafka日志文件路径
log.dirs=/home/projectTool/Kafka_logs
#配置Zookeeper的运行IP:端口,进行连接
zookeeper.connect=localhost:2181
#Zookeeper超时连接等待的秒数
zookeeper.connection.timeout.ms=6000
#启用删除topic的功能,默认为true
delete.topic.enable=true
启动kafka
注意要先运行Zookeeper
启动命令:守护进程启动
kafka-server-start.sh -daemon /home/projectTool/kafka_2.11-1.0.0/config/server.properties &
输入命令jps 查看kafka进程
安装Kafka-eagle 可视化
传送门
上传解压到指定文件夹:
然后继续解压
打开解压的目录中的system-config.properties
efak.zk.cluster.alias=cluster1
#配置你的kafka集群(ip:端口),多个地址ip用逗号隔开
cluster1.zk.list=xxx.xxx.xxx.xxx:2181
#cluster2.zk.list=xdn10:2181,xdn11:2181,xdn12:2181
######################################
# zookeeper enable acl
######################################
cluster1.zk.acl.enable=false
cluster1.zk.acl.schema=digest
cluster1.zk.acl.username=test
cluster1.zk.acl.password=test123
######################################
# broker size online list broker在线数量
######################################
cluster1.efak.broker.size=20
######################################
# zk client thread limit Zookeeper 客户端线程限制
######################################
kafka.zk.limit.size=16
######################################
# EFAK webui port 可视化页面端口
######################################
efak.webui.port=8048
######################################
# EFAK enable distributed
######################################
efak.distributed.enable=false
efak.cluster.mode.status=master
######################################
# EFAK 主节点地址和端口
######################################
efak.worknode.master.host=1.15.240.215
efak.worknode.port=8085
######################################
# kafka jmx acl and ssl authenticate
#jmx acl 和SSL认证
######################################
cluster1.efak.jmx.acl=false
cluster1.efak.jmx.user=keadmin
cluster1.efak.jmx.password=keadmin123
cluster1.efak.jmx.ssl=false
cluster1.efak.jmx.truststore.location=/data/ssl/certificates/kafka.truststore
cluster1.efak.jmx.truststore.password=ke123456
######################################
# kafka offset storage
# kafka偏移存贮设置
######################################
cluster1.efak.offset.storage=kafka
cluster2.efak.offset.storage=zk
######################################
# kafka jmx uri
######################################
cluster1.efak.jmx.uri=service:jmx:rmi:///jndi/rmi://%s/jmxrmi
######################################
# kafka metrics, 15 days by default
# kafka 数据,默认15天
######################################
efak.metrics.charts=true
efak.metrics.retain=15
######################################
# kafka sql topic records max
# kafka SQL主题记录限制
######################################
efak.sql.topic.records.max=5000
efak.sql.topic.preview.records.max=10
######################################
# delete kafka topic token
#删除主题的token码
######################################
efak.topic.token=keadmin
######################################
# kafka sasl authenticate
# Kafka sasl身份验证
######################################
cluster1.efak.sasl.enable=false
cluster1.efak.sasl.protocol=SASL_PLAINTEXT
cluster1.efak.sasl.mechanism=SCRAM-SHA-256
cluster1.efak.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="kafka" password="kafka-eagle";
cluster1.efak.sasl.client.id=
cluster1.efak.blacklist.topics=
cluster1.efak.sasl.cgroup.enable=false
cluster1.efak.sasl.cgroup.topics=
cluster2.efak.sasl.enable=false
cluster2.efak.sasl.protocol=SASL_PLAINTEXT
cluster2.efak.sasl.mechanism=PLAIN
cluster2.efak.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-eagle";
cluster2.efak.sasl.client.id=
cluster2.efak.blacklist.topics=
cluster2.efak.sasl.cgroup.enable=false
cluster2.efak.sasl.cgroup.topics=
######################################
# kafka ssl authenticate
# Kafka ssl 身份验证
######################################
cluster3.efak.ssl.enable=false
cluster3.efak.ssl.protocol=SSL
cluster3.efak.ssl.truststore.location=
cluster3.efak.ssl.truststore.password=
cluster3.efak.ssl.keystore.location=
cluster3.efak.ssl.keystore.password=
cluster3.efak.ssl.key.password=
cluster3.efak.ssl.endpoint.identification.algorithm=https
cluster3.efak.blacklist.topics=
cluster3.efak.ssl.cgroup.enable=false
cluster3.efak.ssl.cgroup.topics=
######################################
# kafka sqlite jdbc driver address
# kafka sqlite 数据库配置
######################################
#efak.driver=org.sqlite.JDBC
#efak.url=jdbc:sqlite:/hadoop/kafka-eagle/db/ke.db
#efak.username=root
#efak.password=www.kafka-eagle.org
######################################
# kafka mysql jdbc driver address
# kafka mysql 数据库配置
######################################
efak.driver=com.mysql.cj.jdbc.Driver
efak.url=jdbc:mysql://127.0.0.1:3306/ke?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
efak.username=ke
efak.password=123456
配置完可视化的配置文件后,再去修改环境配置:
vim /etc/profile
将下面的添加到文件的末尾
export KE_HOME=/home/projectTool/kafka-eagle-bin-3.0.1/efak-web-3.0.1
export PATH=${KE_HOME}/bin:$PATH
保存退出,刷新配置
source /etc/profile
启动EFAK:
cd /***/kafka-eagle/bin
./ke.sh start
./ke.sh status
正常启动代码:
下面就是打开可视化页面
Spring Boot集成Kafka
1、引入依赖:
<!-- kafkfa -->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
2、 application.yml 配置
# 应用服务 WEB 访问端口
server:
port: 21011
spring:
application:
name: mp-controller-center
profiles:
active: prod
kafka:
#填写kafka配置文件里的对外开放IP:端口号
bootstrap-servers: 1.15.240.215:8099
#生产者
producer:
retries: 10
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
# 消费者
consumer:
group-id: ${spring.application.name}-test
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
3、代码编写
@Autowired
//kafka 数据模板是以键值对形式存储的
private KafkaTemplate<String,String> kafkaTemplate;
@GetMapping("/hello")
public String hello(){
//建立主题为rc-topic的值
kafkaTemplate.send("rc-topic","测试");
return "ok";
}
@ApiOperation("获取所有角色")
@GetMapping("/getAllRoles")
public List<JokerRole> getAllRoles() {
logger.info("success");
List<JokerRole> list = jokerRoleService.getAllRoles();
//建立主题为AllRoles的值
kafkaTemplate.send("AllRoles", list.toString());
return list;
}
//kafka监听key为rc-topic的值
@KafkaListener(topics = "rc-topic")
public void onMessage(String message){
if(!StringUtils.isEmpty(message)){
System.out.println(message);
}
}
可视化页面数据:
这是所有主题列表
这是rc-topic数据测试
这是AllRoles测试数据
注:程序创建topic时报错could not be established. Broker may not be available
解决办法就是kafka的配置文件修改
#本地所有IP监听端口号:8099
listeners=PLAINTEXT://0.0.0.0:8099
#对外开放IP:端口号
advertised.listeners=PLAINTEXT://1.15.240.215:8099
至此,单机版的kafka的搭建结束