集成图

从 4.3 版本开始,Spring 集成提供了访问应用程序运行时对象模型的功能,该模型可以选择包含组件指标。它以图形的形式呈现,可用于可视化集成应用程序的当前状态。o.s.i.support.management.graph 包包含收集、构建和渲染 Spring 集成组件运行时状态为单个树状Graph 对象所需的所有类。应将IntegrationGraphServer声明为 Bean 以构建、检索和刷新Graph 对象。生成的Graph 对象可以序列化为任何格式,尽管 JSON 灵活且易于在客户端解析和表示。仅包含默认组件的 Spring 集成应用程序将公开如下所示的图形:

{
  "contentDescriptor" : {
    "providerVersion" : "6.3.5",
    "providerFormatVersion" : 1.2,
    "provider" : "spring-integration",
    "name" : "myAppName:1.0"
  },
  "nodes" : [ {
    "nodeId" : 1,
    "componentType" : "null-channel",
    "integrationPatternType" : "null_channel",
    "integrationPatternCategory" : "messaging_channel",
    "properties" : { },
    "sendTimers" : {
      "successes" : {
        "count" : 1,
        "mean" : 0.0,
        "max" : 0.0
      },
      "failures" : {
        "count" : 0,
        "mean" : 0.0,
        "max" : 0.0
      }
    },
    "receiveCounters" : {
      "successes" : 0,
      "failures" : 0
    },
    "name" : "nullChannel"
  }, {
    "nodeId" : 2,
    "componentType" : "publish-subscribe-channel",
    "integrationPatternType" : "publish_subscribe_channel",
    "integrationPatternCategory" : "messaging_channel",
    "properties" : { },
    "sendTimers" : {
      "successes" : {
        "count" : 1,
        "mean" : 7.807002,
        "max" : 7.807002
      },
      "failures" : {
        "count" : 0,
        "mean" : 0.0,
        "max" : 0.0
      }
    },
    "name" : "errorChannel"
  }, {
    "nodeId" : 3,
    "componentType" : "logging-channel-adapter",
    "integrationPatternType" : "outbound_channel_adapter",
    "integrationPatternCategory" : "messaging_endpoint",
    "properties" : { },
    "output" : null,
    "input" : "errorChannel",
    "sendTimers" : {
      "successes" : {
        "count" : 1,
        "mean" : 6.742722,
        "max" : 6.742722
      },
      "failures" : {
        "count" : 0,
        "mean" : 0.0,
        "max" : 0.0
      }
    },
    "name" : "errorLogger"
  } ],
  "links" : [ {
    "from" : 2,
    "to" : 3,
    "type" : "input"
  } ]
}
5.2 版本弃用了旧版指标,转而使用 Micrometer 指标,如指标管理中所述。旧版指标已在 5.4 版本中删除,将不再出现在图形中。

在前面的示例中,图形包含三个顶级元素。

contentDescriptor 图形元素包含提供数据的应用程序的常规信息。可以在IntegrationGraphServer Bean 或spring.application.name 应用程序上下文环境属性中自定义name。框架提供其他属性,让您可以将类似模型与其他来源区分开来。

links 图形元素表示来自nodes 图形元素的节点之间的连接,因此也表示源 Spring 集成应用程序中集成组件之间的连接。例如,从MessageChannel 到具有某些MessageHandlerEventDrivenConsumer,或从AbstractReplyProducingMessageHandlerMessageChannel。为方便起见,并让您确定链接的目的,模型包括type 属性。可能的类型是:

  • input:标识从MessageChannel 到端点、inputChannelrequestChannel 属性的方向

  • output:从MessageHandlerMessageProducerSourcePollingChannelAdapterMessageChannel 的方向,通过outputChannelreplyChannel 属性。

  • error:从MessageHandler(在PollingConsumerMessageProducerSourcePollingChannelAdapter 上)到MessageChannel 的方向,通过errorChannel 属性。

  • discard:从DiscardingMessageHandler(例如MessageFilter)到MessageChannel 的方向,通过errorChannel 属性。

  • route:从AbstractMappingMessageRouter(例如HeaderValueRouter)到MessageChannel。类似于output,但在运行时确定。可能是已配置的通道映射或动态解析的通道。出于此目的,路由器通常只保留最多 100 个动态路由,但您可以通过设置dynamicChannelLimit 属性来修改此值。

可视化工具可以使用此元素中的信息来渲染来自nodes 图形元素的节点之间的连接,其中fromto 数字表示链接节点的nodeId 属性的值。例如,link 元素可用于确定目标节点上的正确port

下图显示了这些类型之间的关系(文本图像)。

              +---(discard)
              |
         +----o----+
         |         |
         |         |
         |         |
(input)--o         o---(output)
         |         |
         |         |
         |         |
         +----o----+
              |
              +---(error)

nodes 图形元素也许是最有趣的,因为它的元素不仅包含具有其componentType 实例和name 值的运行时组件,还可以选择包含组件公开的指标。节点元素包含各种通常不言自明的属性。例如,基于表达式的组件包含包含组件主要表达式字符串的expression 属性。要启用指标,请将@EnableIntegrationManagement添加到@Configuration 类中,或将<int:management/> 元素添加到您的 XML 配置中。有关完整信息,请参见指标和管理

nodeId 表示一个唯一的增量标识符,让您可以将一个组件与另一个组件区分开来。它还用于links 元素中,以表示此组件与其他组件(如果有)的关系(连接)。inputoutput 属性用于AbstractEndpointMessageHandlerSourcePollingChannelAdapterMessageProducerSupportinputChanneloutputChannel 属性。有关更多信息,请参见下一节。

从 5.1 版本开始,IntegrationGraphServer 接受一个Function<NamedComponent, Map<String, Object>> additionalPropertiesCallback,用于填充特定NamedComponentIntegrationNode 上的其他属性。例如,您可以将SmartLifecycleautoStartuprunning 属性公开到目标图形中。

server.setAdditionalPropertiesCallback(namedComponent -> {
            Map<String, Object> properties = null;
            if (namedComponent instanceof SmartLifecycle) {
                SmartLifecycle smartLifecycle = (SmartLifecycle) namedComponent;
                properties = new HashMap<>();
                properties.put("auto-startup", smartLifecycle.isAutoStartup());
                properties.put("running", smartLifecycle.isRunning());
            }
            return properties;
        });

图形运行时模型

Spring 集成组件具有不同级别的复杂性。例如,任何轮询的MessageSource 也具有一个SourcePollingChannelAdapter 和一个MessageChannel,用于定期从源数据发送消息。其他组件可能是中间件请求-回复组件(例如JmsOutboundGateway),具有一个使用端点来订阅(或轮询)requestChannelinput)以获取消息,以及一个replyChanneloutput)来生成回复消息以发送到下游。同时,任何MessageProducerSupport 实现(例如ApplicationEventListeningMessageProducer)都包装了一些源协议侦听逻辑,并将消息发送到outputChannel

在图形中,Spring 集成组件使用IntegrationNode 类层次结构表示,您可以在o.s.i.support.management.graph 包中找到它。例如,您可以对AggregatingMessageHandler 使用ErrorCapableDiscardingMessageHandlerNode(因为它具有discardChannel 选项),并且可以使用PollingConsumerPollableChannel 使用时产生错误。另一个示例是CompositeMessageHandlerNode——对于使用EventDrivenConsumer 订阅SubscribableChannel 时的MessageHandlerChain

@MessagingGateway(参见消息网关)为其每个方法提供节点,其中name 属性基于网关的 Bean 名称和简短的方法签名。考虑以下网关示例:
@MessagingGateway(defaultRequestChannel = "four")
public interface Gate {

	void foo(String foo);

	void foo(Integer foo);

	void bar(String bar);

}

前面的网关生成的节点类似于以下内容:

{
  "nodeId" : 10,
  "name" : "gate.bar(class java.lang.String)",
  "stats" : null,
  "componentType" : "gateway",
  "integrationPatternType" : "gateway",
  "integrationPatternCategory" : "messaging_endpoint",
  "output" : "four",
  "errors" : null
},
{
  "nodeId" : 11,
  "name" : "gate.foo(class java.lang.String)",
  "stats" : null,
  "componentType" : "gateway",
  "integrationPatternType" : "gateway",
  "integrationPatternCategory" : "messaging_endpoint",
  "output" : "four",
  "errors" : null
},
{
  "nodeId" : 12,
  "name" : "gate.foo(class java.lang.Integer)",
  "stats" : null,
  "componentType" : "gateway",
  "integrationPatternType" : "gateway",
  "integrationPatternCategory" : "messaging_endpoint",
  "output" : "four",
  "errors" : null
}

您也可以使用此IntegrationNode 层次结构在客户端解析图形模型,并了解常规的 Spring 集成运行时行为。有关更多信息,另请参见编程技巧和窍门

5.3 版本引入了IntegrationPattern 抽象和所有现成的组件,这些组件表示企业集成模式 (EIP),并实现此抽象并提供IntegrationPatternType 枚举值。此信息可用于目标应用程序中的一些分类逻辑,或者公开到图形节点中,可由 UI 用于确定如何绘制组件。