Недавно мне пришла в голову идея написать прокси-сервер с Netty, высокопроизводительным асинхронным сервером, написанным на Java.

Почему Нетти

В 2016 году я впервые встречаюсь с Нетти. В то время мне нужно было реализовать прокси-сервер с широкими возможностями настройки для моей работы.

Я обнаружил, что для реализации потребуется много средств, если я буду использовать сокет низкого уровня или NIO. Поэтому я решил поискать лучшую библиотеку или подход в Интернете и на Github, и, наконец, я обнаружил, что Netty, самая популярная библиотека Java для асинхронной сетевой библиотеки, действительно хороша для моего проекта. Здесь я просто опишу, как работает Netty и почему это было круто.

Netty пометил каждое соединение как канал, и каждый канал имеет исходящий и входящий потоки через конвейер. В конвейере будут обработчики, которые будут обрабатывать сообщение и переходить к следующему обработчику, как в модели OSI. Каждый обработчик должен просто заботиться о том, что ему нужно делать и что ему нужно делать.

Например, HttpDecoder будет читать двоичный файл из входящего и декодировать в HttpRequest, HttpEncoder получит HttpResponse из исходящего и закодирует в двоичный файл. Итак, если мы хотим иметь HTTP-сервер, мы можем определить HttpCodec, содержащий HttpDecoder и HttpEncoder, и ServerHandler, который читает HttpRequest из входящих и записывает HttpResponse в исходящих.

Что такое "Нетти посередине"

После моего первого пробного использования Netty я был действительно поражен этим, дизайном api и производительностью, и мне это понравилось. Поэтому я решил реализовать прокси-сервер на основе Netty, как мы с другом реализовали на Python. Я хочу сравнить, насколько он отличается, например, архитектура кода, производительность и т. Д.

И после нескольких дней работы примерно готовая версия Netty посередине. Он содержит всего около 2000 строк кода и обеспечивает прокси-сервер HTTP и прокси-сервер SOCKS для интерфейса прокси, а также HTTP / 1, HTTP / 2, TLS для протокола поддержки. И код был простым и понятным, и скорость, я думаю, быстрая.

Заключение

Если вас интересует NITM (Netty посередине), вы можете получить его по адресу https://github.com/chhsiao90/nitmproxy. Клонируйте его и запустите или оставьте отзыв.

Кстати, еще один прокси-сервер, написанный на Python моим другом и я, о котором я упоминал в этой статье, - это microProxy, вы можете получить его на https://github.com/mike820324/microProxy.

И спасибо за чтение!