集成图
从 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
到具有某些MessageHandler
的EventDrivenConsumer
,或从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 集成组件具有不同级别的复杂性。例如,任何轮询的MessageSource
也具有一个SourcePollingChannelAdapter
和一个MessageChannel
,用于定期从源数据发送消息。其他组件可能是中间件请求-回复组件(例如JmsOutboundGateway
),具有一个使用端点来订阅(或轮询)requestChannel
(input
)以获取消息,以及一个replyChannel
(output
)来生成回复消息以发送到下游。同时,任何MessageProducerSupport
实现(例如ApplicationEventListeningMessageProducer
)都包装了一些源协议侦听逻辑,并将消息发送到outputChannel
。
在图形中,Spring 集成组件使用IntegrationNode
类层次结构表示,您可以在o.s.i.support.management.graph
包中找到它。例如,您可以对AggregatingMessageHandler
使用ErrorCapableDiscardingMessageHandlerNode
(因为它具有discardChannel
选项),并且可以使用PollingConsumer
从PollableChannel
使用时产生错误。另一个示例是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 用于确定如何绘制组件。