Spring中云事件简介

20-12-12 banq

跨系统和平台的数据一致性是Cloud Event规范的一个独特而崇高的目的。随着越来越多的采用,希望是开发人员和架构师将不再需要担心如何处理来自不同系统和平台的各种事件。

Message是EIP Message的Spring实现,它是表示Cloud Event的适当结构!

 

消息是云事件

根据官方网站的说法,Cloud Events是“以通用方式描述事件数据的规范”。

如果您阅读了该规范(这很简单),您很快就会意识到Cloud Event有效地定义了规范和独立于平台的数据结构,从而可以在系统和平台之间以统一的方式进行交换。结构很简单。它将一些有效载荷封装为一个data字段,并将其他元数据封装为attributes(键/值结构)。的attributes本身是分割成称为明确定义的元数据字段attributes(必需和可选)称为和松散定义或未定义字段extension attributes。

现在,对于那些熟悉消息(核心企业集成模式之一)及其在Spring Messaging中定义的人来说,您可能会说:这看起来非常熟悉!当然是这样。

就像Cloud Event一样,Message定义了规范的和独立于平台的数据结构,以统一的方式在系统和平台之间交换。这种结构也非常简单。它将一些有效载荷封装为一个payload字段,将元数据封装为headers(键/值结构)。

 

当前依赖Spring Messaging的数万个框架和应用程序可以自动支持Cloud Event用例,这意味着此类框架的用户以及框架本身将能够识别传入的Cloud Event实例并创建它们,所有这些都在规范定义的协议详细信息范围内,例如属性前缀,类型系统等。

 

使用模式

我们还需要查看一些典型的Cloud Event使用模式。我们这样做是为了隔离我们所谓的功能与非功能(样板)方面。因此,让我们描述其中的一些:

  • 产生一些东西并将其封装到Cloud Event中
  • 消费可能源自云事件的内容
  • 消耗实际的Cloud Event(与上面的有所不同,因为它意味着消耗了整个事件)
  • 根据Cloud Event属性进行路由和过滤

 

Spring

十多年来,Spring已通过基于消息的框架成功支持转换,类型转换,路由,过滤和许多其他消息传递模式(其中大多数由Enterprise Integration Patterns描述),生产中有成千上万个用户应用程序在运行。我们如何忘记基础结构类型的问题,例如连接性,会话和事务管理,发送和接收,重试,错误处理,恢复等等

Spring尝试处理非功能性(模板)问题,只给您提供功能性(业务逻辑)问题。在Spring Boot时代,支持Cloud Events的典型Spring应用程序会是什么样?

这是一个应用程序示例,该应用程序接收Cloud Event作为HTTP请求并生成Cloud Event作为HTTP响应:

@SpringBootApplication
public static class SampleApplication
  public static void main(String args) throws Exception {
    SpringApplication.run(SampleApplication.class, args);
  }

  @Bean
  Function<Person, Employee> hire() {
    return person -> {
            Employee employee = ...
            return employee;
        };
  }
}

这是一个应用程序示例,该应用程序从Apache Kafka接收一个Cloud Event并将其发送到RabbitMQ消息传递代理:

@SpringBootApplication
public static class SampleApplication
  public static void main(String args) throws Exception {
    SpringApplication.run(SampleApplication.class, args);
  }

  @Bean
  Function<Person, Employee> hire() {
    return person -> {
            Employee employee = ...
            return employee;
        };
  }
}

我们省略了功能的实现细节,因为它们与该主题无关。该框架并不真正在乎您的工作。它只关心您的期望–输入–和您产生的–输出–信息可从函数签名中获得。

您可能想知道为什么上面两个不同的应用程序实际上是相同的?那么如何区分一个应用程序是REST端点,而另一个应用程序是消息处理程序呢?

好吧,要回答这些问题,我们需要了解执行的上下文,该上下文来自可用于您的应用程序类路径的Spring Boot自动配置。因此,例如,为了使第一个应用程序的描述正确,您需要spring-cloud-function-web对类路径的依赖关系,该依赖关系带来了将功能公开为REST端点所需的所有必要组件和其他自动配置。

至于第二个,我们可以简单地依靠extensive library of binders,我们已经提供了Apache Kafka,AMQP,Solace,HTTP,AWS,Google等产品。这些绑定程序和相关的自动配置会将示例代码转换为消息处理程序

 

消息

消息是核心,这是Spring中所有组件都了解一个规范的结构。这是一种可以清楚传达意图和期望的结构。它是从哪里来的?它会去哪里?谁寄的?内容是什么?它代表云事件吗?如果是这样,它是二进制模式还是结构化模式?这样的列表是无止境的,但是不变的是,消息作为一种结构和概念很容易回答这些问题。考虑到这一点,Cloud Event成为另一种消息。Spring框架可以像处理其他任何Message一样处理它,使您可以自由考虑业务逻辑,而不必考虑管道的细节。

因此,消息不仅是一个代表云事件的适当的结构,也是处理云事件的正确抽象。随着即将对消息提供的Cloud Event支持,Spring正在为依赖Spring Messaging的任何应用程序提供Cloud Events支持。 

 

猜你喜欢