系统管理
章节总结
📄️ 指标与管理
本节介绍如何捕获 Spring Integration 的指标。在最近的版本中,我们更多地依赖 Micrometer,并计划在未来的版本中更多地使用 Micrometer。
📄️ 消息历史
消息架构的关键优势在于松耦合,使得参与组件之间无需相互感知。仅凭这一点,应用程序就具备了极高的灵活性——您可以更换组件而不影响整体流程、调整消息路由、改变消息消费方式(轮询与事件驱动)等。然而,当系统出现故障时,这种看似简单的架构模式可能会带来调试难题。在调试过程中,您往往需要获取关于消息的尽可能多的信息(包括其来源、经过的通道以及其他细节)。
📄️ 消息存储
《企业集成模式》(EIP)一书指出了几种能够缓冲消息的模式。例如,聚合器会缓冲消息直到它们可以被释放,而队列通道(QueueChannel)会缓冲消息直到消费者显式地从该通道接收这些消息。由于消息流中的任何一点都可能发生故障,缓冲消息的EIP组件也引入了消息可能丢失的风险点。
📄️ 元数据存储
许多外部系统、服务或资源不具备事务性(例如Twitter、RSS、文件系统等),并且无法将数据标记为已读。此外,在某些集成解决方案中,您可能需要实现企业集成模式中的幂等接收器。为实现这一目标,并在与外部系统进行下一次交互之前存储端点的某些先前状态,或处理下一条消息,Spring Integration 提供了元数据存储组件,作为 org.springframework.integration.metadata.MetadataStore 接口的实现,遵循通用的键值约定。
📄️ 分布式锁
在许多情况下,针对某个上下文(甚至单个消息)的操作必须以独占方式执行。一个例子是聚合器组件,我们必须检查当前消息的消息组状态,以确定是否可以释放该组,或者仅将该消息添加以供将来考虑。为此,Java 提供了带有 java.util.concurrent.locks.Lock 实现的 API。然而,当应用程序是分布式的和/或在集群中运行时,问题变得更加复杂。在这种情况下,锁定具有挑战性,需要一些共享状态及其特定方法来实现独占性要求。
📄️ 控制总线
正如《企业集成模式》(EIP) 一书所述,控制总线的核心理念是:用于“应用级”消息传递的同一消息系统,也可用于监控和管理框架内的组件。在 Spring Integration 中,我们基于上述适配器进行构建,使您能够通过发送消息来调用已暴露的操作。
📄️ 有序关闭
如“MBean Exporter”中所述,MBean 导出器提供了一个名为 stopActiveComponents 的 JMX 操作,用于有序地停止应用程序。该操作有一个 Long 类型的参数。该参数表示操作等待多长时间(以毫秒为单位)以允许正在处理的消息完成。该操作的工作原理如下:
📄️ 集成图
从 4.3 版本开始,Spring Integration 提供了对应用程序运行时对象模型的访问,该模型可以选择性地包含组件指标。它以图的形式暴露,可用于可视化集成应用程序的当前状态。o.s.i.support.management.graph 包包含了所有必需的类,用于收集、构建和渲染 Spring Integration 组件的运行时状态,并将其作为一个单一的树状 Graph 对象。应声明 IntegrationGraphServer 作为 bean 来构建、检索和刷新 Graph 对象。生成的 Graph 对象可以序列化为任何格式,尽管 JSON 在客户端解析和表示方面既灵活又方便。一个仅包含默认组件的 Spring Integration 应用程序将暴露如下所示的图:
📄️ 集成图控制器
如果你的应用程序是基于Web的(或构建在带有嵌入式Web容器的Spring Boot之上),并且Spring Integration HTTP或WebFlux模块(分别参见HTTP支持和WebFlux支持)存在于类路径中,你可以使用IntegrationGraphController将IntegrationGraphServer的功能作为REST服务公开。为此,HTTP模块中提供了@EnableIntegrationGraphController和@Configuration类注解以及int-http:graph-controller/ XML元素。结合@EnableWebMvc注解(或XML定义中的mvc:annotation-driven/),此配置会注册一个IntegrationGraphController @RestController,其@RequestMapping.path可以在@EnableIntegrationGraphController注解或int-http:graph-controller/元素上进行配置。默认路径为/integration。