Все, что вам нужно знать о прокси в Java, здесь.

Java задняя часть сервер балансировки нагрузки

Каждый Java-разработчик более или менее слышал термин «прокси». Возможно, вы слышали о шаблонах прокси, динамических прокси, обратных прокси и т. д. Итак, что такое прокси, и в чем разница между таким количеством прокси? В этой статье мы кратко проанализируем его.

Технология прокси — это не только технология, специфичная для языка Java, она уже появилась на заре Интернета.

На уровне компьютерной сети обычно используются следующие прокси-технологии: прямой прокси-сервер, обратный прокси-сервер и прозрачный прокси-сервер. Наиболее часто используются прямой прокси и обратный прокси.

Прямой прокси и обратный прокси

прямой прокси

Форвард-прокси (forward proxy): это сервер (прокси-сервер), расположенный между клиентом и целевым сервером.Для того, чтобы получить контент с целевого сервера, клиент отправляет запрос на прокси-сервер и указывает цель, а затем прокси-сервер отправляет целевой сервер на целевой сервер, пересылает запрос и возвращает полученный контент клиенту. Клиенты должны выполнить некоторую специальную настройку, чтобы использовать прямой прокси. В целом, если не указано иное, технология прокси по умолчанию относится к технологии прямого прокси.

Этот вид прокси на самом деле более распространен в жизни, например, научная интернет-технология, использующая прокси-технологию.

Сяо Мин хочет посетить иностранный веб-сайт, но к веб-сайту нельзя получить прямой доступ в Китае, но Сяо Мин может получить доступ к прокси-серверу, который может получить доступ к иностранному веб-сайту. Таким образом, для доступа Сяомина к иностранному веб-сайту необходимо перенаправить запрос через прокси-сервер, и прокси-сервер также вернет ответ на запрос Сяомину. Этот процесс серфинга в Интернете использует прямой прокси.

zhengxiang

При прохождении через прямой прокси-сервер целевой сервер не знает, кто настоящий клиент, только то, что прокси-сервер отправляет запрос.

Назначение прямого прокси

Преодолейте ограничения доступаЧерез прокси-сервер вы можете обойти собственные ограничения доступа по IP-адресу, получить доступ к иностранным веб-сайтам, образовательным сетям и т. д.

В последние годы, с непрерывным развитием технологии VPN, общий прорыв в ограничениях доступа достигается через VPN.Если вы присмотритесь к VPN, вы обнаружите, что VPN на самом деле является реализацией прямого прокси, а также прокси-сервером. .

Улучшить скорость доступаОбычно прокси-сервер устанавливает большой буфер жесткого диска и сохраняет ответы на некоторые запросы в буфере.Когда другие пользователи снова обращаются к той же информации, информация напрямую извлекается из буфера и передается пользователю для повышения производительности. скорость доступа.

Скрыть реальный IP клиентаИнтернет-пользователи также могут использовать этот метод, чтобы скрыть свой IP от атак.

обратный прокси

Обратный прокси (обратный прокси): относится к прокси-серверу, который принимает запросы на подключение в Интернете, затем перенаправляет запрос на сервер во внутренней сети и возвращает результаты, полученные от сервера, клиенту, запрашивающему подключение в Интернете. На этом этапе прокси-сервер действует как обратный прокси-сервер для внешнего мира.

Для распространенных сценариев это сервер балансировки нагрузки, который мы используем в веб-разработке.Клиент отправляет запрос на сервер балансировки нагрузки, а сервер балансировки нагрузки перенаправляет запрос на реальный сервер для выполнения, а затем возвращает результат выполнения клиенту. .

fan

Как мы говорили ранее, при доступе к целевому серверу через прямой прокси-сервер целевой сервер не знает, кто настоящий клиент, и даже не знает, что тот, кто обращается к себе, является прокси. При доступе к целевому серверу через обратный прокси-сервер клиент не знает, кто является настоящим целевым сервером, и даже не знает, что он обращается к прокси. В этом также заключается разница между прямым прокси и обратным прокси.

Назначение обратного прокси

Скрыть настоящий 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, которые мы видим каждый день, а также перехват журналов, перехват транзакций и перехват разрешений, почти все динамически проксируются.

Суммировать

В этой статье рассказывается о переадресации прокси-сервера и обратном прокси-сервере на сетевом уровне, статическом прокси-сервере и динамическом прокси-сервере на уровне режима разработки. Я надеюсь, что, прочитав эту статью, у вас появится определенное представление о технологии прокси. Конечно, не следует путать эти понятия.

wechat