【转载请注明】:
原文出处:https://www.cnblogs.com/jstarseven/p/11041729.html 作者:jstarseven 码字挺辛苦的.....
一、kafka介绍
Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
主要应用场景是:日志收集系统和消息系统。
Kafka主要设计目标如下:
- 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
- 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
- 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
- 同时支持离线数据处理和实时数据处理。
- 支持在线水平扩展
二、kafka架构图
三、kafka安装与测试
1、配置JDK环境
Kafka 使用Zookeeper 来保存相关配置信息,Kafka及Zookeeper 依赖Java 运行环境,从oracle网站下载JDK 安装包,解压安装
1 tar zxvf jdk-8u171-linux-x64.tar.gz 2 mv jdk1.8.0_171 /usr/local/java/
设置Java 环境变量:
1 #java 2 export JAVA_HOME=/usr/local/java/jdk1.8.0_171 3 export PATH=$PATH:$JAVA_HOME/bin 4 export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib:$JAVA_HOME/jre/lib
2、安装kafka
下载地址:http://kafka.apache.org/downloads
1 cd /opt 2 wget http://mirror.bit.edu.cn/apache/kafka/2.3.0/kafka_2.11-2.3.0.tgz 3 tar zxvf kafka_2.11-2.3.0.tgz 4 mv kafka_2.11-2.3.0 /usr/local/apps/ 5 cd /usr/local/apps/ 6 ln -s kafka_2.11-2.3.0 kafka
3、启动测试
(1)启动Zookeeper服务
1 cd /usr/local/apps/kafka 2 #执行脚本 3 bin/zookeeper-server-start.sh -daemon config/zookeeper.properties 4 #查看进程 5 jps
(2)启动单机Kafka服务
1 #执行脚本 2 bin/kafka-server-start.sh config/server.properties 3 #查看进程 4 jps
(3)创建topic进行测试
1 #执行脚本 2 bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
(4)查看topic列表
1 #执行脚本 2 bin/kafka-topics.sh --list --zookeeper localhost:2181 3 输出:test
(5)生产者消息测试
1 #执行脚本(使用kafka-console-producer.sh 发送消息) 2 bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
(6)消费者消息测试
1 #执行脚本(使用kafka-console-consumer.sh 接收消息并在终端打印) 2 bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
4、单机多broker集群配置
单机部署多个broker,不同的broker,设置不同的id、监听端口、日志目录
1 cp config/server.properties config/server-1.properties 2 vim server-1.properties 3 #修改: 4 broker.id=1 5 port=9093 6 log.dir=/tmp/kafka-logs-1 7 #启动Kafka服务 8 bin/kafka-server-start.sh config/server-1.properties &
5、java代码实现生产者消费者
(1)maven项目添加kafka依赖
1 <dependency> 2 <groupId>org.apache.kafka</groupId> 3 <artifactId>kafka-clients</artifactId> 4 <version>2.3.0</version> 5 </dependency>
(2)java代码实现

1 package com.server.kafka; 2 3 import org.apache.kafka.clients.consumer.ConsumerConfig; 4 import org.apache.kafka.clients.consumer.ConsumerRecord; 5 import org.apache.kafka.clients.consumer.ConsumerRecords; 6 import org.apache.kafka.clients.consumer.KafkaConsumer; 7 import org.apache.kafka.clients.producer.KafkaProducer; 8 import org.apache.kafka.clients.producer.ProducerConfig; 9 import org.apache.kafka.clients.producer.ProducerRecord; 10 import org.apache.kafka.common.serialization.StringDeserializer; 11 import org.apache.kafka.common.serialization.StringSerializer; 12 13 import java.util.Collections; 14 import java.util.Properties; 15 import java.util.Random; 16 17 /** 18 * Title: KafakaExecutor 19 * Description: 20 * Company: hfzs 21 * 22 * @author lr 23 * @version 1.0 24 * @date 2019/8/16 25 */ 26 public class KafakaExecutor { 27 28 public static String topic = "test"; 29 30 public static void main(String[] args) { 31 new Thread(()-> new Producer().execute()).start(); 32 new Thread(()-> new Consumer().execute()).start(); 33 } 34 35 public static class Consumer { 36 37 private void execute() { 38 Properties p = new Properties(); 39 p.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.21.181:9092"); 40 p.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); 41 p.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class); 42 p.put(ConsumerConfig.GROUP_ID_CONFIG, topic); 43 44 KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(p); 45 // 订阅消息 46 kafkaConsumer.subscribe(Collections.singletonList(topic)); 47 48 while (true) { 49 ConsumerRecords<String, String> records = kafkaConsumer.poll(100); 50 for (ConsumerRecord<String, String> record : records) { 51 System.out.println(String.format("topic:%s,offset:%d,消息:%s", // 52 record.topic(), record.offset(), record.value())); 53 } 54 } 55 } 56 } 57 58 59 public static class Producer { 60 61 private void execute() { 62 Properties p = new Properties(); 63 //kafka地址,多个地址用逗号分割 64 p.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.21.181:9092"); 65 p.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); 66 p.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); 67 KafkaProducer<String, String> kafkaProducer = new KafkaProducer<>(p); 68 69 try { 70 while (true) { 71 String msg = "Hello," + new Random().nextInt(100); 72 ProducerRecord<String, String> record = new ProducerRecord<>(topic, msg); 73 kafkaProducer.send(record); 74 System.out.println("消息发送成功:" + msg); 75 Thread.sleep(500); 76 } 77 } catch (InterruptedException e) { 78 e.printStackTrace(); 79 } finally { 80 kafkaProducer.close(); 81 } 82 } 83 84 } 85 }
(3)测试结果(上面使用脚本命令执行消费者的终端也会同步输出消息数据)
参考文章:https://www.cnblogs.com/frankdeng/p/9310684.html
加七哥微信:kinyseven,来扯犊子啊
动动手,关注一下,扎心了
大道七哥