Что такое RSocket?

RSocket - это двоичный, асинхронный, однозначный, симметричный протокол без сохранения состояния, который полагается на протокол между потоками TCP, WebSocket, Aeron и HTTP / 2, который будет использоваться в качестве транспортного протокола за кулисами.

Он был разработан в соответствии с семантикой Reactive Streams, поэтому легко интегрируется в приложения, которые сильно зависят от библиотек Reactive, таких как Project Reactor или ReactiveX.

Зачем мне использовать RSocket?

Голый HTTP просто не режет его, особенно в современном мире, где архитектура программного обеспечения в значительной степени ориентирована на микросервисы. .

Микросервисам необходимо потенциально взаимодействовать с множеством других микросервисов в запутанном и запутанном танце, который не всегда соответствует основным принципам, на которых построен HTTP: отправка текста по сети в запросе ответе мода.

Часто требуется, чтобы микросервисы отправляли события в режиме запустил и забыл (в этом помогают брокеры и расширенные протоколы обмена сообщениями, но за счет значительного усложнения инфраструктуры и приложений, использующих на них), или запросите данные и удерживайте соединение, ожидая потока данных, поступающих в качестве ответа, с течением времени.

HTTP не является эффективным решением ни в одном из этих сценариев, в то время как транспортный протокол, созданный специально для компьютеров, которые асинхронно разговаривают с другими компьютерами и с учетом высокой производительности, например WebSocket, кажется очень хорошим подходит.

RSocket предоставляет все преимущества выбора лучшего транспортного протокола для задачи, а также создает такие вещи, как семантика реактивных потоков, управление противодавлением, подсказки по балансировке нагрузки и возможность возобновления работы над этим! Отличный материал!

Модели взаимодействия

RSocket основан на 4 основных моделях взаимодействия, которые обеспечивают симметричное взаимодействие через одно соединение:

  • запрос / ответ: аналогично HTTP, но клиент ожидает ответа (поток из 1 элемента) неблокирующим способом;
  • запрос / поток: клиент получает элементы, которые со временем составляют поток из множества;
  • запустил и забыл: клиент отправляет некоторые данные и не ожидает ответа;
  • канал: наиболее настраиваемая модель взаимодействия, при которой клиент и сервер могут обмениваться данными любым способом, который кажется подходящим для конкретной задачи (например, сервер отправляет 2 кадра для каждого кадра * отправлено клиентом).

* фрейм - это отдельное сообщение, содержащее запрос или ответ

Устойчивость и высокая доступность

RSocket удовлетворяет требованиям отказоустойчивости и высокой доступности, предоставляя такие функции, как соединение / запрос возобновление и подсказки по балансировке нагрузки посредством аренды.

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

При использовании RSocket клиенты полностью отвечают за возобновление работы, и по умолчанию это отключено.

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

Его следует использовать везде, где это имеет смысл.

Аренда можно включить, чтобы серверы выдавали аренду клиентам, следя за тем, чтобы указанные клиенты не превышали заданную частоту запросов (клиент не должен отправлять больше, чем Количество запросов в любом конкретном временном интервале Срок действия, иначе его запросы будут отклоняться до тех пор, пока не будет выдан новый действующий договор аренды).

Серверы полностью отвечают за аренду, и, поскольку это происходит в случае возобновления, она также не включена по умолчанию.

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

Я хочу увидеть это в действии!

Не волнуйтесь! Я подготовил реактивное демонстрационное приложение на основе Spring Boot 2.2, которое показывает запрос / поток режим взаимодействия RSocket в действии, через транспорт WebSocket, с J ava RSocket Server, клиентом Java RSocket и клиентом Javascript RSocket.

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

Либо покопайтесь в исходном коде самостоятельно, либо следуйте инструкциям по быстрому запуску, чтобы увидеть RSocket в действии.

Быстрый старт

  1. Клонируйте репозиторий: https://github.com/dsibilio/rsocket-demo.git и перейдите в клонированный каталог.
  2. Разверните Java RSocket Server и активируйте как клиент Java RSocket, так и клиент Javascript RSocket, запустив: mvn spring-boot:run

Что я могу сделать сейчас?

Бэкэнд Java предоставляет следующие API *:

  • HTTP http: // localhost: 8080 / socket / {author}: HTTP-запрос запускает клиент Java RSocket для получения данных с сервера Java RSocket
  • HTTP http: // localhost: 8080 / tweets / {author}: тот же API, что и выше, но без взаимодействия с сокетами, чистый SSE через HTTP (для сравнения)
  • WS ws://localhost:8080/tweetsocket - route: tweets.by.author: W транспорт ebSocket, используемый клиентом Javascript RSocket для извлечения данных с сервера Java RSocket

Клиент Javascript в действии можно увидеть, перейдя по адресу http: // localhost: 8080 / index.html; он подключается к серверу Java RSocket напрямую, чтобы получать от него данные в виде запроса / потока.

* возможные значения {author}: linustorvalds, martinfowler, robertmartin

Как: создать приложение с помощью RSocket

Этот раздел поможет вам разработать приложение, подобное демонстрационному, используя Java для размещения сервера RSocket , а также Java и Javascript для получения данных с указанного сервера через Клиенты RSocket.

ПРИМЕЧАНИЕ. и Spring Boot 2.2, и RSocket являются продуктами в стадии разработки на момент написания этой статьи, поэтому следующие шаги могут немного измениться в будущем!

Клиент Java RSocket и сервер Java RSocket

Чтобы разработать работающую реализацию сервера и клиента Java RSocket, выполните следующие действия.

  • Создайте основу для вашего проекта, зайдя на https://start.spring.io/ и выбрав Spring Boot 2.2.0 M6. в качестве версии Spring Boot и добавив Spring Reactive Web и RSocket в качестве выбранных зависимостей.
  • Замените файл src / main / resources / application.properties на application.yml, как показано ниже:
  • Создайте класс RSocketConfiguration внутри пакета com.example.demo. config:
  • Создайте простой твит POJO, подобный приведенному ниже, и поместите его в пакет com.example.demo. domain:
  • Создайте класс TweetRequest, который будет использоваться в качестве фильтра для твитов, и переместите его в пакет com.example.demo. domain:
  • Создайте класс TweetService, который будет возвращать бесконечный поток твитов, и поместите его в пакет com.example.demo. service:
  • Создайте класс TweetSocketController, который устанавливает маршрут tweets.by.author для нашего сокета для получения TweetRequests; поместите его в пакет com.example.demo. api.rsocket:
  • Наконец, создайте класс TweetController, который служит контроллером Rest для предоставления конечной точки SSE, которая запускает клиент Java RSocket для получения данных с сервера Java RSocket; поместите его в пакет com.example.demo. api.rest:

Вы можете проверить конечный результат, запустив mvn spring-boot:run и выбрав http: // localhost: 8080 / tweets / linustorvalds.

Вы должны увидеть что-то вроде этого:

Клиент Javascript RSocket

Пришло время собрать наш клиент Javascript RSocket, чтобы браузер мог получать данные непосредственно с сервера Java RSocket без отправки каких-либо HTTP-запросов!

НЕОБХОДИМЫЕ УСЛОВИЯ: должны быть установлены npm и browserify!

  • Создайте новую папку с именем public в src / main / resources и поместите в нее следующий файл index.html - это довольно просто и в пояснениях не нуждаются:
  • Внутри той же папки добавьте файл index.js, который представляет нашу реализацию Javascript RSocket Client:

Каждый раз при загрузке страницы или обновлении значения списка выбора author-filter вызывается функция main(), которая, в свою очередь, отключает любой ранее подключенный клиент RSocket и открывает новое соединение с ws://localhost:8080/tweetsocket.

После успешного установления соединения используется режим взаимодействия запрос / поток для получения потока твитов с течением времени, с указанием маршрута WebSocket в качестве метаданных сообщения с типом MIME message/x.rsocket.routing.v0 и отображением каждого полученного твита на страница.

  • Добавьте следующий файл package.json в общедоступную папку:
  • Перейдите в каталог src / main / resources / public и запустите npm install, чтобы загрузить все необходимые зависимости.
  • Не меняя каталог, запустите browserify index.js > app.js

Теперь вы можете развернуть свое приложение, как раньше с mvn spring-boot:run, и перейти на http: // localhost: 8080 / index.html, чтобы увидеть плоды своего труда и поиграть, пока не получите скучающий!

Заключение

RSocket вполне может стать будущим транспортных протоколов, поскольку он быстро переходит в зрелый продукт, а активное сообщество регулярно вносит свой вклад в его рост.

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

… Или покопайтесь еще в моем исходном коде rsocket-demo!