Короткий ответ: # 2
Длинный ответ:
Я участвовал в большом проекте по микросервисам, где мы изначально делили код (DTO) между проектами, чтобы упростить связь. Мы узнали, что это болезненный подход. Во-первых, обновление библиотеки «api» означало обновление всех клиентов службы, даже если большинству из них изменения не нужны. Во-вторых, не было возможности обеспечить обратную совместимость. Несмотря на то, что мы могли бы обновить все службы до одной и той же версии библиотеки, и все прошло бы, развертывания обычно не работают атомарно, как это всегда в постоянно включенной среде, поэтому изменения были по своей сути небезопасными. Наконец, почти ни одному клиенту не нужны все поля, которые выходят из API, но у них есть объект со всеми полями, используемыми в их коде.
В конце концов, мы покончили с проектами API. На самом деле, это JSON, создаваемый службой, это API, а не DTO, используемый для генерации JSON. У клиентов будет свой DTO, содержащий только те поля, которые им нужны. Контрактное тестирование с использованием Pact гарантировало, что API не изменились несовместимыми способами.