Integration Graph

从 4.3 版本开始,Spring 集成提供对应用程序运行时对象模型的访问,其中可以(选择性地)包括组件指标。它公开为一个图形,可用于形象化展示集成应用程序的当前状态。o.s.i.support.management.graph 包含了收集、生成和渲染 Spring 集成组件的运行时状态为一个单一树状 Graph 对象所需的所有类。IntegrationGraphServer 应该声明为一个 bean,以生成、检索和刷新 Graph 对象。生成的 Graph 对象可以序列化为任何格式,但 JSON 在客户端侧解析和表示起来灵活且方便。一个仅有默认组件的 Spring 集成应用程序会公开一个如下所示的图形:

{
  "contentDescriptor" : {
    "providerVersion" : "{project-version}",
    "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"
  } ]
}

Metrics Management 所讨论的,版本 5.2 以较新的 Micrometer 测量值弃用了旧指标。旧指标已在版本 5.4 中删除,并且将不再出现在图形中。

在上例中,该图形包含三个顶层元素。 contentDescriptor 图形元素包含提供数据的应用程序的常规信息。可以在 IntegrationGraphServer bean 或 spring.application.name 应用程序上下文环境属性中定制 name。其他属性由框架提供,让您将类似的模型与其他来源区分开来。 links 图形元素表示 nodes 图形元素中节点之间的连接,因此也表示源 Spring 集成应用程序中集成组件之间的连接。例如,从一个 MessageChannel 通过某种 MessageHandler 到一个 EventDrivenConsumer 或从一个 AbstractReplyProducingMessageHandler 到一个 MessageChannel。为了方便起见,并帮助您确定链接的目的,该模型包括 type 属性。可能的类型包括:

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

  • output:从 MessageHandlerMessageProducerSourcePollingChannelAdapter 通过 outputChannelreplyChannel 属性到 MessageChannel 的方向

  • error:从 PollingConsumerMessageProducerSourcePollingChannelAdapter 上的 MessageHandler 通过 errorChannel 属性到 MessageChannel

  • 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 配置中。有关完整的信息,请参阅 Metrics and Management。 `nodeId 代表一个唯一的自增标识符,让你能区分一个组件和另一个组件。如果组件与其他组件有关(连接),它也会在 links 元素中表示这种关系。inputoutput 特性适用于 AbstractEndpointMessageHandlerSourcePollingChannelAdapterMessageProducerSupportinputChanneloutputChannel 属性。更多信息,见下一章节。 从版本 5.1 起,IntegrationGraphServer 接受一个 Function<NamedComponent, Map<String, Object>> additionalPropertiesCallback,用于填充特定 NamedComponentIntegrationNode 上的附加属性。例如,你可以将 SmartLifecycle autoStartuprunning 属性暴露到目标图中:

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;
        });

Graph Runtime Model

Spring 集成组件具有各种复杂性等级。例如,任何轮询 MessageSource 都有一个 SourcePollingChannelAdapter,还有一个 MessageChannel,用于从源数据定期发送消息。其他组件可能是中间件请求-响应组件(如 JmsOutboundGateway),带有用于订阅(或轮询)requestChannel (input) 的消息的使用者 AbstractEndpoint,和用于生成下游回复消息的 replyChannel (output)。同时,任何 MessageProducerSupport 实现(如 ApplicationEventListeningMessageProducer)都会封装一些源协议侦听逻辑,并将消息发送到 outputChannel

在图中,Spring 集成组件使用 IntegrationNode 类层次结构来表示,你可以在 o.s.i.support.management.graph 包中找到它。例如,你可以使用 ErrorCapableDiscardingMessageHandlerNode 处理 AggregatingMessageHandler(因为它有一个 discardChannel 选项),并且可以使用 PollingConsumer 消耗 PollableChannel 时生成错误。另一个示例是 CompositeMessageHandlerNode——对于使用 EventDrivenConsumer 订阅 SubscribableChannelMessageHandlerChain

@MessagingGateway (参见 Messaging Gateways)为其每个方法提供节点,其中 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 Integration 的一般运行时行为。有关详细信息,另请参阅 Programming Tips and Tricks

版本 5.3 引入了 IntegrationPattern 抽象和所有开箱即用的组件,它们表示企业集成模式(EIP),实现此抽象并提供 IntegrationPatternType 枚举值。此信息可能对目标应用程序中的某些分类逻辑有用,或者暴露在图节点中后,UI 可以使用它来确定如何绘制组件。