Proxy (Заместитель): контроль доступа, сетевые вызовы и виртуализация объектов
Proxy создаёт заменяющий объект, который ведёт себя как оригинал, но добавляет дополнительные функции: контроль доступа, ленивую загрузку, сетевые вызовы, кеширование или защиту. Клиент работает с прокси как с реальным объектом, не замечая подмены.
Паттерн широко применяется в удалённых сервисах, API, клиентских библиотеках, ORM, кеширующих слоях, безопасных операциях, RPC и распределённых системах.
Proxy отделяет интерфейс от реализации, делая архитектуру безопасной, управляемой и удобной для расширения.
Proxy — это один из ключевых паттернов в архитектуре распределённых систем. Он позволяет предоставить клиенту «видимость» реального объекта, даже если объект находится:
-
в другой подсистеме;
-
в другом процессе;
-
в другом сервисе;
-
в облаке;
-
на другом сервере;
-
в другой сети.
Прокси берёт на себя сетевую коммуникацию, безопасность, кеширование или задержки, скрывая сложность взаимодействия.
Главная идея Proxy
Прокси:
-
реализует тот же интерфейс, что и оригинальный объект;
-
содержит ссылку на настоящий объект (или знает, как его создать);
-
перехватывает вызовы;
-
добавляет собственное поведение;
-
затем вызывает реальный объект (или не вызывает — в зависимости от типа прокси).
Типы Proxy и их архитектурная роль
Это один из немногих паттернов GoF, который имеет множество архитектурных вариантов, критически важных для систем.
1. Remote Proxy — удалённый объект (RPC)
Клиент вызывает метод как будто локальный, но фактически:
-
идёт сетевой вызов,
-
запрос сериализуется,
-
передается по сети,
-
вызывается на сервере,
-
ответ возвращается обратно.
Так работают:
-
gRPC
-
Thrift
-
RMI
-
CORBA
-
SOAP-клиенты
-
клиентские SDK для AWS, Azure, Яндекс
Удалённый объект «выглядит» локальным, но удалённый.
2. Virtual Proxy — отложенное создание (lazy loading)
Используется для «тяжелых» объектов:
-
большие изображения;
-
сложные ресурсы;
-
подключение к БД;
-
загрузка файлов;
-
дорогие вычисления.
Proxy загружает объект только когда это реально нужно.
ORM (Hibernate, EclipseLink) активно используют Virtual Proxy.
3. Protection Proxy — контроль доступа
Прокси проверяет:
-
пользователя;
-
роль;
-
права;
-
токен;
-
ограничения.
И только затем вызывает реальный объект.
Так работают:
-
secure API wrappers
-
IAM библиотеки
-
ACL системы
-
сервисы авторизации
4. Caching Proxy — кеширование
Прокси кеширует ответы:
-
если данные уже есть — вернуть кеш;
-
если нет — вызвать реальный объект и сохранить данные.
Это активно применяется в:
-
API Gateway,
-
GraphQL gateways (dataloaders),
-
Redis-кешировании,
-
CDN,
-
прокси-агентах Kubernetes.
5. Logging / Auditing Proxy
Прокси автоматически логирует:
-
вызовы;
-
параметры;
-
ошибки;
-
время выполнения;
-
корректность ответа.
Используется как прозрачная «обёртка» вокруг бизнес-сервисов.
6. Smart Proxy — добавляет логику управления ресурсами
Например:
-
подсчёт ссылок;
-
контроль транзакции;
-
блокировки;
-
синхронизацию доступа.
Proxy в современной архитектуре
Паттерн является фундаментом:
-
REST/gRPC/Thrift SDK;
-
HTTP-клиентов;
-
DI-контейнеров;
-
Service Mesh (Istio, Linkerd);
-
Kubernetes Sidecar containers;
-
API Gateway маршрутизации;
-
CDN;
-
Reverse proxy (NGINX/Envoy/Traefik);
-
ORM lazy loading;
-
АОП (Aspect Oriented Programming).
Фактически, большинство сетевых взаимодействий базируется на Proxy.
Преимущества Proxy
-
скрывает сложность системы;
-
поддерживает сетевую транспарентность;
-
безопасен (контроль доступа);
-
экономит ресурсы (ленивая загрузка, кеш);
-
прозрачен для клиента;
-
позволяет подменять реализации;
-
служит ключевым элементом модульной архитектуры.
Недостатки
-
увеличение количества слоёв;
-
усложнение дебага;
-
скрытые сетевые вызовы (иногда критичные);
-
ошибки латентности могут быть незаметны в коде;
-
требует хорошего мониторинга.
Для архитектора важно не допустить, чтобы Proxy стал «магией», скрывающей реальные задержки.
Proxy в российских учебниках
Как правило — в главах:-
распределённые системы;
-
базовая архитектура клиент-сервер;
-
сетевые протоколы;
-
интеграция ИС;
-
удалённые вызовы;
-
безопасность.
Почему архитектор обязан знать Proxy
Потому что почти каждая архитектурная задача имеет решение через Proxy:
-
безопасность → protection proxy
-
удалённый вызов → remote proxy
-
RPC → remote proxy
-
API SDK → proxy
-
service mesh → proxy
-
lazy loading → virtual proxy
-
CDN → caching proxy
-
аудит → audit proxy
-
перехват ошибок → smart proxy
-
middleware → proxy в основе
Это один из самых фундаментальных инструментов архитектора.