当前位置: 首页 > 科技观察

初识SpringCloudStream,什么是消息驱动的微服务框架

时间:2023-03-20 21:41:35 科技观察

本文转载自微信公众号《Java学习部落》,作者Java学习部落。转载本文请联系Java学习部落公众号。SpringCloudStream简介官方定义SpringCloudStream是一个为微服务应用构建消息驱动能力的框架。为部分供应商的消息中间件产品提供个性化的自动配置实现,引入了发布订阅、消费者组和分区三个核心概念。SpirngCloudStream本质上集成了SpringBoot和SpringIntegration,实现了一个轻量级的消息驱动的微服务框架。通过使用SpringCloudStream,开发者可以有效简化消息中间件的使用复杂度,让系统开发者更专注于核心业务逻辑的处理。SpringCloudStream是基于SpringBoot实现的,所以它继承了SpringBoot的优点,自动配置功能可以帮助我们快速上手。不过SpringCloudStream目前只支持自动配置RabbitMQ和Kafka这两种消息中间件。相关知识点解读《1.什么是事件驱动架构?》如上图所示,有时候系统中某个服务会因为用户操作或者内部行为而发布一个事件,服务知道这个事件在未来的某个时间点会被其他服务消费,但是它不知道服务是谁,也不关心它何时被消费。同样,消费事件的服务不一定需要知道哪个服务发出了事件。事件生产者和消费者之间的虚线表示没有直接调用的松散关系。满足以上特征的系统代表了一种松耦合的架构,通常称为事件驱动架构,这里的事件也可以理解为服务之间发送的消息。事件驱动架构本质上是一种架构设计风格,实现方法和工具有很多。在SpringCloud家族中,这个工具就是SpringCloudStream。实际上,SpringCloudStream是基于SpringIntegration实现了消息发布和消费机制,并提供了一层封装。很多关于消息发布和消费的概念和实现方式,本质上都依赖于SpringIntegration。在SpringIntegration的背后,它依赖于SpringMessaging组件来实现消息处理机制的基础设施。“2.什么是SpringMessaging?”SpringMessaging是SpringFramework中的一个模块,其作用是统一消息的编程模型。每条消息Messaging对应的模型包括消息体Payload和消息头Header。packageorg.springframework.messaging;publicinterfaceMessage{TgetPayload();MessageHeadersgetHeaders();}消息通道MessageChannel用于接收消息,调用send方法向消息通道发送消息。@FunctionalInterfacepublicinterfaceMessageChannel{longINDEFINITE_TIMEOUT=-1;defaultbooleansend(Messagemessage){returnsend(message,INDEFINITE_TIMEOUT);}booleansend(Messagemessage,longtimeout);}“消息通道中的消息是如何被消费的?”由消息通道子接口订阅的消息通道SubscribableChannel由MessageHandler消息处理器实现订阅:publicinterfaceSubscribableChannelextendsMessageChannel{booleansubscribe(MessageHandlerhandler);booleanunsubscribe(MessageHandlerhandler);}Message实际被消费/处理MessageHandler:vo@FunctionalInterfaceMesshandle(MessageHandle(?>message)throwsMessagingException;}SpringMessaging内部基于消息模型衍生了一些其他函数,如:消息接收参数和返回值处理:消息接收参数处理器HandlerMethodArgumentResolver与@一起使用Header、@Payload等注解;消息接收后的返回值处理器HandlerMethodReturnValueHandler配合@SendTo注解使用;消息体内容转换器MessageConverter;统一抽象消息发送模板AbstractMessageSendingTemplate;消息通道拦截器ChannelInterceptor;《3.什么是SpringIntegration?》springcloudstream是在盒子顶部使用SpringBoot和SpringIntegration构建的框架,方便开发者快速构建基于消息驱动的系统。SpringIntegration&EnterpriseIntegrationPatterns简介EnterpriseIntegrationPatterns是GregorHohpe和BobbyWoolf合着的EnterpriseIntegrationPatterns一书中总结的企业应用程序开发实践。数据交换方式。SpringIntegration是Spring框架对企业集成模式的实现和改编。SpringIntegration在基于Spring的应用程序中启用轻量级消息传递,并支持通过声明性适配器与外部系统集成。这些适配器提供比Spring对远程处理、消息传递和调度的支持更高级别的抽象。SpringIntegration的主要目标是为构建企业集成解决方案提供一个简单的模型,同时保持关注点分离,这对于生成可维护和可测试的代码至关重要。常见的企业集成数据传输方式如下:文件传输:系统A通过FTP轮询获取系统B产生的文件等。共享数据库:系统A和系统B共享一个数据库表,共享实体类。RPC调用:A系统和B系统对外暴露了可以相互调用的服务,如SOAP、REST等。消息传递:系统A和系统B通过消息的中间价交换数据。SpringCloudStream使用无感知的消息中间件。SpringCloudStream解决了开发者无感知地使用消息中间件的问题。因为SpringCloudStream进一步封装了消息中间件,可以实现代码级中间件的不可感知性。洞察力。高度分离的中间件和服务。SpringCloudStream实现了配置隔离。您只需要调整配置即可。可以在开发过程中动态切换中间件(比如从rabbitmq切换到kafka),使得微服务开发高度解耦,服务可以专注于多个自身的业务流程。SpringCloudStream核心概念及应用模型《??主要概念》SpringCloudStream为各大消息中间件产品提供了个性化的自动配置实现,参考了发布订阅、消费者组和分区三个核心概念。SpringCloudStream提供了许多抽象和基础组件来简化消息驱动的微服务应用程序。包含以下内容:SpringCloudStream的应用模型BindingabstractionPersistentpublish/subscribesupportConsumergroupsupportPartitioningSupport(分区支持)PluggableAPI“ApplicationModel”SpringCloudStream由一个中立的中间件核心组成。SpringCloudStream会注入输入和输出通道,应用程序通过这些通道与外界通信,通道通过一个清晰的中间件Binder连接到外部broker。“Channel”Channel描述了消息从应用程序流向Binder的通道,即ApplicationModel中的输入输出。《Binder》Binder是SpringCloudStream中一个非常重要的概念。它是应用程序和消息中间件之间的中间层。完美屏蔽了不同消息中间件的实现差异。可以简单的类比为Adapter。SpringCloudStream官方提供了两个主流消息中间件spring-cloud-stream-binder-kafka和spring-cloud-stream-binder-rabbit的Binder实现。并且还提供了专门用于测试的TestSupportBinder,开发者可以直接使用它对通道接收的内容进行断言测试。当然,SpringCloudStream也允许开发者通过它的SPI实现其他的MQBinders。目前很多MQ产品都提供了第三方的Binder实现,参考官方文档BinderImplementations。如果想实现自己的Binder,可以参考官方文档BinderSPI。《Bindings》Binding用于描述MQ中间件到应用程序的桥梁模型,即SpringCloudStream提供的《主要消息中间件的Binding抽象》Binder与输入输出通道的绑定关系描述Kafka、RabbitMQ、Redis和Gemfire的Binder实现。SpringCloudStream还包括一个TestSupportBinder,它保留一个不变的通道用于与通道的直接可靠通信。“集成Kafka”org.springframework.cloudspring-cloud-stream-binder-kafka“集成RabbitMQ”org.springframework.cloudspring-cloud-starter-stream-rabbit"Partitionsupport"SpringCloudStream支持一个应用的多个实例之间的数据分区,在分区,物理通信介质(例如,主题代理)被视为多分区结构。一个或多个生产者应用实例向多个消费者应用实例发送数据,并保证具有共同特征的数据由同一个消费者实例处理。SpringCloudStream以统一的方式为分区处理提供了一个通用的抽象,因此分区既可以用于有分区的代理(如kafka),也可以用于没有分区的代理(如rabbiemq)。分区是一个有状态的过程。非常重要的概念,它的重要性体现在性能和一致性上,保证所有相关数据一起处理,比如在时间窗平均计算的例子中,给定传感器的测量结果应该全部由同一个应用程序计算实例。SpringCloudStream小结本文是SpringCloudStream的第一篇文章。我们介绍什么是SpringCloudStream以及相关知识点的解读,帮助我们从整体上理解SpringCloudStream。