1、简介
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。 对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
2、docker-compose 部署zookeeper、kafka
docker-compose.yml
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
volumes:
- /etc/localtime:/etc/localtime
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.0.0.171
KAFKA_ZOOKEEPER_CONNECT: 192.0.0.171:2181
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.0.0.171:9092
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
KAFKA_HEAP_OPTS: "-Xmx256M -Xms128M"
kafka-manager:
image: sheepkiller/kafka-manager
environment:
ZK_HOSTS: 192.0.0.171:2181
ports:
- "9000:9000"
运行docker-compose,需要拉取镜像,可能需要等待一会
docker-compose up -d
3、加入依赖
<!--kafka-->
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
4、application.yml添加kafka配置
spring:
kafka:
bootstrap-servers: 192.0.0.171:9092 #Kafka服务端地址
listener:
concurrency: 10
ack-mode: MANUAL_IMMEDIATE
poll-timeout: 1500
missing-topics-fatal: false
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
bootstrap-servers: 192.0.0.171:9092
group-id: 0
5、消息生产者
@Component
public class KafkaProducer {
private static Logger logger = LoggerFactory.getLogger(KafkaProducer.class);
@Autowired
private KafkaTemplate kafkaTemplate;
public void sendLog(String log){
logger.info("向kafka中发送消息:"+log);
kafkaTemplate.send("topic_log", log);
}
}
5、消息消費者
@Component
public class KafkaConsumer {
private static Logger logger = LoggerFactory.getLogger(KafkaConsumer.class);
@KafkaListener(topics = {"topic_log"})
public void listen (ConsumerRecord<?, ?> record, Acknowledgment acknowledgment, Consumer<?, ?> consumer){
try {
String logStr = (String) record.value();
acknowledgment.acknowledge();
logger.info("kafka接收消息:{}", logStr);
} catch (Exception e) {
e.printStackTrace();
logger.error("kafka消息消费失败:", e);
}
}
}
6、测试方法
@Controller
@RequestMapping("/kafka")
public class KafkaTest {
@Autowired
KafkaProducer kafkaProducer;
@ApiOperation(value = "kafka测试消息发送",notes = "kafka测试消息发送",httpMethod = "GET")
@ApiImplicitParam(name = "message",value = "消息",dataType="String",required = true)
@RequestMapping(value="/send")
@ResponseBody
public void send(String message){
kafkaProducer.sendLog(message);
}
}
7、测试
启动项目,用swagger测试一下,没有问题
