API gateway (Zuul), объединяющий два ответа микросервиса

#java #spring #spring-boot #microservices #api-gateway

#java #весна #весенняя загрузка #микросервисы #api-шлюз

Вопрос:

У меня есть два микросервиса: микросервис пользователя и микросервис заказа.

Микросервисы пользователя возвращают данные пользователя, а микросервисы заказа возвращают данные заказа для пользователя.

http://localhost:8080/microservice1/getuser

{«id»: «100»,»name»:»test»}

http://localhost:8081/microservice2/getorders

{«идентификатор пользователя»: «100», «заказы»:{«orderid»: «5001», «productname»: «мобильный телефон»}}

Я использую Spring cloud Zuul в качестве шлюза API, который направляет запрос к каждой микросервисе.

http://localhost:9090/api/microservice1/getuser

http://localhost:9090/api/microservice2/getorders

Теперь из пользовательского интерфейса мне нужно вызвать две конечные точки

Есть ли у них какой-либо способ объединить ответы обеих микросервисов, таких как {«id»: «100», «name»: «test», «orders»:{«orderid»: «5001», «productname»: «mobilephone»}}

Так что клиенту нужно вызвать только одну конечную точкуhttp://localhost:9090/api/getdetail

как мы можем достичь этого на уровне API Gateway?

Ответ №1:

Zuul не следует использовать для агрегирования ответа, вы можете создать службу микросервиса оркестровки и внутренне, используя RestTemplate, получить весь ответ и агрегировать в соответствии с потребностями.

Сохраняйте Zuul как состояние без состояния, шлюз не должен иметь никакой логики или состояния.

Комментарии:

1. спасибо @vaquar Khan, В третьей микросервисе оркестровки, как отправить одновременный запрос, можем ли мы использовать реактивный подход или традиционный подход, например, отправить один запрос и дождаться другого

2. Если вы хотите отправить консолидированный ответ, тогда должен быть вызов синхронизации, если вы хотите сбросить запрос или ответ в db или rabbit / kafka, затем используйте асинхронный вызов. Реактивный лучше всего, если поддерживается ваша инфраструктура.