Spring Kafka进阶:实现多态消息消费

Spring Kafka进阶:实现多态消息消费

Spring Kafka 官方提供了一种基于消息类型的消费模式,通过类上的 @KafkaListener 注解配合方法上的 @KafkaHandler,实现多态消息的自动路由处理。其典型实现方式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@KafkaListener(id = "multi", topics = "myTopic")
static class MultiListenerBean {

@KafkaHandler
public void listen(String foo) {
...
}

@KafkaHandler
public void listen(Integer bar) {
...
}

@KafkaHandler(isDefault = true)
public void listenDefault(Object object) {
...
}
}

根据 Spring Kafka 官方文档 @KafkaListener on a Class 的说明:

When messages are delivered, the converted message payload type is used to determine which method to call.
接收到消息后,会使用转换后的消息类型来决定调用哪个方法。

开发者可以基于此特性,轻松实现从简单文本消息到复杂领域事件的各种消息处理场景。

阅读更多
EasyKafka:让消息收发更简单

EasyKafka:让消息收发更简单

一、背景与现状

目前,我们团队在使用 Kafka 时主要存在以下几类问题:

  • 问题一:一个工程对接多套 Kafka 集群,工程代码缺少对多套集群的规范管理;
  • 问题二:生产环境分为基线和灰度,对接灰度 Kafka 时,工程改动繁琐;
  • 问题三:生产/消费消息时,出现大量偏技术性的重复代码:序列化、反序列化、判空、重试等;
  • 问题四:在发送消息、消费消息过程中,存在链路丢标的情况;

因此,建设统一消息组件,以解决上述问题,简化消息收发。

阅读更多
深入Spring Kafka:消费者是如何创建的?

深入Spring Kafka:消费者是如何创建的?

在 Java 生态中,Apache Kafka 通过 kafka-clients.jar 提供了原生客户端支持。开发者需要手动创建 KafkaConsumer 实例并订阅指定主题(Topic)来实现消息消费。典型实现如下:

1
2
3
4
5
6
7
8
9
10
public void pollMessages() {
// 1. 初始化消费者实例
Consumer<String, String> consumer = new KafkaConsumer<>(getConsumerConfig());
// 2. 订阅主题并设置重平衡监听器
consumer.subscribe(Collections.singleton(topic), new RebalanceListener());
// 3. 轮询获取消息(超时时间1秒)
ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(1000));
// 4. 同步提交偏移量
consumer.commitSync();
}

Spring Kafka 在原生客户端基础上进行了深度封装,通过声明式注解显著简化了开发流程。例如,只需使用 @KafkaListener 注解即可实现消息监听:

1
2
3
4
@KafkaListener(id = "orderService", topics = "order.topic")
public void handleOrderEvent(ConsumerRecord<String, String> record) {
// 业务处理逻辑
}

这种简洁的语法背后,Spring Kafka 实际上构建了一套完整的消费者(Consumer)管理机制。那么问题来了:Spring Kafka 是如何创建这些消费者的呢?

阅读更多
如何优雅地使用本地缓存?
【译】Apache Shiro介绍

【译】Apache Shiro介绍

一、什么是 Apache Shiro?

Apache Shiro 是一个功能强大且易于使用的 Java 安全框架,表现在身份认证、授权、加密和会话管理,可用于保护任何应用程序,小到命令行应用程序、移动应用程序,大到 Web 和企业应用程序。

应用程序安全性的 4 个基石:

  • 身份验证 - 证明用户身份,通常称为用户“登录”
  • 授权 - 访问控制
  • 加密 - 保护或隐藏数据免遭窥探
  • 会话管理 - 每个用户的时间敏感状态
阅读更多
MySQL是如何给表加字段的?

MySQL是如何给表加字段的?

在我最近的项目中,经常会有给大表加字段的需求,这个过程非常耗时。

可以看到,900 万数据量的一张表,加一个字段就需要 3 个小时左右。

我们知道,给一个表加字段,或者修改字段,或者加索引,需要扫描全表的数据。假设表数据量比较大,加字段的过程将会非常耗时。

不过我最关心的是,在加字段的过程中,会不会对业务的增删改查造成影响?在询问 DBA 后,他给出的答复是不会造成影响。这不禁让我思考这背后的实现原理。

下面,我们就来一探究竟。

阅读更多
MyBatis拦截器在实际项目中的应用

MyBatis拦截器在实际项目中的应用

MyBatis 是一个流行的 Java 持久层框架,它简化了数据库访问的复杂性,为开发者提供了强大的功能。其中,MyBatis 拦截器是一个非常有用的特性,可以帮助开发者灵活地解决各种问题。

本文将探讨 MyBatis 拦截器在实际项目中的应用场景和具体实现方法。

文中代码:https://github.com/studeyang/mybatis-interceptor-demo

阅读更多
Kafka 位移提交的正确姿势

Kafka 位移提交的正确姿势

你说你 Kafka 用了很多年了,但是位移提交的这些细节你未必清楚。

不久前有个同事出去面试了,他说在 Kafka 问题上被面试官藐视了。

阅读更多
Spring Security入门:保护Web应用

Spring Security入门:保护Web应用

本文我们将构建一个简单但完整的小型 Web 应用程序,以演示 Spring Security 的入门教程。大致逻辑是:当合法用户成功登录系统之后,浏览器会跳转到一个系统主页,并展示一些个人健康档案(HealthRecord)数据。

让我们开始吧!

阅读更多
程序员的修炼-知识与体系

程序员的修炼-知识与体系

本文来自我最近正在学习的课程,极客时间胡峰的专栏文章《程序员进阶攻略》,内容如下。

今年年初,我学习了梁宁的《产品思维》课,其中有一篇叫《点线面体的战略选择》,我觉得特别有感触。虽然是讲产品,但假如把个人的成长当成产品演进一样来发展,会有一种异曲同工、殊途同归之感。

在我工作的经历中就曾碰到过这么一个人,他一开始做了几年开发,从前端到后端,后来又转做测试,接触的“点”倒是不少,但却没能连接起来形成自己的体系,那他个人最大的价值就局限在最后所在的“点”上了。

其实个人的成长有很多方面,但对于程序员的成长最重要的就是知识体系的构建,这其实就是一个 “点线面体” 的演进过程。

下面我会结合自己的成长路线来梳理下这个体系的建立过程。

阅读更多