Table des matières
1. Introduction à HTTP/2
Push de données HTTP/2
Prend actuellement en charge le client HTTP Java HTTP/2
2. Client HTTP/2 de Java 9
Envoi de requêtes en mode blocage
Envoi de requêtes en mode non bloquant (Java 9)
3. Prise en charge des cadres de promesse push HTTP2
Maison Java javaDidacticiel Prise en charge du protocole HTTP2 de Java 9 et analyse de l'API HTTP non bloquante

Prise en charge du protocole HTTP2 de Java 9 et analyse de l'API HTTP non bloquante

Apr 22, 2023 pm 09:52 PM
java http api

1. Introduction à HTTP/2

HTTP/2 vise à atténuer les difficultés causées par la maintenance de l'infrastructure complexe de HTTP/1.1 et offre de bonnes performances. Bien que HTTP/2 soit toujours rétrocompatible avec HTTP/1.1, il ne s'agit plus d'un protocole textuel.

Le multiplexage HTTP/2 permet à une seule connexion de gérer plusieurs flux bidirectionnels, permettant aux clients de télécharger plusieurs ressources simultanément sur une seule connexion.

Le protocole HTTP 1.x est basé sur du texte, les messages sont donc très longs. Parfois, le même ensemble d’en-têtes HTTP est échangé encore et encore. HTTP/2 conserve les en-têtes HTTP dans toutes les requêtes, éliminant ainsi les échanges répétés de données et réduisant considérablement la bande passante requise pour l'interaction des données.

Push de données HTTP/2

Vous pensez peut-être que le push de données côté serveur HTTP/2 est une sorte de continuation ou de mise à niveau vers WebSockets, mais ce n'est pas le cas. Alors que les WebSockets sont une méthode de communication en duplex intégral entre un client et un serveur afin que le serveur envoie des données au client après l'établissement d'une connexion TCP, HTTP/2 offre une solution différente.

Le push HTTP/2 consiste à envoyer activement des ressources au client sans lancer de demandes de ressources du point de vue du client. Cela signifie que le serveur peut savoir, à partir d'une requête, de quelles autres ressources le site Web aura besoin et peut les envoyer toutes ensemble (à l'avance) bien avant que le client ne lance à nouveau une demande pour celles-ci.

Prend actuellement en charge le client HTTP Java HTTP/2

  • Jetty

  • Netty

  • OkHttp

  • Vert.x

  • Firefly

Mais dans cet article, nous ne présenterons pas ces logiciels clients Java, mais introduisons le support HTTP/2 fourni par Java9.

2. Client HTTP/2 de Java 9

Utilisez d'abord la syntaxe Java 9 pour importer le module. jdk.incubator.httpclient

module com.springui.echo.client {
    requires jdk.incubator.httpclient;
}
Copier après la connexion

La nouvelle API HTTP Cient de Java 9 suit le modèle du constructeur. HttpClient est le point d'entrée utilisé pour opérer les requêtes HTTP. Il est d'abord construit puis utilisé.

HttpClient client = HttpClient
    .newBuilder()
    .version(Version.HTTP_2)  //支持HTTP2
    .build();
Copier après la connexion

Envoi de requêtes en mode blocage

Une fois que nous avons une instance HttpClient, nous pouvons l'utiliser pour envoyer des instances HttpRequest. Les instances HttpRequest peuvent également être créées à l'aide du constructeur.

HttpResponse<String> response = client.send(
    HttpRequest
        .newBuilder(TEST_URI)  //请求地址
        .POST(BodyProcessor.fromString("Hello world")) //POST报文数据
        .build(),
    BodyHandler.asString()  //请求响应数据处理,接收字符串
);
Copier après la connexion

Une fois la requête envoyée, le thread se bloquera jusqu'à ce que les données de réponse soient obtenues. C'est la même chose que l'API HTTP dans JAVA 8 et avant. Cependant, Java 9 fournit une méthode d'envoi et de traitement asynchrone et non bloquant des requêtes, plus adaptée aux requêtes et au traitement HTTP hautement simultanés.

Envoi de requêtes en mode non bloquant (Java 9)

Dans l'exemple ci-dessous, 10 entiers aléatoires sont envoyés de manière asynchrone.

List<CompletableFuture<String>> responseFutures = 
        IntStream.of(1,2,3,4,5,6,7,8,9,10)  //10个整数形成IntStream,Java 8的语法
        .mapToObj(String::valueOf) //10个整数转换成字符串,Java 8的语法
        .map(message -> client.sendAsync( //将10个整数字符串作为内容,发送10个异步请求
                HttpRequest.newBuilder(TEST_URI)
                        .POST(HttpRequest.BodyProcessor.fromString(message))
                        .build(),
                HttpResponse.BodyHandler.asString()
             ).thenApply(HttpResponse::body)  //以CompletableFuture<HttpResponse.body()>作为流处理的返回值
        )
        .collect(Collectors.toList());  //将Stream转成List
Copier après la connexion

L'exemple ci-dessus utilise largement l'API de streaming Stream de Java 8. Si vous ne la connaissez pas, vous pouvez lire certains articles que j'ai déjà écrits.

La valeur de retour de la méthode sendAsync est CompletableFuture>, qui est ensuite traitée à l'aide de thenApply(HttpResponse::body), et la valeur de retour finale est CompleteableFuture.

CompletableFuture est la connaissance de la programmation asynchrone Java, qui imprime les résultats du traitement asynchrone simultané.

responseFutures.stream().forEach(future -> {
    LOGGER.info("Async response: " + future.getNow(null));
});
Copier après la connexion

Vous remarquerez que le journal d'impression final peut ne pas être traité dans l'ordre 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, car toutes les requêtes sont envoyées de manière asynchrone, le résultat renvoyé est le CompleteableFuture utilisé pour le traitement asynchrone.

3. Prise en charge des cadres de promesse push HTTP2

Tous les exemples ci-dessus peuvent être complétés sous le protocole HTTP/1.1, mais une nouvelle API asynchrone non bloquante est ajoutée et les fonctionnalités HTTP/2 ne sont pas impliquées. Ne vous inquiétez pas, l'API client Java 9 est la plus étroitement intégrée à HTTP/2 : vous pouvez utiliser HTTP2 pour envoyer une requête et obtenir plusieurs résultats de données asynchrones. (Certaines données sont poussées à l'avance, bien sûr, cela nécessite que le serveur prenne également en charge HTTP/2 pour la coopération)

Map<HttpRequest,CompletableFuture<HttpResponse<String>>> responses =
        client.sendAsync(    //注意这里只发送一次请求
          HttpRequest.newBuilder(TEST_URI)
                  .POST(HttpRequest.BodyProcessor.fromString(TEST_MESSAGE))
                  .build(),
          HttpResponse.MultiProcessor.asMap(    //多个资源的响应结果
                  request -> Optional.of(HttpResponse.BodyHandler.asString())
          )
).join();
responses.forEach((request, responseFuture) -> {
  LOGGER.info("Async response: " + responseFuture.getNow(null));
});
Copier après la connexion

Du point de vue de Java 9, la nouvelle API client HTTP/2 a l'air bien. Cependant, l'auteur estime que l'utilisation actuelle des technologies connexes n'est pas encore très mature. Je pense que tout le monde peut l'essayer pour le moment.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Racine carrée en Java Racine carrée en Java Aug 30, 2024 pm 04:26 PM

Guide de la racine carrée en Java. Nous discutons ici du fonctionnement de Square Root en Java avec un exemple et son implémentation de code respectivement.

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Numéro Armstrong en Java Numéro Armstrong en Java Aug 30, 2024 pm 04:26 PM

Guide du numéro Armstrong en Java. Nous discutons ici d'une introduction au numéro d'Armstrong en Java ainsi que d'une partie du code.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

See all articles