kafka创建topic_搞定 SpringBoot 整合 Kafka(spring-kafka深入探秘)

本文深入探讨SpringBoot如何整合Kafka,介绍如何创建Topic,包括程序启动时创建和代码逻辑中创建。此外,文章还涵盖了Spring-kafka的测试、消息发送与接收、KafkaTemplate的使用、事务消息、消息消费以及错误处理等高级功能,旨在帮助读者掌握Spring-kafka的全面用法。
摘要由CSDN通过智能技术生成

近期热文:

面试“阿里云”,竟被 Spring 聊晕了,还好4面顺利拿下offer

阿里技术大牛的Spring秘籍:Spring+SpringBoot+SpringCloud等

阿里架构师玩转spring全家桶(实战篇),附赠3本spring电子书

8d4de1a18a5c4884a1cbfc206ac1302b.png

前言

kafka是一个消息队列产品,基于Topic partitions的设计,能达到非常高的消息发送处理性能。Spring创建了一个项目Spring-kafka,封装了Apache 的Kafka-client,用于在Spring项目里快速集成kafka。

除了简单的收发消息外,Spring-kafka还提供了很多高级功能,下面我们就来一一探秘这些用法。

项目地址:https://github.com/spring-projects/spring-kafka

简单集成

引入依赖

org.springframework.kafka  spring-kafka  2.2.6.RELEASE

添加配置

spring.kafka.producer.bootstrap-servers=127.0.0.1:9092

测试发送和接收

/** * @author: kl @kailing.pub * @date: 2019/5/30 */@SpringBootApplication@RestControllerpublic class Application {    private final Logger logger = LoggerFactory.getLogger(Application.class);    public static void main(String[] args) {        SpringApplication.run(Application.class, args);    }    @Autowired    private KafkaTemplate template;    @GetMapping("/send/{input}")    public void sendFoo(@PathVariable String input) {        this.template.send("topic_input", input);    }    @KafkaListener(id = "webGroup", topics = "topic_input")    public void listen(String input) {        logger.info("input value: {}" , input);    }}

启动应用后,在浏览器中输入:http://localhost:8080/send/kl。就可以在控制台看到有日志输出了:input value: "kl"。基础的使用就这么简单。发送消息时注入一个KafkaTemplate,接收消息时添加一个 @KafkaListener 注解即可。

Spring-kafka-test嵌入式Kafka Server

不过上面的代码能够启动成功,前提是你已经有了Kafka Server的服务环境,我们知道Kafka是由Scala + Zookeeper构建的,可以从官网下载部署包在本地部署。

但是,我想告诉你,为了简化开发环节验证Kafka相关功能,Spring-Kafka-Test已经封装了Kafka-test提供了注解式的一键开启Kafka Server的功能,使用起来也是超级简单。本文后面的所有测试用例的Kafka都是使用这种嵌入式服务提供的。

引入依赖

org.springframework.kafka   spring-kafka-test   2.2.6.RELEASEtest

启动服务

下面使用Junit测试用例,直接启动一个Kafka Server服务,包含四个Broker节点。

@RunWith(SpringRunner.class)@SpringBootTest(classes = ApplicationTests.class)@EmbeddedKafka(count = 4,ports = {9092,9093,9094,9095})public class ApplicationTests {    @Test    public void contextLoads()throws IOException {        System.in.read();    }}

如上:只需要一个注解 @EmbeddedKafka 即可,就可以启动一个功能完整的Kafka服务,是不是很酷。默认只写注解不加参数的情况下,是创建一个随机端口的Broker,在启动的日志中会输出具体的端口以及默认的一些配置项。

不过这些我们在Kafka安装包配置文件中的配置项,在注解参数中都可以配置,下面详解下 @EmbeddedKafka 注解中的可设置参数 :

  • value: broker节点数量
  • count: 同value作用一样,也是配置的broker的节点数量
  • controlledShutdown: 控制关闭开关,主要用来在Broker意外关闭时减少此Broker上Partition的不可用时间

Kafka是多Broker架构的高可用服务,一个Topic对应多个partition,一个Partition可以有多个副本Replication,这些Replication副本保存在多个Broker,用于高可用。

但是,虽然存在多个分区副本集,当前工作副本集却只有一个,默认就是首次分配的副本集【首选副本】为Leader,负责写入和读取数据。当我们升级Broker或者更新Broker配置时需要重启服务,这个时候需要将partition转移到可用的Broker。

下面涉及到三种情况

1、直接关闭Broker:当Broker关闭时,Broker集群会重新进行选主操作,选出一个新的Broker来作为Partition Leader,选举时此Broker上的Partition会短时不可用

2、开启controlledShutdown:当Broker关闭时,Broker本身会先尝试将Leader角色转移到其他可用的Broker上

3、使用命令行工具:使用bin/kafka-preferred-replica-election.sh,手动触发PartitionLeader角色转移

ports:端口列表,是一个数组。对应了count参数,有几个Broker,就要对应几个端口号

brokerProperties:Broker参数设置,是一个数组结构,支持如下方式进行Broker参数设置:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值