Агрегация данных в API-шлюзе - Zuul

Я ищу решение, которое обеспечит агрегирование данных в API Gateway. Я использую весеннее облако netflix zuul для шлюза API. Я создал 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.


person Saurabh    schedule 17.08.2016    source источник
comment
но зачем вам это делать, вы создаете отдельные службы, чтобы получать индивидуальный ответ.   -  person Grinish Nepal    schedule 18.08.2016
comment
Возможно, я неправильно понимаю API Gateway. Итак, можно ли сделать два звонка? Да, обе службы имеют индивидуальные обязанности. Просто подумайте о сценарии, если нам нужно агрегировать ответ двух или более служб на основе некоторой бизнес-логики. Что бы мы тогда делали? Или такая ситуация не должна происходить при разработке микросервисов?   -  person Saurabh    schedule 19.08.2016
comment
Я не уверен, действительно ли zuul предполагает, что он в основном используется для маршрутизации. Может быть, вы можете попробовать прочитать о фильтрах zuul, если это поможет вам каким-либо образом объединить ответы. Но я твердо уверен, что zuul - не место для обобщения ответов. У вас есть службы разделены, потому что обязанности разные, и каждый служит своей цели. Если есть необходимость объединить два ответа, лучше создать новый, который сделает это, или изучить какое-то другое решение.   -  person Grinish Nepal    schedule 19.08.2016
comment
Вы узнали, как объединить их в один звонок. ?   -  person Diego Ramos    schedule 16.01.2021


Ответы (2)


Вы можете использовать шаблон агрегатор-микросервисы, но не в 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

person Armen Arzumanyan    schedule 13.03.2018

Я думаю, что исходный вопрос касается шаблона композиции API, который задокументирован здесь. Состав API - это часто используемый шаблон в экосистеме микросервисов, где один вызов от клиента может привести к вызовам многих микросервисов и возвратить консолидированный результат. Выполнение этого в API-шлюзе - довольно распространенная практика, которая также задокументирована здесь.

Я сам некоторое время назад искал это решение с помощью zuul, но не нашел. Может быть, с тех пор все изменилось.

person srini    schedule 22.01.2021