Spring Cloud Stream集成Kafka
- 项目创建
- 项目依赖
- 集成配置
- 集成生产者
- 集成消费者
- 集成验证
- 生产者验证
- 消费者验证
Spring Cloud Stream是一个构建消息驱动微服务的框架,抽象了MQ的使用方式, 提供统一的API操作。Spring Cloud Stream通过Binder(绑定器)、inputs/outputs Channel完成应用程序和MQ的解耦。
- Binder
负责绑定应用程序和MQ中间件,即指定应用程序是和KafKa交互还是和RabbitMQ交互或者和其他的MQ中间件交互 - inputs/outputs Channel
inputs/outputs Channel抽象发布订阅消息的方式,即无论是什么类型的MQ应用程序都通过统一的方式发布订阅消息
我们已经搭建好了RabbitMQ(参考RabbitMQ安装),本文主要介绍一下Spring Cloud Stream与RabbitMQ进行集成实现消息的生产及消费。
项目创建
首先需要创建一个SpringBoot项目,命名为:spring-integration-rabbitmq
,在配置文件中导入相关的依赖。
项目情况为:
- 构建工具:Gradle
- SpringBoot版本:2.7.5
- SpringBoot依赖管理版本:1.0.15.RELEASE
- SpringCloud依赖管理版本:2021.0.5
项目依赖
配置文件build.gradle.kts的关键配置项如下:
plugins {
id("org.springframework.boot") version "2.7.5"
id("io.spring.dependency-management") version "1.0.15.RELEASE"
}
apply(plugin = "org.springframework.boot")
apply(plugin = "io.spring.dependency-management")
apply(plugin = "java")
extra["springCloudVersion"] = "2021.0.5"
dependencyManagement {
imports {
mavenBom("org.springframework.cloud:spring-cloud-dependencies:${property("springCloudVersion")}")
}
}
dependencies {
implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.cloud:spring-cloud-starter-bootstrap")
implementation("org.springframework.cloud:spring-cloud-starter-stream-rabbit")
implementation("io.springfox:springfox-boot-starter:3.0.0")
implementation("com.github.xiaoymin:swagger-bootstrap-ui:1.9.6")
}
集成配置
定义配置文件application.yml
,配置文件中主要配置RabbitMQ的地址、以及Spring Colud Stream的Binder和inputs/outputs Channel,其中:rabbitChannel1用于向RabbitMQ发送消息;rabbitChannel2用于消费RabbitMQ的消息。
spring:
rabbitmq:
host: wux-labs-vm # 定义RabbitMQ的地址
port: 5672
username: admin
password: admin
cloud:
stream:
binders:
rabbitBiner1: # 定义一个Binder,名称随意
type: rabbit # Binder的类型是 RabbitMQ
environment:
spring:
rabbit: ${spring.rabbit} # Binder的配置使用前面配置的RabbitMQ的信息
default-binder: rabbitBiner1 # 默认Binder,是前面配置的Binder的名称
bindings:
rabbitChannel1: # 定义一个通道,名称随意,在代码中使用该通道名称即可
binder: rabbitBiner1
destination: RabbitFirstExchange # 定义目标Exchange的名称
rabbitChannel2: # 定义一个通道,名称随意,在代码中使用该通道名称即可
binder: rabbitBiner1
destination: RabbitFirstExchange # 定义目标Exchange的名称
group: group0 # 作为消息的消费方,需要指定group,这个group名称对应的是RabbitMQ的Queue,如果不存在会自动创建
rabbit:
bindings:
outputRabbit:
producer:
routingKeyExpression: headers.routingKey # 定义如何指定 RoutingKey,在代码中定义Message的时候需要按这种方式定义
集成生产者
下面开发一个生产者,发送消息需要通过outputs Channel进行,使用rabbitChannel1
发送消息到RabbitMQ。
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.function.StreamBridge;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api("生产者接口")
@RestController
@RequestMapping("/producer")
public class ProducerController {
@Autowired
private StreamBridge bridge;
@ApiOperation("向RabbitMQ发送数据")
@PostMapping("/rabbitmq")
public String sendToKafka(String message) {
boolean status = bridge.send("rabbitChannel1", MessageBuilder.withPayload(message)
// 配置文件中定义了 routingKeyExpression: headers.routingKey
// 所以这里需要用设置key = routingKey的Header,指定routingKey = first
.setHeader("routingKey", "first")
.build());
return "发送消息:" + message + "=====>" + status;
}
}
集成消费者
消费消息需要通过inputs Channel进行,定义一个Processor,指定订阅通道为rabbitChannel2
,这个通道被用于进行消息消费,需要定义group。
import org.springframework.cloud.stream.annotation.Input;
import org.springframework.messaging.SubscribableChannel;
import org.springframework.stereotype.Component;
@Component
public interface ConsumerProcessor {
@Input("rabbitChannel2")
SubscribableChannel subscribableChannel();
}
启用通道并监听。
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
@EnableBinding(ConsumerProcessor.class)
public class ConsumerProcessorImpl {
@StreamListener("rabbitChannel2")
public void kafkaStreamListener(Object message) {
System.out.println("接收到RabbitMQ消息:" + new String((byte[]) message));
}
}
集成验证
生产者验证
启动SpringBoot项目并发送消息。
在RabbitMQ的Queue里面查看接收到的消息,这里的Queue是自动创建的。
消费者验证
前面消息已经发送到了RabbitMQ的Queue了,可以看到控制台直接打印出了监听到的消息。
至此,Spring Cloud Stream集成RabbitMQ完成。