本文为Spring Cloud Stream文档的中文翻译,原文地址:
https://cloud.spring.io/spring-cloud-static/spring-cloud-stream/3.0.1.RELEASE/reference/html/spring-cloud-stream.html
另外,Spring Cloud 版本:Hoxton.SR3,支持的 Spring Boot 版本:2.2.5.RELEASE
Spring数据集成之旅简史
Spring 的数据集成之旅始于 Spring Integration。通过 Spring 编程模型,为开发人员提供了一致的开发规范,去构建可以支持 Enterprise Integration Patterns 的、与外部系统(例如数据库,消息代理等)连接的应用程序。
到了云时代,微服务在企业环境中变得尤为重要。Spring Boot 改变了开发人员构建应用程序的方式。借助 Spring的编程模型和 Spring Boot 开箱即用的特点,可以无缝的开发出基于Spring的,独立的,生产级的微服务。
为了其扩展性和(减少)数据集成的负荷,将 Spring Integration 和 Spring Boot 合并到一个新项目中。Spring Cloud Stream 诞生了。
借助 Spring Cloud Stream,开发人员可以:
- 独立地构建,测试,迭代和部署以数据为中心的应用程序。
- 应用现代微服务架构模式,包括发送消息。
- 以事件为驱动将应用程序解耦。事件可以表示及时发生的事件,下游消费者应用程序可以在不知道事件的发布者或生产者身份的情况下监听事件。
- 将业务逻辑移植到消息代理(例如RabbitMQ,Apache Kafka,Amazon Kinesis)上。
- 依靠框架对常见用例的自动内容类型支持,可以扩展到不同的数据转换类型。
- 还有很多…
快速开始(Quick Start)
你可以按照以下三个步骤,5分钟内快速使用 Spring Cloud Stream,无需关心细节。
我们向你展示了如何创建一个 Spring Cloud Stream 应用程序,它接收来自你选择的消息中间件的消息(稍后会详细介绍),并将接收到的消息输出到控制台。我们称之为LoggingConsumer
。尽管不是很实用,但是它很好地介绍了一些主要概念和抽象,使你更容易理解本文档的其余部分。
三个步骤如下:
- 使用 Spring Initializr 创建示例应用程序
- 将项目导入到 IDE 中
- 添加消息处理程序,构建并运行
使用 Spring Initializr 创建示例应用程序
首先,请访问 Spring Initializr。从那里,你可以生成我们的LoggingConsumer
应用。为此:
- 在 “Dependencies” 部分,输入
cloud stream
,选择Cloud Stream
; - 输入
kafka
或者rabbit
; - 选择
Kafka
或者RabbitMQ
;
大致来说,我们建议你使用已经安装的,或者对安装和运行用起来顺手的消息中间件,来绑定到你的应用程序上。另外,从 Spring Initializr 页面上可以看到,还有一些其他选项可以选择,例如,你可以选择 Gradle 作为构建工具,而不是 Maven(默认设置)。
- 在 Artifact 一栏,输入"logging-consumer";
Artifact 字段的值将会是应用的名称。如果你选择 RabbitMQ 作为中间件,则 Spring Initializr 现在应该如下所示:
- 点击 Generate 按钮;
这样做会将生成的项目的压缩版本下载到硬盘上。
- 将文件解压到要用作项目目录的文件夹中。
我们鼓励你探索 Spring Initializr 中更多可能性,它使你可以创建许多不同种类的Spring应用程序。
将项目导入到 IDE 中
现在,你可以将项目导入到 IDE 中。请记住,取决于 IDE,你可能要遵循特定的导入过程。例如,根据项目的生成方式( Maven 或 Gradle ),你可能要遵循特定的导入过程(例如,在 Eclipse 或 STS 中,你需要使用File → Import → Maven → Existing Maven Project)。
导入后,该项目必须没有任何错误。另外,src/main/java
应包含com.example.loggingconsumer.LoggingConsumerApplication
。
从技术上讲,现在你就可以运行应用程序的主类。它已经是一个有效的 Spring Boot 应用程序。但是它没有任何作用,因此我们要添加一些代码。
添加消息处理程序,构建并运行
将类com.example.loggingconsumer.LoggingConsumerApplication
改为如下所示:
@SpringBootApplication
public class LoggingConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(LoggingConsumerApplication.class, args);
}
@Bean
public Consumer<Person> log() {
return person -> {
System.out.println("Received: " + person);
};
}
public static class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return this.name;
}
}
}
从以上代码中可以看到:
- 我们正在使用函数式编程模型(请参阅 Spring Cloud Function 支持),将单个消息处理定义为
Consumer
。 - 我们依赖框架的约定,将接收消息绑定到 binder 上。
这样做还能使你看到框架的核心功能之一:它尝试自动将传入的消息体转换为 Person
。
现在,你有了一个可以监听消息的 Spring Cloud Stream 应用程序。从这里开始,为简单起见,我们假设你在 第一步中 选择 RabbitMQ 。假设已在本地安装并运行了 RabbitMQ,则可以通过在IDE中运行main
方法来启动应用程序。
你应该看到以下输出:
--- [ main] c.s.b.r.p.RabbitExchangeQueueProvisioner : declaring queue for inbound: input.anonymous.CbMIwdkJSBO1ZoPDOtHtCg, bound to: input
--- [ main] o.s.a.r.c.CachingConnectionFactory : Attempting to connect to: [localhost:5672]
--- [ main] o.s.a.r.c.CachingConnectionFactory : Created new connection: rabbitConnectionFactory#2a3a299:0/SimpleConnection@66c83fc8. . .
. . .
--- [ main] o.s.i.a.i.AmqpInboundChannelAdapter : started inbound.input.anonymous.CbMIwdkJSBO1ZoPDOtHtCg
. . .
--- [ main] c.e.l.LoggingConsumerApplication : Started LoggingConsumerApplication in 2.531 seconds (JVM running for 2.897)
再到 RabbitMQ web管理控制台或任何其他 RabbitMQ 客户端,然后向发送消息input.anonymous.CbMIwdkJSBO1ZoPDOtHtCg
。其中anonymous.CbMIwdkJSBO1ZoPDOtHtCg
部分表示group
已生成(随机),因此在你的环境中它必然是不同的。更确切的,可以通过设置spring.cloud.stream.bindings.input.group=hello
(或你喜欢的任何名称)来指定group
。
消息的内容应为该类Person
的JSON形式,如下所示:
{"name":"Sam Spade"}
然后,在控制台中,你应该看到:
Received: Sam Spade
你还可以将应用程序构建并打包到 jar 中(通过使用./mvnw clean install
),并使用java -jar
命令运行构建的 jar 。
现在,你有了一个可以运行的(尽管非常基础)Spring Cloud Stream 应用程序。
我的最新文章会先发到公众号【读钓的YY】上,欢迎关注!