快速入门
五分钟左右为你展示如何创建一个Spring Cloud Stream的应用程序,它是如何从消息中间件中接收并输出接收的信息到console,这里的消息中间件有两种选择:RabbitMQ和Kafka,本文以RabbitMQ为准
这节主要简化官方文档为两步:
- 使用idea新建项目
- 添加 Message Handler , Building 并运行
使用idea新建项目
打开项目目录,新建一个moudle,名为FirstStream,pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.cnblogs.hellxz</groupId>
<artifactId>FirstStream</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>FirstStream</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-parent</artifactId>
<version>Dalston.SR5</version>
<relativePath/>
</parent>
<dependencies>
<!-- Spring boot 测试用 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Stream rabbit 依赖中包含 binder-rabbit,所以只需导入此依赖即可 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
</project>
添加 Message Handler , Building 并运行
在com.cnblogs.hellxz
包下添加启动类,并添加
@SpringBootApplication
@EnableBinding(Sink.class)
public class FirstStreamApp {
public static void main(String[] args) {
SpringApplication.run(FirstStreamApp.class, args);
}
@StreamListener(Sink.INPUT)
public void receive(Object payload) {
logger.info("Received: " + payload);
}
}
- 我们通过使用
@EnableBinding(Sink.class)
开启了Sink
的binding(绑定),这样做会向框架发出信号,以启动与消息传递中间件的绑定,并自动创建绑定到Sink.INPUT通道的目标(即queue,topic和其他)。 - 我们添加了一个处理方法,去监听消息类型为String的消息,这么做是为么向你展示框架的核心特性之一——自动转换入参消息体为指定类型
启动项目,我们去查看RabbitMQ的网页 http://localhost:15672 点击Connections,发现现在已经有一个连接进来了,我们刚才的项目,在Queues中也有一个队列被创建,我的是input.anonymous.L92bTj6FRTyOC0QE-Pl0HA
,我们点开那个唯一的队列,往下拉点开publish message,payload处输入一个hello world
,点Publlish message发送一个消息
查看控制台,你会看到Received: hello world
对于连接非本地RabbitMQ的配置:
spring.rabbitmq.host=<rabbitMQ所在的ip>
spring.rabbitmq.port=<端口号>
spring.rabbitmq.username=<登录用户名>
spring.rabbitmq.password=<密码>
Spring Cloud Stream是一个用于构建消息驱动的微服务应用程序的框架,是一个基于Spring Boot 创建的独立生产级的,使用Spring Integration提供连接到消息代理的Spring应用。介绍持久发布 - 订阅(persistent publish-subscribe)
的语义,消费组(consumer groups)
和分区(partitions)
的概念。你可以添加@EnableBinding
注解在你的应用上,从而立即连接到消息代理,在方法上添加@StreamListener
以使其接收流处理事件,下面的例子展示了一个Sink应用接收外部信息
@SpringBootApplication
@EnableBinding(Sink.class)
public class VoteRecordingSinkApplication {
public static void main(String[] args) {
SpringApplication.run(VoteRecordingSinkApplication.class, args);
}
@StreamListener(Sink.INPUT)
public void processVote(Vote vote) {
votingService.recordVote(vote);
}
}
@EnableBinding
注解会带着一个或多个接口作为参数(举例中使用的是Sink的接口),一个接口往往声名了输入和输出的渠道,Spring Stream提供了Source
、Sink
、Processor
这三个接口,你也可以自己定义接口。
下面展示的是Sink的接口内容
public interface Sink {
String INPUT = "input";
@Input(Sink.INPUT)
SubscribableChannel input();
}
@Input
注解区分了一个输入channel,通过它接收消息到应用中,使用@Output
注解 区分输出channel,消息通过它离开应用,使用这两个注解可以带一个channel的名字作为参数,如果未提供channel名称,则使用带注释的方法的名称。
你可以使用Spring Cloud Stream 现成的接口,也可以使用@Autowired
注入这个接口,下面在测试类中举例
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest
public class LoggingConsumerApplicationTests {
@Autowired
private Sink sink;
@Test
public void contextLoads() {
assertNotNull(this.sink.input());
}
}