Каждый Java-разработчик более или менее слышал термин «прокси». Возможно, вы слышали о шаблонах прокси, динамических прокси, обратных прокси и т. д. Итак, что такое прокси, и в чем разница между таким количеством прокси? В этой статье мы кратко проанализируем его.
Технология прокси — это не только технология, специфичная для языка Java, она уже появилась на заре Интернета.
На уровне компьютерной сети обычно используются следующие прокси-технологии: прямой прокси-сервер, обратный прокси-сервер и прозрачный прокси-сервер. Наиболее часто используются прямой прокси и обратный прокси.
Прямой прокси и обратный прокси
прямой прокси
Форвард-прокси (forward proxy): это сервер (прокси-сервер), расположенный между клиентом и целевым сервером.Для того, чтобы получить контент с целевого сервера, клиент отправляет запрос на прокси-сервер и указывает цель, а затем прокси-сервер отправляет целевой сервер на целевой сервер, пересылает запрос и возвращает полученный контент клиенту. Клиенты должны выполнить некоторую специальную настройку, чтобы использовать прямой прокси. В целом, если не указано иное, технология прокси по умолчанию относится к технологии прямого прокси.
Этот вид прокси на самом деле более распространен в жизни, например, научная интернет-технология, использующая прокси-технологию.
Сяо Мин хочет посетить иностранный веб-сайт, но к веб-сайту нельзя получить прямой доступ в Китае, но Сяо Мин может получить доступ к прокси-серверу, который может получить доступ к иностранному веб-сайту. Таким образом, для доступа Сяомина к иностранному веб-сайту необходимо перенаправить запрос через прокси-сервер, и прокси-сервер также вернет ответ на запрос Сяомину. Этот процесс серфинга в Интернете использует прямой прокси.
При прохождении через прямой прокси-сервер целевой сервер не знает, кто настоящий клиент, только то, что прокси-сервер отправляет запрос.
Назначение прямого прокси
Преодолейте ограничения доступаЧерез прокси-сервер вы можете обойти собственные ограничения доступа по IP-адресу, получить доступ к иностранным веб-сайтам, образовательным сетям и т. д.
В последние годы, с непрерывным развитием технологии VPN, общий прорыв в ограничениях доступа достигается через VPN.Если вы присмотритесь к VPN, вы обнаружите, что VPN на самом деле является реализацией прямого прокси, а также прокси-сервером. .
Улучшить скорость доступаОбычно прокси-сервер устанавливает большой буфер жесткого диска и сохраняет ответы на некоторые запросы в буфере.Когда другие пользователи снова обращаются к той же информации, информация напрямую извлекается из буфера и передается пользователю для повышения производительности. скорость доступа.
Скрыть реальный IP клиентаИнтернет-пользователи также могут использовать этот метод, чтобы скрыть свой IP от атак.
обратный прокси
Обратный прокси (обратный прокси): относится к прокси-серверу, который принимает запросы на подключение в Интернете, затем перенаправляет запрос на сервер во внутренней сети и возвращает результаты, полученные от сервера, клиенту, запрашивающему подключение в Интернете. На этом этапе прокси-сервер действует как обратный прокси-сервер для внешнего мира.
Для распространенных сценариев это сервер балансировки нагрузки, который мы используем в веб-разработке.Клиент отправляет запрос на сервер балансировки нагрузки, а сервер балансировки нагрузки перенаправляет запрос на реальный сервер для выполнения, а затем возвращает результат выполнения клиенту. .
Как мы говорили ранее, при доступе к целевому серверу через прямой прокси-сервер целевой сервер не знает, кто настоящий клиент, и даже не знает, что тот, кто обращается к себе, является прокси. При доступе к целевому серверу через обратный прокси-сервер клиент не знает, кто является настоящим целевым сервером, и даже не знает, что он обращается к прокси. В этом также заключается разница между прямым прокси и обратным прокси.
Назначение обратного прокси
Скрыть настоящий IP сервераС обратным прокси IP-адрес сервера может быть скрыт от клиентов.
балансировки нагрузкиОбратный прокси-сервер может выполнять балансировку нагрузки и распределять клиентские запросы на разные реальные серверы в соответствии с нагрузкой всех реальных серверов.
Улучшить скорость доступаОбратный прокси-сервер может предоставлять услуги кэширования статического контента и динамического контента с большим количеством запросов на доступ за короткий промежуток времени, повышая скорость доступа.
обеспечить безопасностьОбратный прокси-сервер может действовать как брандмауэр прикладного уровня, обеспечивая веб-сайтам защиту от веб-атак (таких как DoS/DDoS), упрощая устранение вредоносных программ и т. д. Он также может обеспечивать унифицированное шифрование и ускорение SSL для внутренних серверов (таких как прокси-сервер терминала SSL) и обеспечивать аутентификацию доступа HTTP.
Статические и динамические прокси
Вышеупомянутый механизм прокси уровня компьютерной сети, который обычно относится к прокси запросов на обслуживание. В ежедневной разработке Java используется другой вид прокси, или режим прокси.
В некоторых случаях клиент не хочет или не может напрямую ссылаться на объект, и в этом случае косвенная ссылка может быть достигнута через третью сторону, называемую «прокси». Прокси-объект может действовать как посредник между клиентом и целевым объектом и может удалять содержимое и службы, которые клиент не может видеть, или добавлять дополнительные службы, которые нужны клиенту через прокси-объект.
Путем введения нового объекта для реализации операции реального объекта или использования нового объекта в качестве замены реального объекта этот механизм реализации представляет собой режим прокси. режим прокси режима мотивации.
Шаблон прокси: укажите прокси для объекта, а прокси-объект управляет ссылкой на исходный объект.
В зависимости от периода создания прокси-класса прокси-класс можно разделить на два типа, а именно динамический прокси-класс и статический прокси-класс. Это основной класс, используемый в статическом и динамическом прокси, о которых мы часто упоминаем.
Таким образом, основное различие между статическим прокси и динамическим прокси заключается во времени создания класса прокси.
Статический прокси-класс: созданный программистом или автоматически генерируется определенным исходным кодом инструмента, а затем скомпилирован. Перед прогонами программы файл .Class файл прокси-класса уже существует.
Динамический прокси-класс: динамически создается с использованием механизма отражения во время работы программы.
Статический прокси обычно проксирует только один класс, динамический прокси предназначен для проксирования нескольких классов реализации в одном интерфейсе. Статические прокси заранее знают, что проксировать, в то время как динамические прокси не знают, что проксировать, только во время выполнения.
Статический прокси в Java
Так называемый статический прокси означает, что прокси-класс пишется программистом и определяется во время компиляции. Взгляните на следующий пример:
public interface HelloSerivice {
public void say();
}
public class HelloSeriviceImpl implements HelloSerivice{
@Override
public void say() {
System.out.println("hello world");
}
}
Приведенный выше код относительно прост и определяет интерфейс и класс его реализации. это режим прокси目标对象
и目标对象的接口
. Следующий класс определяет прокси-объект.
public class HelloSeriviceProxy implements HelloSerivice{
private HelloSerivice target;
public HelloSeriviceProxy(HelloSerivice target) {
this.target = target;
}
@Override
public void say() {
System.out.println("记录日志");
target.say();
System.out.println("清理数据");
}
}
выше это代理类
, он также добился目标对象的接口
, и расширяетсяsay
метод. Вот тестовый класс:
public class Main {
@Test
public void testProxy(){
//目标对象
HelloSerivice target = new HelloSeriviceImpl();
//代理对象
HelloSeriviceProxy proxy = new HelloSeriviceProxy(target);
proxy.say();
}
}
// 记录日志
// hello world
// 清理数据
Это простая реализация шаблона статического прокси. Все роли в шаблоне прокси (прокси-объект, целевой объект, интерфейс целевого объекта) и т. д. определяются во время компиляции.
Назначение статического прокси
Контролируйте доступ к реальным объектамКонтролируйте доступ к реальным объектам через прокси-объекты.
Избегайте создания больших объектовИспользуя небольшой прокси-объект для представления реального большого объекта, можно уменьшить потребление системных ресурсов, оптимизировать систему и повысить скорость работы.
Расширьте функциональность реальных объектовЭто относительно просто, и дополнительные функции могут быть добавлены до и после вызова метода реального объекта через прокси.
Динамический прокси
Статический прокси был введен ранее.Хотя режим статического прокси очень полезен, в нем все же есть некоторые ограничения.Например, использование режима статического прокси требует от программистов написания большого количества кода, что является пустой тратой времени и энергия. Когда в классе есть много методов, которые нужно проксировать, или когда несколько объектов нужно проксировать одновременно, это, несомненно, увеличит сложность.
Есть ли способ, который не требует, чтобы программисты сами писали прокси-классы? Это динамический прокси.
Прокси-класс в динамическом прокси-сервере не требуется определять во время компиляции, но его можно динамически генерировать во время выполнения, чтобы реализовать прокси-функцию целевого объекта.
В Java существует два способа реализации динамического прокси:
1. Динамический прокси-сервер JDK. Класс Proxy и интерфейс InvocationHandler в пакете java.lang.reflect предоставляют возможность создавать классы динамических прокси.
2. Динамический прокси-сервер Cglib: Cglib (библиотека генерации кода) — это сторонняя библиотека генерации кода, которая динамически генерирует объект подкласса в памяти во время выполнения для расширения функции целевого объекта.
Методы написания этих двух динамических агентов не будут подробно обсуждаться в этой статье.Если читатели заинтересованы, я напишу статью, чтобы представить их отдельно позже. В этой статье в основном кратко рассказывается о различиях и использовании этих двух динамических агентов.
Разница между динамическим прокси JDK и динамическим прокси Cglib
Динамические прокси JDK имеют ограничение: объекты, использующие динамические прокси, должны реализовывать один или несколько интерфейсов. Если вы хотите проксировать класс, который не реализует интерфейс, вы можете использовать CGLIB для его реализации.
Cglib — это мощный высокопроизводительный пакет генерации кода, который расширяет классы Java и реализует интерфейсы Java во время выполнения. Он широко используется многими средами АОП, такими как Spring AOP и dynaop, для обеспечения перехвата их методов.
Нижний уровень пакета Cglib предназначен для преобразования байт-кодов и создания новых классов с помощью ASM, небольшой и быстрой среды обработки байт-кода. Прямое использование ASM не рекомендуется, так как оно требует от вас знакомства с внутренней структурой JVM, включая формат и набор инструкций файлов классов.
Самая большая разница между Cglib и динамическим прокси заключается в следующем:
Объекты, использующие динамические прокси, должны реализовывать один или несколько интерфейсов.
Объекты, которые используют прокси-сервер cglib, не должны реализовывать интерфейсы, поэтому класс прокси не имеет вторжения.
Назначение динамических прокси
Динамический прокси-сервер Java может не часто использоваться в повседневной разработке, но это не значит, что он не важен. Основная цель динамического прокси-сервера Java — его применение в различных средах. Поскольку использование динамических прокси позволяет легко генерировать прокси-классы во время выполнения, многие вещи можно выполнять с помощью прокси-классов, таких как АОП, такие как фильтры, перехватчики и т. д.
В структуре, которую мы обычно используем, функция динамического прокси используется в фильтре сервлета, aop, предоставляемом spring, и перехватчике struts2. Плагины подкачки mybatis, которые мы видим каждый день, а также перехват журналов, перехват транзакций и перехват разрешений, почти все динамически проксируются.
Суммировать
В этой статье рассказывается о переадресации прокси-сервера и обратном прокси-сервере на сетевом уровне, статическом прокси-сервере и динамическом прокси-сервере на уровне режима разработки. Я надеюсь, что, прочитав эту статью, у вас появится определенное представление о технологии прокси. Конечно, не следует путать эти понятия.