集成图
从 4.3 版本开始,Spring Integration 提供了对应用程序运行时对象模型的访问,该模型可以选择包含组件指标。它以图形的形式公开,可用于可视化集成应用程序的当前状态。o.s.i.support.management.graph
包含所有必需的类,用于收集、构建和呈现 Spring Integration 组件的运行时状态,作为单个树状 Graph
对象。IntegrationGraphServer
应声明为 bean 以构建、检索和刷新 Graph
对象。生成的 Graph
对象可以序列化为任何格式,尽管 JSON 在客户端侧灵活且易于解析和表示。仅包含默认组件的 Spring Integration 应用程序将公开如下图形
{
"contentDescriptor" : {
"providerVersion" : "6.3.0",
"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
图形元素包含有关提供数据的应用程序的一般信息。name
可以在 IntegrationGraphServer
bean 或 spring.application.name
应用程序上下文环境属性中自定义。其他属性由框架提供,可让您区分来自其他来源的类似模型。
links
图形元素表示来自 nodes
图形元素的节点之间的连接,因此表示源 Spring Integration 应用程序中集成组件之间的连接。例如,从 MessageChannel
到 EventDrivenConsumer
,其中包含一些 MessageHandler
,或者从 AbstractReplyProducingMessageHandler
到 MessageChannel
。为了方便起见,并让您确定链接的目的,模型包含 type
属性。可能的类型为
-
input
:标识从MessageChannel
到端点的方向,inputChannel
或requestChannel
属性 -
output
:从MessageHandler
、MessageProducer
或SourcePollingChannelAdapter
到MessageChannel
的方向,通过outputChannel
或replyChannel
属性 -
error
:从MessageHandler
到PollingConsumer
或MessageProducer
或SourcePollingChannelAdapter
到MessageChannel
的方向,通过errorChannel
属性; -
discard
:从DiscardingMessageHandler
(如MessageFilter
)到MessageChannel
的方向,通过errorChannel
属性。 -
route
:从AbstractMappingMessageRouter
(如HeaderValueRouter
)到MessageChannel
。类似于output
,但在运行时确定。可能是配置的通道映射或动态解析的通道。路由器通常为此目的仅保留最多 100 个动态路由,但您可以通过设置dynamicChannelLimit
属性来修改此值。
来自此元素的信息可用于可视化工具来呈现来自 nodes
图形元素的节点之间的连接,其中 from
和 to
数字表示链接节点的 nodeId
属性的值。例如,link
元素可用于确定目标节点上的正确 port
。
以下“文本图像”显示了类型之间的关系。
+---(discard) | +----o----+ | | | | | | (input)--o o---(output) | | | | | | +----o----+ | +---(error)
nodes
图形元素可能最有趣,因为它的元素不仅包含具有其 componentType
实例和 name
值的运行时组件,还可以选择包含组件公开的指标。节点元素包含各种属性,这些属性通常是不言自明的。例如,基于表达式的组件包括包含组件主要表达式字符串的 expression
属性。要启用指标,请将 @EnableIntegrationManagement
添加到 @Configuration
类中,或将 <int:management/>
元素添加到您的 XML 配置中。有关完整信息,请参阅 指标和管理。
nodeId
代表一个唯一的增量标识符,让您区分一个组件与另一个组件。它也用于 links
元素中,以表示此组件与其他组件的关系(连接),如果有的话。input
和 output
属性用于 AbstractEndpoint
、MessageHandler
、SourcePollingChannelAdapter
或 MessageProducerSupport
的 inputChannel
和 outputChannel
属性。有关更多信息,请参阅下一节。
从 5.1 版开始,IntegrationGraphServer
接受一个 Function<NamedComponent, Map<String, Object>> additionalPropertiesCallback
,用于在特定 NamedComponent
的 IntegrationNode
上填充其他属性。例如,您可以将 SmartLifecycle
的 autoStartup
和 running
属性暴露到目标图形中。
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 Integration 组件具有不同级别的复杂性。例如,任何轮询的 MessageSource
也具有一个 SourcePollingChannelAdapter
和一个 MessageChannel
,用于定期将消息从源数据发送到该通道。其他组件可能是中间件请求-回复组件(例如 JmsOutboundGateway
),具有一个消费 AbstractEndpoint
来订阅(或轮询)requestChannel
(input
)以获取消息,以及一个 replyChannel
(output
)来生成要发送到下游的回复消息。同时,任何 MessageProducerSupport
实现(例如 ApplicationEventListeningMessageProducer
)都包装了一些源协议侦听逻辑,并将消息发送到 outputChannel
。
在图形中,Spring Integration 组件使用 IntegrationNode
类层次结构表示,您可以在 o.s.i.support.management.graph
包中找到它。例如,您可以将 ErrorCapableDiscardingMessageHandlerNode
用于 AggregatingMessageHandler
(因为它具有 discardChannel
选项),并且可以通过使用 PollingConsumer
从 PollableChannel
消费时产生错误。另一个例子是 CompositeMessageHandlerNode
,用于 MessageHandlerChain
,当通过使用 EventDrivenConsumer
订阅 SubscribableChannel
时。
@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 Integration运行时行为。有关更多信息,请参见编程技巧和窍门。
版本 5.3 引入了IntegrationPattern
抽象,所有开箱即用的组件(代表企业集成模式 (EIP))都实现了此抽象并提供了一个IntegrationPatternType
枚举值。此信息对于目标应用程序中的某些分类逻辑很有用,或者,如果暴露到图形节点中,它可以被 UI 用于确定如何绘制组件。