1.安装环境
准备三个服务器节点,环境中有jdk(建议1.8版本),因本章讲述使用kafka内置zookeeper,所以不讲解zookeeper安装方式(如果有需要可以百度zookeeper安装方法,注意kafka版本的不同对zookeeper版本有要求,具体细节问度娘。)
2.kafk安装包下载
可在kafka官网下载2.5.2 如下图所示:
也可以在linux服务器下使用命令进行下载
->首先创建并进入kafka安装目录
mkdir -p /opt/kafka && cd /opt/kafka
->进入目录之后使用wget命令进行安装(如果没有wget,可以输入 yum -y install wget 进行安装)安装完成后进行解压(命令:tar -zxvf kafka_2.12-2.5.0.tgz)
wget https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.5.0/kafka_2.12-2.5.0.tgz
3.修改配置文件
解压完成后,进入kafka_2.12-2.5.0目录中的config目录下,修改配置文件,需要修改的配置文件有server.properties、producer.properties、consumer.properties
修改server.properties文件
## broker的全局唯一编号,不能重复,在其他服务器节点要更改id
broker.id=0
## 服务器需要监听的端口号
listeners=PLAINTEXT://192.168.xx.xxx:9092
## 注册到zookeeper的IP和端口
advertised.listeners=PLAINTEXT://192.168.xx.xxx:9092
## 存储消息的目录
log.dirs=/opt/kafka/kafka_2.12-2.5.0/config/kafka-logs
## 连接的zookeeper(准备了三个服务器节点,就填写三个ip)
zookeeper.connect=192.168.11.121:2181,192.168.11.122:2181,192.168.11.123:2181
修改producer.properties
## 指定kafka节点列表,用于获取metadata,不必配置全部
bootstrap.servers=192.168.12.132:9092,192.168.12.133:9092,192.168.12.134:9092
修改consumer.properties
## 指定kafka节点列表,用于获取metadata,不必配置全部
bootstrap.servers=192.168.12.132:9092,192.168.12.133:9092,192.168.12.134:9092
第一个服务器节点配置完之后,按照流程来讲按照同样的方式配置第二和第三个,考虑到要重新下载安装包的操作太慢,可以使用分发安装包命令将第一个服务器节点的安装包分发到第二个和第三个服务器节点
scp -r /opt/kafka 192.168.11.122:/opt/
这样就可以省略重新下载的麻烦,在按照上述的流程修改配置文件即可。
4.启动zookeeper和kafka
进入kafka的bin目录下,如图所示:
首先启动zookeeper,
使用内置zookeeper运行kafka时,要求环境中有jdk
首先启动zookeeper:进入bin目录
./zookeeper-server-start.sh …/config/zookeeper.properties
启动成功后出现以下输出:
zookeeper启动成功后启动kafka,进入kafka bin目录:
./kafka-server-start.sh …/config/server.properties &
启动成功后出现以下输出:
启动完成后创建topic(演示一个服务器节点(192.168.11.121))
kafka/bin目录下输入:
./kafka-topics.sh --create --zookeeper 192.168.11.121:2181 --replication-factor 1 --partitions 1 --topic topic1
创建完成后可以查看创建topic
./kafka-topics.sh --describe --zookeeper 192.168.11.121:2181 --topic topic1
创建完成后就可以启动生产者和消费者了,开两个新窗口分别进入kakfa的bin目录下
分别输入:
./kafka-console-producer.sh --broker-list 192.168.11.121:9092 --topic topic1
./kafka-console-consumer.sh --bootstrap-server 192.168.11.121:9092 --topic topic1 --from-beginning
<dependencies>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<artifactId>spring-boot-test</artifactId>
<groupId>org.springframework.boot</groupId>
</exclusion>
<exclusion>
<artifactId>spring-test</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.0.6.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
创建一个实体类user
@Data
public class User{
private Long id;
private String name;
private LocalDateTime sendTime;
}
生产者
@Component
@Slf4j
public class Producer {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
private Gson gson = new GsonBuilder().create();
/**
* 发送消息的方法
*/
public void send() {
User user = new User();
user .setId(System.currentTimeMillis());
user .setName("大黄");
user .setSendTime(LocalDateTime.now());
log.info("----------- User= {}", gson.toJson(message));
kafkaTemplate.send("topic1", gson.toJson(user));
}
}
消费者
@Component
@Slf4j
public class KafkaReceiver {
@KafkaListener(topics = {
"topic1"})
public void listen(ConsumerRecord<?, ?> record) {
Optional<?> kafkaMessage = Optional.ofNullable(record.value());
if (kafkaMessage.isPresent()) {
Object message = kafkaMessage.get();
log.info("----------------- record =" + record);
log.info("------------------ message =" + message);
}
}
}
测试类
package com.example.demo.kafka;
import com.example.demo.DemoApplication;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Component;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @author huangSen
* @create 2020-06-17-16:54
*/
@Component
@RunWith(SpringRunner.class)
@SpringBootTest(classes = DemoApplication.class ,webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class Test {
@Autowired
private Producer sender;
@org.junit.Test
public void testKafka(){
for (int i = 0; i < 3; i++) {
//调用消息发送类中的消息发送方法
sender.send();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
配置
server.port=9099
###########################################kafka about config #######################################################
spring.kafka.bootstrap-servers=192.168.11.121:9092
##########################producer about config##############################
#设置一个默认组
spring.kafka.consumer.group-id=0
#key-value序列化反序列化
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
#每次批量发送消息的数量
spring.kafka.producer.batch-size=65536
spring.kafka.producer.buffer-memory=524288
Connection to node -1 (/192.168.11.121:9092) could not be established.
我当时在这个服务器节点中开放这个9092这个端口即可
vi /etc/sysconfig/iptables
进去之后添加9092端口号即可
本文只为技术交流不做商用,如有重复请见谅私信!!!!!!!!!!