Должен ли клиент вызывать их напрямую один за другим, чтобы получить данные, необходимые для загрузки веб-страницы на клиенте?
Это зависит; тем не менее, я бы предложил предоставить клиенту непосредственно используемые возможности и скрыть (инкапсулировать) детали того, как собираются результаты (например, с помощью нескольких микросервисов).
Если клиент объединяет слишком много логики при объединении отдельных результатов микросервиса, это может непреднамеренно вызвать проникновение некоторой бизнес-логики в клиент. Он также может предоставить клиенту больше вашей внутренней архитектуры, чем вы хотели бы, препятствуя последующему рефакторингу микросервисов.
Таким образом, это означает, что для микросервисов иногда полезно иметь микросервис-оболочку, который предоставляет клиенту конечную точку с полезными абстракциями и которая выполняет координацию более высокого уровня с другими (возможно, теперь более внутренними) микросервисами.
(Кроме того, поездки до клиента, вероятно, обходятся дороже, чем от ваших микросервисов друг к другу.)
Например, если вы посмотрите на направление, используемое GraphQL, то обнаружите, что клиенты выдают напрямую соответствующие запросы конечной точке, которая может быть или не быть реализована как набор микросервисов. Поскольку архитектура микросервисов скрыта за GraphQL, это упрощает ее реорганизацию и делает ее более удобной для клиента. См., Например, https://stackoverflow.com/a/38079681/471129 .