Общий код между сервисами: shared kernel, NuGet-пакеты, базовые образы

↑ 8.3 Микросервисы и распределённые системы · ← Предыдущая · → Следующая

Желательно~3 мин чтенияУровень: senior

Зачем это на собесе

Как делиться кодом между сервисами и не создать «распределённый монолит через библиотеки».

Объяснение

Что делитьсяКакРиск
Контракты (DTO, события, proto)пакеты Company.Orders.Contracts, генерация из proto/OpenAPIверсионирование, обратная совместимость
Технические кросс-каттинг (логирование, OTel, resilience, auth)внутренние NuGet-пакеты «платформы»принудительные обновления
Утилитыпакеты с узкой ответственностью«Common» превращается в свалку
Доменная модельобычно не делитсясвязанность, единый релиз
Базовые Docker-образыобщий core-образ (сертификаты, шрифты, инструменты)единая точка обновления
Шаблоны проектов/пайплайновdotnet new шаблон, шаблоны CIдрейф от шаблона

Shared Kernel (DDD) — небольшая общая часть модели, за которую совместно отвечают команды; осознанный компромисс, а не по умолчанию.

Правила пакетов:

  • Семантическое версионирование; ломающие изменения — major.
  • Приватный NuGet-фид (GitLab/GitHub Packages, Azure Artifacts).
  • Центральное управление версиями: Directory.Packages.props.
  • Контрактные пакеты содержат только типы, без логики.
  • Сервисы обновляют пакеты независимо; поддерживайте совместимость нескольких версий.
<!-- Directory.Packages.props -->
<Project>
  <PropertyGroup><ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally></PropertyGroup>
  <ItemGroup>
    <PackageVersion Include="Company.Platform.Observability" Version="2.3.1" />
  </ItemGroup>
</Project>

Нюансы и подводные камни

  • Общий доменный код заставляет деплоить сервисы синхронно.
  • «Common»/«Shared» проект без владельца быстро растёт и связывает всех.
  • Разные версии пакетов в сервисах: конфликты сериализации, различие в поведении.
  • Лучше немного дублирования, чем сильная связанность через общий код.
  • Общий образ: не перегружайте лишними инструментами (безопасность, размер).

Практика

  1. Вынесите наблюдаемость и resilience в платформенный пакет.
  2. Настройте приватный NuGet-фид и CI публикации пакетов.
  3. Сравните генерацию клиентов из OpenAPI и общий контрактный пакет.

Вопросы с ответами

Связанные темы