Как шлюз Api объединяет ответы в виде микросервисов - PullRequest
0 голосов
/ 03 ноября 2019

Согласно статье https://dzone.com/articles/building-microservices-using есть утверждение:

Шлюз API отвечает за маршрутизацию запросов, составление и преобразование протоколов. Все запросы от клиентов сначала проходят через шлюз API. Затем он направляет запросы в соответствующий микросервис. Шлюз API часто обрабатывает запрос, вызывая несколько микросервисов и агрегируя результаты.

Мне интересно, основываясь на примере Zuul, как API-шлюз достигает этого?

Давайте представим, что у нас есть 2 микросервиса: один, который извлекает все доступные названия продуктов, и второй, который возвращает описания продуктов. В монолитной архитектуре у нас будет только один запрос на получение всех необходимых данных. В микросервисной архитектуре шлюз API должен объединять ответы (от обоих микросервисов) и возвращать один ответ.

Как должна быть реализована эта функциональность? Есть ли какие-либо рекомендации или статьи на этот счет?

1 Ответ

0 голосов
/ 04 ноября 2019

Не все API-шлюзы поддерживают агрегирование. Этот является примером агрегирования ответа двух сервисов на один клиентский вызов с использованием nginx.

Побочным эффектом этого является введение связи на уровне шлюза API.

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

  @RequestMapping(path = "/product", method = RequestMethod.GET)
  public Product getProduct() {

    var product = new Product();
    String productTitle = informationClient.getProductTitle();
    Integer productInventory = inventoryClient.getProductInventories();

    if (productTitle != null) {
      product.setTitle(productTitle);
    } else {
      product.setTitle("Error: Fetching Product Title Failed"); //Fallback to error message
    }

    if (productInventory != null) {
      product.setProductInventories(productInventory);
    } else {
      product.setProductInventories(-1); //Fallback to default error inventory
    }

    return product;
  }

Полный пример здесь

...