【问题标题】:Is it possible to discover endpoint parameters in a Spring Boot application?是否可以在 Spring Boot 应用程序中发现端点参数?
【发布时间】:2020-03-04 16:17:19
【问题描述】:

我有一个 Spring Boot 应用程序为 REST 请求公开一些端点。我正在尝试解耦两个组件(它们当前直接调用彼此的代码),并且我希望它们相互发出 REST 请求(用于最终的微服务实现)。我知道端点发现可以通过发现服务(例如 Eureka)来完成,但是有没有办法将需要它的服务的参数信息传递给请求它的客户端? 示例:我有一个购物车服务,它依赖于有关可供购买的产品的信息。使用 Eureka(或其他服务发现工具)我可以注册我的服务,以便购物车服务现在知道产品服务。如果产品服务有类似的东西:

@GetMapping("/product")
public Product findById(@RequestParam int id) {
  return products.find(id);
}

我知道要使用此端点获取 ID 为 3 的产品,购物车服务必须向 http://localhost:1234/product?id=3 发出请求,但有没有办法在运行时发现这些参数及其所需类型?在我的示例中,如果我使用 Eureka,购物车服务会动态了解产品服务的位置,但不会了解其端点将接受的参数。我知道 Spring Boot Actuator 应该提供此信息,但每当我使用它时,我的端点的 params 字段始终为空。

【问题讨论】:

  • swagger 可以用吗?
  • @Vishrant Swagger 是否允许在应用程序级别公开信息?我已经在浏览器中使用它来测试我的 API,但我从未在一项服务中利用它来获取有关另一项服务的信息。
  • 不确定你所说的“应用程序级别”是什么意思,但你可以通过SwaggerJSON 的形式公开你的API(然后你可以在你的应用程序中解析它),检查这个答案stackoverflow.com/a/56511473/2704032JSON 将通过此端点获得http://<host>:<port>/v2/api-docs

标签: java spring-boot rest microservices service-discovery


【解决方案1】:

有没有办法在运行时发现这些参数及其所需的类型?

您真的在运行时需要这些信息吗?

因为如果您在开发时需要它会简单得多。然后你可以使用类似Swagger 的东西,它将提供一个服务规范端点。它甚至可以为您的服务生成客户端。

但是,如果您真的想要在运行时使用它,那么使用 HATEOAS API 可能会更好。 HATEOAS(作为应用程序状态引擎的超媒体)意味着您的 API 是可导航的。这意味着客户端可以按照提供的链接“抓取”您的 API,就像人类在网站中导航一样。它将有多大用处,取决于您要达到的目标。

对此有两种流行的“解决方案”:

  • HAL(超文本应用程序语言)- 仍然是 Internet 草案
  • JSON-LD(用于链接数据的 JSON)- W3C 标准

Spring Boot 支持 HAL,请参阅 spring-boot-starter-hateoas

【讨论】:

  • 我之前使用 Swagger 在浏览器中测试我的端点,但我从未尝试使用它将端点信息公开给不同的服务。你知道这是否可能吗?我想这些信息不需要在运行时处理,更多的是我想知道是否有比直接将端点信息烘焙到代码中更简单的方法。
【解决方案2】:

您可以使用参数映射,它将动态填充所有使用的参数:

@GetMapping("/product")
public Product findById(@RequestParam Map<String,String> allRequestParams) {
 return products.find(allRequestParams.get("id"));
}

您可以迭代参数映射以查找存在哪些参数。

【讨论】:

  • 参数映射是从客户端传给服务的,不是吗?我想知道是否有可能使客户端发现服务端点可用的参数?例如,在上面的示例中,/product 端点需要传递一个 ID 参数。有没有办法让我的购物车调用 /product 端点来提前知道它需要传递哪些参数?基本上我想我想知道如何最好地与您的解决方案相反。
  • @Matteo Gallinucci 感谢您发布您的答案,我对我在评论部分发布的招摇有同样的感觉,但是在同一个帖子中发布 2 个答案有什么必要呢?你能把它们合二为一吗?
  • @Vishrant 为什么?它们是完全不同的答案。
【解决方案3】:

您可以在您的产品服务中使用Swagger 来生成api,公开在json 文件中。例如,您可以查看示例项目 petstore 及其 json exposed,其中包含带有定义的 API 和参数。

然后在您的购物车服务中,您可以在运行时导航产品服务 api,迭代特定的 api 参数。

【讨论】:

    猜你喜欢
    • 2022-06-30
    • 2015-12-25
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 2019-02-14
    • 2019-04-02
    • 2023-04-02
    相关资源
    最近更新 更多