7

我正在寻找一种可以在 API Gateway 中提供某种数据聚合的解决方案。我正在将 spring cloud netflix zuul 用于 API 网关。我使用 Spring Boot 创建了 3 个微服务 -

Catalog - All products 
DeviceInfo - a particular product detail 
Inventory - product stock

这是 Zuul 配置 -

zuul.routes.deviceInfo.path=/device/deviceInfo/**
zuul.routes.deviceInfo.url=http://localhost:9002/getDeviceInfo

zuul.routes.catalog.path=/device/all/**
zuul.routes.catalog.url=http://localhost:9001/getProductCatalog

zuul.routes.inventory.path=/device/stock/**
zuul.routes.inventory.url=http://localhost:9003/getInventory

ribbon.eureka.enabled=false

server.port=8080

在产品详细信息页面中,我需要拨打两个电话 -

http://localhost:8080/device/deviceInfo/ - for product details
http://localhost:8080/device/stock/ - for stock details

有没有办法对 API 网关进行一次调用,将上述两个调用的结果结合起来?两个调用都给出 JSON 作为响应。

4

2 回答 2

2

您可以使用聚合器-微服务模式,但不能在 ZUUL 中使用。将 Zuul 保持为无状态网关。聚合器微服务应该有这样的客户端代码

public String getProductTitle() {
    String response = null;
    try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
      HttpGet httpGet = new HttpGet("http://localhost:51515/information");
      try (CloseableHttpResponse httpResponse = httpClient.execute(httpGet)) {
        response = EntityUtils.toString(httpResponse.getEntity());
      }
    } catch (IOException e) {
      LOGGER.error("Exception caught.", e);
    }
    return response;
  }
}

请查看https://github.com/iluwatar/java-design-patterns/tree/master/aggregator-microservices

于 2018-03-13T21:40:57.277 回答
0

我认为最初的问题是关于此处记录的 API 组合模式。API 组合是微服务生态系统中常用的模式,其中来自客户端的单个调用可能会导致对许多微服务的调用并返回合并的结果。在 API Gateway 中执行此操作是一种相当普遍的做法,此处也有文档说明。

我自己前段时间用zuul寻找过这个解决方案,但没有找到。也许从那以后情况发生了变化。

于 2021-01-22T22:30:10.823 回答