版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chen18677338530/article/details/91413760
kafka
Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
主要应用场景是:日志收集系统和消息系统。
Kafka主要设计目标如下:
- 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
- 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
- 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
- 支持离线数据处理和实时数据处理。
- Scale out:支持在线水平扩展
更多参考 https://www.cnblogs.com/qingyunzong/p/9004509.html
docker搭建kafka环境
-
启动zookeep
docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
-
启动kafka
docker run -d --name kafka \ -p 9092:9092 \ -e KAFKA_BROKER_ID=0 \ -e KAFKA_ZOOKEEPER_CONNECT=192.168.75.50:2181 \ -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.75.50:9092 \ -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -t wurstmeister/kafka
-
集群搭建(可选)
docker run -d --name kafka1 \ -p 9093:9093 \ -e KAFKA_BROKER_ID=1 \ -e KAFKA_ZOOKEEPER_CONNECT=192.168.75.50:2181 \ -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.75.50:9093 \ -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9093 -t wurstmeister/kafka
-
可视化界面查看
docker run -it -d -p 9000:9000 -e ZK_HOSTS="192.168.75.50:2181" --net=host sheepkiller/kafka-manager
springboot整合kafka
-
使用idea新建springboot工程
-
修改pom文件
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.5.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.chen</groupId> <artifactId>springboot-kafka</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot-kafka</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
-
修改application.yml配置文件
# kafka spring: kafka: bootstrap-servers: 192.168.75.50:9092 consumer: group-id: myGroup
-
创建消息提供者
package com.chen.springbootkafka; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runner.Runner; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.kafka.core.KafkaTemplate; import org.springframework.kafka.support.SendResult; import org.springframework.messaging.support.GenericMessage; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.concurrent.ListenableFuture; import org.springframework.util.concurrent.ListenableFutureCallback; import java.util.HashMap; import java.util.Map; @SpringBootTest @RunWith(SpringRunner.class) public class SendMsg { @Autowired private KafkaTemplate kafkaTemplate; @Test public void sendMq(){ try { ListenableFuture<SendResult<String, String>> future = kafkaTemplate.send("test","luoye", "hello kafka"); future.addCallback(new ListenableFutureCallback<SendResult< String, String >>() { @Override public void onSuccess(SendResult<String, String> result) { System.out.println(result.toString()); System.out.println("推送消息成功"); } @Override public void onFailure(Throwable throwable) { System.out.println("推送消息失败"); } }); } catch (Exception e) { e.printStackTrace(); } } }
-
创建消息消费者
package com.chen.springbootkafka; import org.apache.kafka.clients.consumer.ConsumerRecord; import org.springframework.kafka.annotation.KafkaListener; import org.springframework.stereotype.Component; @Component public class ReviceMq { @KafkaListener(topics = {"test"}) public void listen(ConsumerRecord record){ System.out.println(record.key()); System.out.println(record.value()); } }
运行结果: