【问题标题】:Is it possible to remotely expose a bean in spring boot using REST and httpInvoker是否可以使用 REST 和 httpInvoker 在 Spring Boot 中远程公开 bean
【发布时间】:2015-06-29 05:00:31
【问题描述】:

我需要公开一些服务以供 Java 客户端(它们应该使用 httpinvoker)和其他语言(它们应该使用 REST)远程使用。

我可以配置 spring boot 来暴露两者吗? (我不介意是否会使用两个具有不同端口的独立实例,例如this post)。

我放弃了为 内部使用 REST 的 Java 客户端提供 API 的想法,因为使用 RestTemplate. 手动将所有 REST 端点连接到代码中是相当乏味的 我喜欢 HttpInvoker 的概念,因为 ProxyFactoryBean 会自动使用。如果 Spring Remoting 能够以 JMS、AMQP 和其他人可以做到的方式做到这一点,我会朝这个方向前进。

【问题讨论】:

  • 您可能混合了两个习惯用法:RPC 和状态传输。 httpInvoker 是关于远程过程调用的。您只需调用一个方法,传入一些参数并获得某种结果。在 REST 中,您几乎要处理更改某物的特定状态(这基本上是 REST 的想法)。我想,这种情况的最佳解决方案是在您的服务前面有两个不同的外观,它们遵循每种 API 样式的原则。
  • 我认为这两种技术都可以改变状态。在 REST 中,它是一个 http GET,使用 httpInvoker,您可以调用一个 getMethod。对于修改/创建值 REST 使用 PUT/POST 和 httpInvoker 调用 set/create。但是,当您谈论这两个立面时,这就是有趣的地方:如何以优雅的方式完成?
  • @Marged 为什么要使用 Spring 的 HttpInvoker 等已弃用的工具?它在 Spring 2.0 中已被弃用,我认为 Spring Boot 不会自动配置甚至管理依赖项。
  • 我还没有在 spring boot 中检查对 httpinvoker 的支持,因此缺少 boot 支持可能会成为一个问题。您是否有弃用 httpinvoker 的来源?我知道它的支持在 spring 集成中发生了变化,但我认为即使在当前版本的 spring 中它也是积极支持的
  • 您不能将 bean 配置为通常的 Rest 服务并使用 httpinvoker 公开它吗? HttpInvoker 配置非常简单,不用 SpringBoot 也可以自己完成

标签: rest spring-boot spring-remoting httpinvoker


【解决方案1】:

你可以使用这样的东西。将您的服务公开为休息服务。然后让您的 java 客户端使用http 或其他一些库来使用这些服务。如果任何其他方也有兴趣,他们也可以以自己的方式消费它。

否则,您可以创建自己的 jar 来使用您的 REST 服务并让您的 Java 客户端使用它,而无需了解有关 REST 服务的知识。

【讨论】:

  • 创建一个调用 REST 接口的 jar 是我转储的方法。我寻求一种简单的方法,其中最大的部分是自动创建的。当我单独使用每种技术时,这适用于 httpinvoker 和 REST。
【解决方案2】:

在 Spring Boot 中公开 HTTP 调用程序端点实际上非常容易,以至于看起来好像缺少了什么。在路径上有spring-webmvc 的@SpringBootApplication 中(例如使用spring-boot-starter-web POM),添加以下bean 定义:

@Bean(name = "/my.service")
public HttpInvokerServiceExporter myHttpInvokerServiceExporter(MyService myServiceImpl) {
    HttpInvokerServiceExporter exporter = new HttpInvokerServiceExporter();
    exporter.setServiceInterface(MyService.class);
    exporter.setService(myServiceImpl);
    return exporter;
}

HTTP 调用程序端点现在在 /my.service 公开,不会影响任何其他映射。您可以根据需要添加任意数量的此类端点;然后是一些@RequestMappings 用于顶部的 REST。

【讨论】:

    【解决方案3】:

    我们在这里使用这两种技术。用于 Java 到 Java 调用的 HttpInvoker。用于其他客户端的基于 HTTP 的普通 JSON(类似于 REST,但不是真正的 REST)。我认为 jsonrpc4j 项目提供了一种很好的方式来实现 HTTP 的东西。

    【讨论】:

      【解决方案4】:

      看看 spring-rest-invoker。它将 Java 接口绑定到 REST 服务。这并不能解决“暴露”服务的问题,但可以更容易地使用它。

      https://github.com/ggeorgovassilis/spring-rest-invoker

      【讨论】:

        【解决方案5】:

        HttpInvoker 在 spring-integration 2.x 之后被删除:http://docs.spring.io/spring-integration/docs/2.0.x/reference/html/httpinvoker.html(!重要的标头提供了详细信息)。在 3.x 和 4.x 版本中有对 HTTP 支持的引用:http://docs.spring.io/spring-integration/docs/latest-ga/reference/html/http.html

        还有另一个 SO 帖子,有人询问 HTTP 支持和 Spring Boot 以及一些相关信息:Spring Integration Http with Spring Boot and @RequestMapping

        希望这能让你走出兔子洞。

        【讨论】:

        • 也许我误解了这一点,但仅仅因为 Spring Integration 放弃了对 HttpInvoker 的支持,它并不意味着 Sprint 本身放弃或弃用了它。因为我没有使用 Spring Integration,所以应该不会遇到问题。
        猜你喜欢
        • 1970-01-01
        • 2021-01-16
        • 1970-01-01
        • 2019-12-14
        • 1970-01-01
        • 2021-03-03
        • 2015-03-17
        • 2020-09-26
        • 1970-01-01
        相关资源
        最近更新 更多