Как видно из названия, это слой, который адаптирует запросы нашего приложения к внешнему миру.
Приложение может существовать само по себе, внешние сервисы — тоже, но чтобы они могли взаимодействовать, нужен общий протокол.
Слой адаптера как раз и выполняет эту роль.
🧩 Что считается внешней системой?
Чаще всего — это другой бекенд-сервис (микросервис), который принимает запросы и возвращает данные.
Но также внешней системой может быть:
* файловая система
* шина данных
* вебхуки
* или любые другие источники вне нашего приложения.
Соответственно, протокол взаимодействия будет зависеть от типа системы:
* для бэкендов — HTTP или gRPC
* для файлов — локальное чтение, S3 и т.д.
Поэтому внутри адаптера обычно выделяют подслой транспорта, который отвечает за конкретную коммуникацию.
⚙️ Пример: взаимодействие с бекендом
Слой адаптера, как и любой другой слой, должен иметь свой интерфейс.
Для сетевых запросов мы можем свести всё к двум операциям —
query и mutation (да, почти как в GraphQL).Где бы нам ни понадобилось обратиться к внешнему сервису, мы используем эти два метода, а уже адаптер решает, как именно выполнить запрос — через REST, GraphQL или что-то ещё.
🧱 Как сделать транспорт стабильным?
Проблема: параметры запроса в
fetch (method, body, headers) и в GraphQL (query, variables) — разные.Решение: развернуть зависимость на стабильный импорт.
Создаём свой интерфейс
TransportRequest, в котором обобщаем параметры:* вместо
resource для REST используем query для GraphQL* вместо
body — graphql query stringТак мы создаём единый контракт, не зависящий от конкретного транспорта.
📁 Пример с файловой системой
Здесь тоже появляется дополнительный уровень:
создаём интерфейс
FileMeta с полем baseDir, где локально это корень проекта, а для S3 — сервер с файлами.Дальше — транспорты:
*
node:fs для локальной работы*
s3-sdk для облакаПри этом сам адаптер FS может иметь минимальный набор методов, например:
*
files()*
write()*
read()То же самое и с API-адаптером — он просто предоставляет
query() и mutation().💡 В итоге eXternal Adapter — это граница между вашим приложением и внешним миром,
которая изолирует сложность коммуникации и делает систему по-настоящему стабильной и расширяемой.