Mac 上的 Kafka 工具与 SpringWolf 接口文档

Mac 上的 Kafka 工具与 SpringWolf 接口文档

介绍 Mac 上好用的 Kafka 连接工具,以及如何在 SpringBoot 项目中使用 SpringWolf 生成 AsyncAPI 文档

本文介绍 Mac 上常用的 Kafka 连接工具,以及如何在 SpringBoot 项目中集成 SpringWolf 来为异步消息接口生成文档。

一、Mac 上的 Kafka 连接工具

在 Mac 上管理和调试 Kafka 时,一个好用的 GUI 工具能大大提升效率。下面推荐几款常用的 Kafka 客户端工具:

1.1 Offset Explorer (原 Kafka Tool)

Offset Explorer 是一款老牌的 Kafka GUI 工具,特点如下:

安装方式:

# 直接从官网下载 DMG 安装包
# https://www.kafkatool.com/download.html

1.2 Conduktor

Conduktor 是一款功能强大的 Kafka Desktop 工具:

安装方式:

brew install --cask conduktor

1.3 AKHQ (原 KafkaHQ)

AKHQ 是一款开源的 Web UI 工具:

快速启动:

docker run -d \
  -p 8080:8080 \
  -e AKHQ_CONFIGURATION="akhq.connections.docker-kafka-server.properties.bootstrap.servers=host.docker.internal:9092" \
  tchiotludo/akhq

1.4 kcat (原 kafkacat)

kcat 是一款强大的命令行工具,适合喜欢 CLI 的开发者:

安装方式:

brew install kcat

常用命令:

# 列出所有 Topic
kcat -L -b localhost:9092

# 消费消息
kcat -C -b localhost:9092 -t my-topic

# 生产消息
echo "Hello Kafka" | kcat -P -b localhost:9092 -t my-topic

1.5 工具对比

工具类型开源价格推荐场景
Offset ExplorerDesktop免费/付费日常开发调试
ConduktorDesktop免费/付费企业级功能需求
AKHQWeb免费团队共享、Docker 环境
kcatCLI免费脚本自动化、快速调试

二、SpringBoot 集成 SpringWolf

SpringWolf 是一个为 Spring 项目自动生成 AsyncAPI 文档的工具,类似于 Swagger/OpenAPI 对于 REST API 的作用,但专门用于异步消息(如 Kafka、RabbitMQ 等)。

2.1 为什么需要 SpringWolf?

在微服务架构中,服务之间通过消息队列通信非常常见。但与 REST API 不同,异步消息接口往往缺乏文档化,导致:

SpringWolf 通过自动扫描项目中的 Kafka 监听器,生成标准的 AsyncAPI 文档。

2.2 添加依赖

pom.xml 中添加 SpringWolf 依赖:

<dependency>
    <groupId>io.github.springwolf</groupId>
    <artifactId>springwolf-kafka</artifactId>
    <version>1.8.0</version>
</dependency>

<!-- 可选:启用 UI -->
<dependency>
    <groupId>io.github.springwolf</groupId>
    <artifactId>springwolf-ui</artifactId>
    <version>1.8.0</version>
</dependency>

如果使用 Gradle:

implementation 'io.github.springwolf:springwolf-kafka:1.8.0'
implementation 'io.github.springwolf:springwolf-ui:1.8.0'

2.3 配置 SpringWolf

application.yml 中添加配置:

springwolf:
  docket:
    info:
      title: 订单服务 AsyncAPI 文档
      version: 1.0.0
      description: 订单服务的 Kafka 消息接口文档
      contact:
        name: 开发团队
        email: dev@example.com
    servers:
      kafka:
        protocol: kafka
        host: localhost:9092
    base-package: com.example.order

2.4 编写 Kafka 监听器

使用 @AsyncListener@AsyncOperation 注解为你的 Kafka 消费者添加文档:

import io.github.springwolf.bindings.kafka.annotations.KafkaAsyncOperationBinding;
import io.github.springwolf.core.asyncapi.annotations.AsyncListener;
import io.github.springwolf.core.asyncapi.annotations.AsyncOperation;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;

@Service
public class OrderConsumer {

    @AsyncListener(
        operation = @AsyncOperation(
            channelName = "order-created",
            description = "接收订单创建事件",
            payloadType = OrderCreatedEvent.class
        )
    )
    @KafkaAsyncOperationBinding(groupId = "order-service")
    @KafkaListener(topics = "order-created", groupId = "order-service")
    public void handleOrderCreated(OrderCreatedEvent event) {
        // 处理订单创建事件
        System.out.println("收到订单: " + event.getOrderId());
    }
}

2.5 定义消息体

import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;

@Data
@Schema(description = "订单创建事件")
public class OrderCreatedEvent {
    
    @Schema(description = "订单ID", example = "ORD-2024-001")
    private String orderId;
    
    @Schema(description = "用户ID", example = "USER-123")
    private String userId;
    
    @Schema(description = "订单金额", example = "99.99")
    private double amount;
    
    @Schema(description = "创建时间", example = "2024-12-27T10:00:00Z")
    private String createdAt;
}

2.6 发布消息的文档

对于生产者,使用 @AsyncPublisher 注解:

import io.github.springwolf.core.asyncapi.annotations.AsyncPublisher;
import io.github.springwolf.core.asyncapi.annotations.AsyncOperation;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;

@Service
public class OrderProducer {
    
    private final KafkaTemplate<String, Object> kafkaTemplate;
    
    public OrderProducer(KafkaTemplate<String, Object> kafkaTemplate) {
        this.kafkaTemplate = kafkaTemplate;
    }
    
    @AsyncPublisher(
        operation = @AsyncOperation(
            channelName = "order-shipped",
            description = "发送订单发货事件"
        )
    )
    public void sendOrderShipped(OrderShippedEvent event) {
        kafkaTemplate.send("order-shipped", event);
    }
}

2.7 访问文档

启动应用后,可以通过以下地址访问:

2.8 完整项目结构

src/main/java/com/example/order/
├── OrderApplication.java
├── config/
│   └── KafkaConfig.java
├── consumer/
│   └── OrderConsumer.java
├── producer/
│   └── OrderProducer.java
└── event/
    ├── OrderCreatedEvent.java
    └── OrderShippedEvent.java

三、最佳实践

3.1 消息命名规范

3.2 文档维护

3.3 版本管理


四、总结

希望这篇文章能帮助你在 Kafka 开发中更加高效!

Hi! 有什么可以帮你的吗?