环境准备:docker环境,docker-compose工具
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 本机ip地址
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_CREATE_TOPICS: test:1:1
volumes:
- /var/run/docker.sock:/var/run/docker.sock
docker-compose up -d --scale kafka=3
docker ps
注意:
可使用docker的bash命令行,但应该使用
docker-compose exec kafka bash
生产者
./kafka-console-producer.sh --broker-list 172.27.0.5:9092 --topic my-test
消费者
./kafka-console-consumer.sh --bootstrap-server 172.27.0.5:9092 --topic my-test --from-beginning
环境准备: spring boot开发环境
org.springframework.kafka
spring-kafka
2.1.4.RELEASE
@Configuration
@EnableKafka
public class KafkaConfig {
}
#kafka
# 指定kafka 代理地址,可以多个
spring.kafka.bootstrap-servers=127.0.0.1:32771,127.0.0.1:32772,127.0.0.1:32773
# 指定默认消费者group id
spring.kafka.consumer.group-id=td
#监听配置
listeners=PLAINTEXT://127.0.0.1:32771,PLAINTEXT://127.0.0.1:32772,PLAINTEXT://127.0.0.1:32773
logging.level.root=info
@Autowired
private KafkaTemplate kafkaTemplate;
private final static String TOPIC = "my-test";
kafkaTemplate.send(TOPIC, param);
@Component
public class KafkaUtil {
@KafkaListener(topics = "my-test")
public void processMessage(String content) {
System.out.println(content);
}
}
例子:
发送端按照一个指定topic发送消息:
private final static String TOPIC_1 = "my-test";
@RequestMapping(value = "/send", method = RequestMethod.POST,produces = {"application/json"})
@ResponseBody
public String sendKafka(@RequestBody String param) {
kafkaTemplate.send(TOPIC_1, param);
return param;
}
消费者指定相应的consumerGroup和topic:
@KafkaListener(groupId = "group1", topics = "my-test")
public void processMessage(ConsumerRecord, ?> record) {
log.info("group1 my-test消费信息:{}", record.toString());
}
@KafkaListener(groupId = "group2", topics = "my-test")
public void processMessage2(String content) {
log.info("group2 process--2 my-test消费消息:{}", content);
}
@KafkaListener(groupId = "group2", topics = "my-test")
public void processMessage3(String content) {
log.info("group2 process--3 my-test消费消息 {}", content);
}
发送一个消息,结果如下: