kafka-demo

基础环境看前面的文档:秒杀基础环境

kafka:

1)kafka概述

消息队列 可承受百万并发 创建Kafka之前,必须先确保Zookeeper已经存在,请先确认 Zookeeper 是否创建完成。

消息中间件对比

特性ActiveMQRabbitMQRocketMQKafka
开发语言javaerlangjavascala
单机吞吐量万级万级10万级100万级
时效性msusmsms级以内
可用性高(主从)高(主从)非常高(分布式)非常高(分布式)
功能特性成熟的产品、较全的文档、各种协议支持好并发能力强、性能好、延迟低MQ功能比较完善,扩展性佳只支持主要的MQ功能,主要应用于大数据领域

消息中间件对比-选择建议

消息中间件建议
Kafka追求高吞吐量,适合产生大量数据的互联网服务的数据收集业务
RocketMQ可靠性要求很高的金融互联网领域,稳定性高,经历了多次阿里双11考验
RabbitMQ性能较好,社区活跃度高,数据量没有那么大,优先选择功能比较完备的RabbitMQ

1.1)kafka介绍

Kafka 是一个分布式流媒体平台,类似于消息队列或企业消息传递系统。kafka官网:Apache Kafka

1.2)kafka介绍-名词解释

  • producer:发布消息的对象称之为主题生产者(Kafka topic producer)

  • topic:Kafka将消息分门别类,每一类的消息称之为一个主题(Topic)

  • consumer:订阅消息并处理发布的消息的对象称之为主题消费者(consumers)

  • broker:已发布的消息保存在一组服务器中,称之为Kafka集群。集群中的每一个服务器都是一个代理(Broker)。 消费者可以订阅一个或多个主题(topic),并从Broker拉数据,从而消费这些已发布的消息。

创建Zookeeper:

docker run -d --name zk \
--net seckill_network --ip 172.36.0.16 \
--restart=always \
-v /etc/localtime:/etc/localtime \
-p 3181:2181 zookeeper:3.4.14

使用Docker启动Kafka:

注意:需要修改192.168.200.188为宿主机的实际ip地址(如果有公网IP,填写公网IP地址)

docker run -d --name kafka --net=host \
--restart=always -p 9092:9092 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.200.188:3181/kafka \
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.200.188:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-v /etc/localtime:/etc/localtime \
wurstmeister/kafka:2.12-2.4.1

测试Kafka

创建队列:

# 进入容器
docker exec -it kafka /bin/bash
​
# 进入目录
cd /opt/kafka_2.12-2.4.1/bin
​
# 创建队列
./kafka-topics.sh --create --bootstrap-server localhost:9092 --partitions 1 --replication-factor 1 --topic itemaccess

使用kafka-topics.sh创建队列: --create:执行创建一个新的队列操作

--bootstrap-server:需要链接的kafka配置,必填

--partitions 1:设置一个topic设置几个分区(就是把数据切割成几块,分别存储)

--replication-factor 1:设置分区的副本数量(就是设置多少个备份,有了备份,一个挂了没事,可以使用备份)

--topic itemaccess:队列的名字叫itemaccess

消息发布

在kafka容器中执行消息发送(接着上面的步骤执行):

# 发送消息
./kafka-console-producer.sh --broker-list localhost:9092 --topic itemaccess
​
# 发送内容为
{"actime":"2021-4-10 9:50:10","uri":"http://www-seckill.itheima.net/items/333.html","IP":"119.123.33.231","Token":"Bearer itcast"}

消息订阅

# 进入容器
docker exec -it kafka /bin/bash
​
# 进入目录
cd /opt/kafka_2.12-2.4.1/bin
​
# 订阅消息   #参数--from-beginning的作用是使consumer从kafka最早的消息开始消费。 
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic itemaccess --from-beginning  
​
# 订阅消息   #--group testgroup分组  同一个组中的会平均分发消息   不同组的会同时接收
./kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic testtopic --group testgroup

其他命令

# 进入容器
docker exec -it kafka /bin/bash
​
# 进入目录
cd /opt/kafka_2.12-2.4.1/bin
​
# 查看topic列表
./kafka-topics.sh --bootstrap-server localhost:9092 --list
​
# 删除topics
./kafka-topics.sh --bootstrap-server localhost:9092 --delete --topic itemaccess2

java使用 案例

导入依赖

  <!-- kafkfa -->
                <dependency>
                    <groupId>org.springframework.kafka</groupId>
                    <artifactId>spring-kafka</artifactId>
                    <exclusions>
                        <exclusion>
                            <groupId>org.apache.kafka</groupId>
                            <artifactId>kafka-clients</artifactId>
                        </exclusion>
                    </exclusions>
                </dependency>
                <dependency>
                    <groupId>org.apache.kafka</groupId>
                    <artifactId>kafka-clients</artifactId>
                </dependency>

配置yaml

server:
  port: 9991
spring:
  application:
    name: kafka-demo
  kafka:
    bootstrap-servers: 192.168.206.188:9092
    producer:
      retries: 10
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
      acks: all
    consumer:
      group-id: ${spring.application.name}-test
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

消费者

@Component
public class HelloListener {

    @KafkaListener(topics = "itcast-topic")
    public void onMessage(String message){
        if(!StringUtils.isEmpty(message)){
            System.out.println(message);
        }

    }
}

生产者

@RestController
public class HelloController {
    @Autowired
    private KafkaTemplate<String,String> kafkaTemplate;
    @GetMapping("/hello")
    public String hello(){
        kafkaTemplate.send("itcast-topic","黑马程序员");
        return "ok";
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值