Поддержка HTTP/1.1 и HTTP/2 с помощью JAX-RS-клиента

Я хочу реализовать клиент JAX-RS, который поддерживает HTTP/1.1 и HTTP/2 для клиента JAX-RS.

Идея состоит в том, чтобы использовать HTTP/2, если сервер поддерживает ALPN с помощью HTTP/2 и использует HTTP/1.1, если сервер не предоставляет никакой информации.

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

В настоящее время я использую транспортный соединитель Jetty HTTP/1.1 для Джерси и для транспортной консоли HTTP/2.

Ответ 2

Решением может быть использование nginx (или apache2) в качестве обратного прокси-сервера для выполнения этого требования.

Nginx может прокси-сервер вашего сервера Jetty (используя только протокол http/1.1 или http/2) и сервер http/2 с помощью alpn (с последней версией).

Ответ 3

На самом деле ALPN поддерживается только jdk, начиная с JDK9 http://unrestful.io/2015/10/09/alpn-java.html.

Это не обрабатывается клиентским API JAX-RS

Ответ 4

Если этот вопрос все еще открыт для участия, то существует один способ реализации клиента с версией <JDK 9.

Как вы знаете, HTTP/2 требует поддержки ALPN при использовании TLSv1.2 (h2).

Пакет netty имеет некоторую поддержку HTTP/2 при условии, что на платформе установлен openssl (версия 1.0.2 или более поздняя).

Пакет Netty будет использовать OpenSSL для поддержки ALPN, вызывая собственные библиотеки.

Мы реализовали клиент с JDK8 и смогли сгенерировать запрос http2 для работы, когда сервер принимает только запрос http2. Мы использовали ниже упомянутую зависимость

    <dependency>
        <groupId>io.netty</groupId>
        <artifactId>netty-all</artifactId>
        <!--<version>5.0.0.Alpha2</version> -->
        <version>4.1.29.Final</version>
    </dependency>

Ответ 5

В абстрактном смысле это звучит так, как будто вы хотите получить Java-сервлет, который может согласовывать и завершать одну конечную точку REST, поэтому избегайте одного интерфейса для HTTP/1 и другого для HTTP/2 и избегайте внешнего завершения, например, через прокси-сервер, который может обрабатывать несколько протоколов. Итак, все в одном сервлете.

Это уже было реализовано в Undertow Стюартом (и ребятами из JBoss) по крайней мере в конце 2017 года, когда Стив Ху добавил тестовые наборы и PR. 1

Вам нужно передать опцию ENABLE_HTTP2 в OptionsMap. Для http URI это означает, что клиент попытается выполнить обновление по первому запросу, для https URI ALPN будет использоваться для попытки согласования HTTP/2. Именно так ведут себя браузеры и будут работать, даже если цель не поддерживает HTTP/2. 2

Похоже, Симона вносит изменения, чтобы реализовать это в Jetty. 3 Итак, если вы хотите сделать это сейчас, переключитесь с Jetty на Undertow или измените вопрос на "Support... in Jetty".