autorenew

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

本文介绍 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 开发中更加高效!