SpringBoot整合Kafka,以及无框架下的Kafka使用(简单易懂)

前言:本章分为KafKa重点概述、Java下的KafKa、SpringBoot整合KafKa三大块。

           后期还会加内容。

一、KafKa重点概述

1.Kafka分区--将主题topic划分为多个小块

轮询策略:就是按照顺序轮流分配到每个分区中

随机策略:每次随机进行分配

按key保存策略:指定key,计算这个key的hash值,按照hash值对不同信息进行分配

2.备份机制--保障数据的高可用、高一致性

其中在追随者中副本中又分为ISR和普通副本

小结:因为ISR为同步,普通为异步。

           所以在数据高一致性上选择ISR,在高可用上选择普通。

3.生产者详情

在配置中有几个重要常用的配置。

--发送消息时可指定同步和异步  推荐异步

--重传机制 

--ack确认机制

--压缩发送

4.消费者详情

--消息有序性

--提交偏移量

5.Maven坐标

<!-- 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>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
</dependency>

二、无框架下使用KafKa

在配置KafKa中,在ProducerConfig中有很多静态常量,根据自己的要求,可以对Properties进行设置。

1.生产者类

这里介绍最简单的发送消息设置,总共四个步骤

1.配置Kafka信息

2.创建生产者对象并封装要发送的数据

3.发送消息

4.关闭生产通道

// 1.kafka的配置信息
Properties properties = new Properties();
//kafka的连接地址 
properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,"替换成你kafka的ip地址:9092");
 //消息key的序列化器  
properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");
//消息value的序列化器 
properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,"org.apache.kafka.common.serialization.StringSerializer");

// 2.创建kafka生产者对象
KafkaProducer<String,String> kafkaProducer = new KafkaProducer(properties);
 // 封装发送的消息
ProducerRecord<String, String> record = new ProducerRecord<>("dalang-topic", "10001", "hello kangan");

// 3. 发送消息
kafkaProducer.send(record);

// 4.关闭消息通道
kafkaProducer.close();

一些比较常用的生产者配置

-同步和异步发送消息         在send加个参数new rollback(){}

-重传机制                           常量为:ProducerConfig.RETRIES_CONFIG

-ack确认机制                     常量为:ProducerConfig.ACKS_CONFIG

-压缩发送                           常量为:ProducerConfig.COMPRESSION_TYPE_CONFIG

2.消费者类

这里介绍最简单的消费消息设置,总共四个步骤

1.配置KafKa

2.创建生产者对象

3.订阅要拉取的主题

4.设置监听并消费

// 1. 配置kafka
Properties properties = new Properties();
properties.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "替换成你Kafka所在的ip地址:9092");

// 2.生产者对象
 KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<String, String>(properties);

// 3.订阅主题
kafkaConsumer.subscribe(Collections.singletonList("dalang-topic"));

//当前线程一直处于监听状态
while (true) {
    //4.获取消息
    ConsumerRecords<String, String> consumerRecords=consumer.poll(Duration.ofMillis(1000));
            for (ConsumerRecord<String, String> consumerRecord : consumerRecords) {
                System.out.println(consumerRecord.key());
                System.out.println(consumerRecord.value());
            }
  }

-提交偏移量 指定常量ConsumerConfig.ENABLE_AUTO_COMMIT_CONFIG设置为false

同步提交             消费者对象.commitSync.();    

异步提交             消费者对象.commitAsync.(new OffsetCommitCallback() {});    

同步异步提交        结合同步和异步

三、SpringBoot整合Kafka

1.某个微服务模块生产者:

配置文件加入以下内容:

spring:

       kafka:

                bootstrap-servers: 填写你的KafKa的Ip地址:9092

                producer:

                        retries: 10

                        key-serializer: org.apache.kafka.common.serialization.StringSerializer

                        value-serializer: org.apache.kafka.common.serialization.StringSerializer

1.1自动注入 KafkaTemplate

1.2发送消息 send();

这里也是举简单例子,测试实体类为User

@Data
@ToString
public class User {
    private String userName;
    private Integer age;
}
@RestController
public class HelloKangAnController {

    @Autowired
    private KafkaTemplate<String,String> kafkaTemplate;

    /**
     * 发送消息
     * @return
     */
    @GetMapping("/hello")
    public String hello(){
//        kafkaTemplate.send("kangan-topic","早知道信息差新闻test1");
        User user = new User();
        user.setUserName("kangan");
        user.setAge(23);
        //设置了字符串反序列化 需要将对象转换成字符串
        kafkaTemplate.send("user-topic", JSON.toJSONString(user));
        return "ok";
    }
}

2.某个微服务模块消费者

配置文件:

spring:

       kafka:

                bootstrap-servers: 填写你的KafKa的Ip地址:9092

                consumer:

                        group-id: ${spring.application.name}

                        key-deserializer: org.apache.kafka.common.serialization.StringDeserializer

                        value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

2.1自动注入 KafkaTemplate

2.2在需要监听拉取的方法上加入注解 @KafkaListener 指定你要拉取的主题

@Component
public class HelloListener {

    /**
     * 监听消息
     * @param message
     */
    @KafkaListener(topics = "user-topic")
    public void onMessage(String message){
        User user = JSON.parseObject(message, User.class);

        if(!StringUtils.isEmpty(message)){
            System.out.println(user);
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值