【问题标题】:Spring Integration code sharing between outbound/inbound出站/入站之间的 Spring Integration 代码共享
【发布时间】:2021-06-03 12:10:03
【问题描述】:

假设您有一个带有入站 HTTP 接口的应用程序(我们称之为 B)(要求使用 HTTP)。您将来会从其他几个不同的应用程序中调用它,但目前您只想开发一个客户端(我们称之为 A)。所以在A中,有一个出站HTTP网关:

A (outbound gateway) ---[HTTP]---> (inbound gateway) B

是否可以共享代码,例如HTTP API 定义,例如路径(例如“/hello”)、方法(GET、POST、PUT ...),可能是这两个应用程序之间的参数/它们的类型/响应?如果是,怎么做?

我想使用 Java DSL,但我看到 Http.inboundGateway("..")Http.outboundGateway("..") 完全不同(例如类型),所以我不确定。理想情况下,我可以有类似的东西:

  @Bean
  public IntegrationFlow inbound() {
    return IntegrationFlows.from(apiDefinition)...
                           .get();
    ...
    ...

  @Bean
  public IntegrationFlow outbound() {
    return IntegrationFlows.from(somehwere)...
                           .handle(with(apiDefinition))
                           .get();

Api 定义可以想象成如下(伪代码):

apiDefinition =
  method: GET
  path:   /items/{id}
  parameters:
    id: string
  response: item

【问题讨论】:

    标签: java spring spring-integration spring-integration-dsl spring-integration-http


    【解决方案1】:

    好吧,这听起来更像是您不想通过 HTTP 进行调用,因为您的客户端能够直接访问业务逻辑。在这种情况下,Spring Integration 中存在的最好的东西是 MessageChannel 抽象。因此,无论输入端点是什么(HTTP、JMS、Apache Kafka、JDBC 等),您始终可以将它们指向同一个通道,其中某个服务激活器是该通道的订阅者,以执行所需的业务逻辑。

    因此,要通过当前客户端中的 HTTP 调用,您只需引入 MessageChannel 作为带有业务逻辑的 IntegationFlow 的输入。 HTTP 入站流将使用.channel(myBusinessLogicChannel)。你的出站在它的逻辑上也会做同样的事情。这样,您将有两个客户端用于相同的 API:一个通过 HTTP,另一个直接。

    我还可以建议研究什么是消息传递网关,作为从客户端角度设计具有少量消息交互的高级 API 的替代方案。结果将是相同的:HTTP 入站流可以调用该网关。并且可以在其他终端用户代码中直接调用。

    查看更多关于渠道和网关的文档:

    https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway

    【讨论】:

    • 我想我明白你的意思,但不幸的是,这两个应用程序(客户端 - 请注意,将来会有多个客户端,以及具有入站 http 流的服务器) ) 必须通过 HTTP 进行通信,并且它们将在不同的机器等上运行。
    • 我在说我需要使用 HTTP 的部分添加了一些重点。抱歉,我不明白关于localhost 的部分,因为我提到它们(客户端和服务器)将在不同的机器上运行。我试图详细说明名为“apiDefinition”的虚构构造的含义——我的问题是是否有一种方法可以表达类似的东西并在客户端和服务器代码之间以这种方式共享 API 的定义。
    • 类似的东西是 Swagger 文件和代码生成。客户端和服务器代码可以从相同的 API 定义生成(在 Swagger 的情况下,是一个描述符文件)。我在问 Spring Integration with HTTP 是否存在类似的东西,以 DSL、描述符文件、XML 或任何形式。
    • 所以,您所说的是类似于 REST 合约的东西。嗯,不。没有类似 Spring Integration 的代码生成。它不是消息友好的。听起来更像是一个不能太独立于平台和 API 的 RPC。另一方面,Spring Integration 有一个通用的 Service Activator 模式 impl,您可以在其中使用上述 Swagger 生成的存根。
    • 谢谢,“通用服务激活器模式 impl”听起来不错,如果可能的话,能否给我一些代码示例?
    【解决方案2】:

    我会在 Spring Boot 上运行 A。只是一种常规的 MVC 方法。如果您想在将来添加一个 GUI 以使其具有前端,即使现在您只需要一个 API,它也可以使其具有可扩展性。然后你可以设置你的端点来返回你想要的任何数据作为 SuccessResponse 包含 HashMap 或任何你想要的数据结构 Serialized 并作为 HTTP 响应传回。如果您想了解它的外观,可以查看我关于 Spring Boot 的一些问题。还有来自 Baeldung here 的 Spring Boot 文档。还有一个 spring boot 项目启动器here,它可以让您设置整个项目,包括依赖项、构建自动化工具等。

    【讨论】:

      猜你喜欢
      • 2011-04-14
      • 2016-05-07
      • 2017-06-16
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多