最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java9新特性對HTTP2協(xié)議支持與非阻塞HTTP?API

 更新時間:2022年03月15日 16:38:43   作者:字母哥哥  
這篇文章主要為大家介紹了Java9新特性對HTTP2協(xié)議的支持與非阻塞HTTP?API,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

在HTTP/1.1 發(fā)布了16 年之后,IETF在2015年終于通過了HTTP/2 協(xié)議。HTTP/2協(xié)議旨在降低延遲,滿足當(dāng)今時代對于信息響應(yīng)時間的要求。在這篇文章中,我會簡要的對HTTP/2協(xié)議進行介紹,然后我們將重點放在研究Java9中對HTTP/2支持及其HTTP客戶端API的變化。

我計劃在后續(xù)的一段時間內(nèi),寫一系列關(guān)于java 9的文章,雖然java 9 不像Java 8或者Java 11那樣的核心java版本,但是還是有很多的特性值得關(guān)注。期待您能關(guān)注我,我將把java 9 寫成一系列的文章,大概十篇左右,本文是第9篇。

java9在interface中定義私有方法詳解

java9版本特性資源自動關(guān)閉的語法增強

Java9版本新特性同一個Jar支持多JDK版本運行

java9新特性Reactive Stream響應(yīng)式編程 API

java9新特性Collection集合類的增強與優(yōu)化方法示例

Java9新特性Stream流API優(yōu)化與增強

Java9新特性Java.util.Optional優(yōu)化與增強解析

Java9新特性Module模塊化編程示例演繹

一、HTTP/2簡介

HTTP/2 旨在減輕 HTTP/1.1 維護復(fù)雜基礎(chǔ)結(jié)構(gòu)所造成的痛苦,性能良好。盡管 HTTP/2 仍然與 HTTP/1.1 向后兼容,但它不再是基于文本的協(xié)議。

HTTP/2 多路復(fù)用使單個連接可以處理多個雙向流,允許客戶端通過單個連接同時下載多個資源。

HTTP 1.x 協(xié)議是基于文本的,因此報文很冗長。有的時候,同一組 HTTP Headers被一遍又一遍地交換。HTTP/2 通過跨請求維護 HTTP Headers,消除重復(fù)交換的數(shù)據(jù),大大減少了數(shù)據(jù)交互所需的帶寬。

HTTP/2數(shù)據(jù)推送

您可能認(rèn)為HTTP/2的服務(wù)端數(shù)據(jù)推送是對 WebSockets 的某種延續(xù)或升級,但情況并非如此。雖然 WebSockets 是客戶端和服務(wù)器之間全雙工通信的一種方法,以便服務(wù)器在建立 TCP 連接后將數(shù)據(jù)發(fā)送到客戶端,但 HTTP/2 提供了一種不同的解決方案。

HTTP/2 推送是主動向客戶端發(fā)送資源,而無需從客戶端的角度發(fā)起資源請求。這意味著服務(wù)器端根據(jù)一個請求可能知道網(wǎng)站進一步需要的其他資源,并且早在客戶端再次發(fā)起請求它們之前,就可以一并(提前)發(fā)送所有資源。

目前支持 HTTP/2 的 Java HTTP 客戶端

  • Jetty
  • Netty
  • OkHttp
  • Vert.x
  • Firefly

但是在這篇文章中,我們不會介紹這些Java 客戶端軟件,而是介紹Java9提供的HTTP/2支持。

二、Java 9 的 HTTP/2 客戶端

首先使用Java 9的語法進行模塊的導(dǎo)入 。jdk.incubator.httpclient

module com.springui.echo.client {
    requires jdk.incubator.httpclient;
}

Java 9 新的 HTTP Cient API 遵循構(gòu)建器模式。HttpClient是用來操作HTTP請求的入口點,先構(gòu)建后使用。

HttpClient client = HttpClient
    .newBuilder()
    .version(Version.HTTP_2)  //支持HTTP2
    .build();

在阻塞模式下發(fā)送請求

一旦我們有了一個 HttpClient實例,就可以用它來發(fā)送HttpRequest,HttpRequest實例也可以使用構(gòu)造器創(chuàng)建。

HttpResponse<String> response = client.send(
    HttpRequest
        .newBuilder(TEST_URI)  //請求地址
        .POST(BodyProcessor.fromString("Hello world")) //POST報文數(shù)據(jù)
        .build(),
    BodyHandler.asString()  //請求響應(yīng)數(shù)據(jù)處理,接收字符串
);

請求發(fā)出去之后,線程會一直阻塞直到得到響應(yīng)數(shù)據(jù),這個和JAVA 8及之前的HTTP API是一樣的。但是Java 9提供了以異步非阻塞發(fā)送處理請求的方法,更適合高并發(fā)的HTTP請求與處理。

以非阻塞模式發(fā)送請求(Java 9)

在下面的示例中,10 個隨機整數(shù)以異步方式發(fā)送請求。

List<CompletableFuture<String>> responseFutures = 
        IntStream.of(1,2,3,4,5,6,7,8,9,10)  //10個整數(shù)形成IntStream,Java 8的語法
        .mapToObj(String::valueOf) //10個整數(shù)轉(zhuǎn)換成字符串,Java 8的語法
        .map(message -> client.sendAsync( //將10個整數(shù)字符串作為內(nèi)容,發(fā)送10個異步請求
                HttpRequest.newBuilder(TEST_URI)
                        .POST(HttpRequest.BodyProcessor.fromString(message))
                        .build(),
                HttpResponse.BodyHandler.asString()
             ).thenApply(HttpResponse::body)  //以CompletableFuture<HttpResponse.body()>作為流處理的返回值
        )
        .collect(Collectors.toList());  //將Stream轉(zhuǎn)成List

上面的例子大量的使用了Java 8的Stream流式處理的API,如果不熟悉的同學(xué),可以翻看我以前寫的一些文章。

sendAsync方法的返回值CompletableFuture<HttpResponse<String>>,使用thenApply(HttpResponse::body) 作了進一步的處理,最終返回值是CompletableFuture<String>。

CompletableFuture是Java異步編程的知識,將并發(fā)的異步處理結(jié)果打印出來。

responseFutures.stream().forEach(future -> {
    LOGGER.info("Async response: " + future.getNow(null));
});

你會注意到,最終的打印日志可能不是按照順序1、2、3、4、5、6、7、8、9、10進行處理的,因為所有的請求都是異步發(fā)送出去的,返回的結(jié)果是CompletableFuture用于異步處理的結(jié)果。

三、支持HTTP2的Push-Promise Frames

以上所有示例在 HTTP/1.1協(xié)議下都可以完成,只是新加了非阻塞的異步API,也沒涉及到 HTTP/2 特性啊。別急,Java 9 Client API與HTTP/2結(jié)合最緊密的就是:可以使用HTTP2發(fā)送一個請求,得到多個異步數(shù)據(jù)結(jié)果。(某些數(shù)據(jù)提前推送,當(dāng)然這需要服務(wù)端也支持HTTP/2進行配合)

Map<HttpRequest,CompletableFuture<HttpResponse<String>>> responses =
        client.sendAsync(    //注意這里只發(fā)送一次請求
          HttpRequest.newBuilder(TEST_URI)
                  .POST(HttpRequest.BodyProcessor.fromString(TEST_MESSAGE))
                  .build(),
          HttpResponse.MultiProcessor.asMap(    //多個資源的響應(yīng)結(jié)果
                  request -> Optional.of(HttpResponse.BodyHandler.asString())
          )
).join();
responses.forEach((request, responseFuture) -> {
  LOGGER.info("Async response: " + responseFuture.getNow(null));
});

從Java 9的角度來看,新的HTTP/2客戶端API看起來不錯。但筆者覺得目前相關(guān)技術(shù)的使用還不是很成熟,我覺得大家暫時嘗嘗鮮就可以。

以上就是Java9新特性對HTTP2協(xié)議的支持與非阻塞HTTP API的詳細(xì)內(nèi)容,更多關(guān)于支持HTTP2協(xié)議及非阻塞HTTP API的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Redisson分布式鎖的原理和代碼實例

    Redisson分布式鎖的原理和代碼實例

    這篇文章主要介紹了Redisson分布式鎖的原理和代碼實例,在分布式系統(tǒng)中,鎖機制是非常重要的,Redisson是一個基于Redis的Java應(yīng)用程序,常常被應(yīng)用作為分布式鎖的解決方案,需要的朋友可以參考下
    2024-01-01
  • java調(diào)用process線程阻塞問題的解決

    java調(diào)用process線程阻塞問題的解決

    這篇文章主要介紹了java調(diào)用process線程阻塞問題的解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java使用Geodesy進行地理計算的技術(shù)指南

    Java使用Geodesy進行地理計算的技術(shù)指南

    在地理信息系統(tǒng) (GIS) 和導(dǎo)航應(yīng)用中,精確的地理計算是基礎(chǔ),Geodesy 是一個流行的 Java 庫,用于處理地理位置、距離、方向等相關(guān)計算,本博客將介紹 Geodesy 的核心功能,并提供詳細(xì)的實踐樣例,幫助開發(fā)者快速上手,需要的朋友可以參考下
    2025-02-02
  • java僅用30行代碼就實現(xiàn)了視頻轉(zhuǎn)音頻的批量轉(zhuǎn)換

    java僅用30行代碼就實現(xiàn)了視頻轉(zhuǎn)音頻的批量轉(zhuǎn)換

    這篇文章主要介紹了java僅用30行代碼就實現(xiàn)了視頻轉(zhuǎn)音頻的批量轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Java 數(shù)組交集的實現(xiàn)代碼

    Java 數(shù)組交集的實現(xiàn)代碼

    這篇文章主要介紹了Java 數(shù)組交集的實現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 詳解設(shè)計模式中的proxy代理模式及在Java程序中的實現(xiàn)

    詳解設(shè)計模式中的proxy代理模式及在Java程序中的實現(xiàn)

    代理模式主要分為靜態(tài)代理和動態(tài)代理,使客戶端方面的使用者通過設(shè)置的代理來操作對象,下面來詳解設(shè)計模式中的proxy代理模式及在Java程序中的實現(xiàn)
    2016-05-05
  • Spring Boot如何優(yōu)化內(nèi)嵌的Tomcat示例詳解

    Spring Boot如何優(yōu)化內(nèi)嵌的Tomcat示例詳解

    spring boot默認(rèn)web程序啟用tomcat內(nèi)嵌容器,監(jiān)聽8080端口,下面這篇文章主要給大家介紹了關(guān)于Spring Boot如何優(yōu)化內(nèi)嵌Tomcat的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • Java數(shù)據(jù)結(jié)構(gòu)之插入排序與希爾排序

    Java數(shù)據(jù)結(jié)構(gòu)之插入排序與希爾排序

    在本篇文章,我們將為小伙伴們進行排序概念的基本講解并具體講解其中的兩種基礎(chǔ)排序:插入排序和希爾排序,希望小伙伴們能夠從中有所收獲
    2023-04-04
  • SpringBoot整合Echarts實現(xiàn)數(shù)據(jù)大屏

    SpringBoot整合Echarts實現(xiàn)數(shù)據(jù)大屏

    這篇文章給大家介紹了三步實現(xiàn)SpringBoot全局日志記錄,整合Echarts實現(xiàn)數(shù)據(jù)大屏,文中通過代碼示例給大家介紹的非常詳細(xì),具有一定的參考價值,需要的朋友可以參考下
    2024-03-03
  • 對ThreadLocal內(nèi)存泄漏及弱引用的理解

    對ThreadLocal內(nèi)存泄漏及弱引用的理解

    這篇文章主要介紹了對ThreadLocal內(nèi)存泄漏及弱引用的理解,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論

武夷山市| 河池市| 德安县| 中江县| 宜阳县| 马边| 康保县| 新密市| 梁河县| 客服| 丰镇市| 瓦房店市| 阜新市| 乌拉特前旗| 峨山| 永登县| 普兰县| 昌宁县| 益阳市| 繁峙县| 大荔县| 威信县| 全州县| 勃利县| 金川县| 呼玛县| 河源市| 保亭| 聊城市| 雷山县| 临湘市| 榆林市| 潞城市| 金溪县| 嘉鱼县| 陇南市| 调兵山市| 晋江市| 郑州市| 旺苍县| 甘泉县|