学习springBoot(15)集成 kafka

569 阅读2分钟

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测试一下,没有问题