Обычно службы вызывают другие службы, когда им необходим доступ к своим данным. Каждый фрагмент данных должен принадлежать определенному сервису, который будет единственной точкой доступа к этим данным и их изменению. Некоторые сервисы будут простыми и обычно будут соответствовать модели вашего домена (например, сервис для работы с пользователями), в то время как другие будут высокоуровневыми и будут использовать данные из других сервисов (например, отображение списка фотографий вместе с информацией о пользователях, которые их загрузили). ).
В вашем случае вы должны начать снаружи и подумать о том, какие операции вы хотите сделать доступными для вашего пользователя через API (если это бэкэнд-сервис) или какие операции должны быть доступны в графическом интерфейсе, если это веб-приложение. Обратите внимание, что часть GUI часто является обычным приложением со своими собственными контроллерами: операции могут вызываться через REST (как в AngularJS), но эти конечные точки предназначены только для использования приложения GUI и не являются микросервисами в общем смысле.
Предположим, вы хотите отобразить фотографии вместе с информацией о загрузчиках. У вас может быть пользовательский сервис, который возвращает информацию о пользователе с указанным идентификатором пользователя, и сервис фотографий, который может отображать фотографии (например, путем поиска по некоторым критериям). Список фотографий будет содержать для каждой фотографии идентификатор загружающего пользователя. Таким образом, эти две службы не связаны - фото-сервис знает только об идентификаторах пользователей, но ничего не знает о самих пользовательских данных. Помимо этих двух сервисов вы можете создать третий сервис с такой операцией, как «просмотр фотографий с информацией о загрузчиках», который будет вызывать два других сервиса и объединять возвращаемые данные. Кроме того, эта операция может выполняться вашим веб-приложением, а не службой.