99re热这里只有精品视频,7777色鬼xxxx欧美色妇,国产成人精品一区二三区在线观看,内射爽无广熟女亚洲,精品人妻av一区二区三区

Netty 異步和數(shù)據(jù)驅(qū)動(dòng)

2021-04-22 14:57 更新

在學(xué)習(xí)Netty的異步和數(shù)據(jù)驅(qū)動(dòng)之前,我們先來(lái)簡(jiǎn)單的了解一下Netty

Netty是什么

Netty 是一個(gè)利用 Java 的高級(jí)網(wǎng)絡(luò)的能力,隱藏了Java背后的復(fù)雜性然后提供了一個(gè)易于使用的 API 的客戶端/服務(wù)器框架。Netty 的高性能和可擴(kuò)展性,可以作為你自己的獨(dú)特的應(yīng)用,讓你更用心的花時(shí)間在你有興趣的東西上。

Netty處理一些高并發(fā)的網(wǎng)絡(luò)問(wèn)題的時(shí)候會(huì)體現(xiàn)出怎樣的價(jià)值呢?想知道的話,答案就在本章中。本章除了解釋上述問(wèn)題,還將為大家講解Netty的基本概念以及Netty的工具包的構(gòu)成成分。

Netty的歷史

在網(wǎng)絡(luò)發(fā)展初期,需要花很多時(shí)間來(lái)學(xué)習(xí) socket 的復(fù)雜,尋址等等,在 C socket 庫(kù)上進(jìn)行編碼,并需要在不同的操作系統(tǒng)上做不同的處理。

Java 早期版本(1995-2002)介紹了足夠的面向?qū)ο蟮奶且聛?lái)隱藏一些復(fù)雜性,但實(shí)現(xiàn)復(fù)雜的客戶端-服務(wù)器協(xié)議仍然需要大量的樣板代碼(和進(jìn)行大量的監(jiān)視才能確保他們是對(duì)的)。

這些早期的 Java API(java.net)只能通過(guò)原生的 socket 庫(kù)來(lái)支持所謂的“blocking(阻塞)”的功能。一個(gè)簡(jiǎn)單的例子

Listing 1.1 Blocking I/O Example

ServerSocket serverSocket = new ServerSocket(portNumber);//1
Socket clientSocket = serverSocket.accept();             //2
BufferedReader in = new BufferedReader(                     //3
        new InputStreamReader(clientSocket.getInputStream()));
PrintWriter out =
        new PrintWriter(clientSocket.getOutputStream(), true);
String request, response;
while ((request = in.readLine()) != null) {                 //4
    if ("Done".equals(request)) {                         //5
        break;
    }
}
response = processRequest(request);                        //6
out.println(response);                                    //7
}                                                        //8

1.ServerSocket 創(chuàng)建并監(jiān)聽(tīng)端口的連接請(qǐng)求

2.accept() 調(diào)用阻塞,直到一個(gè)連接被建立了。返回一個(gè)新的 Socket 用來(lái)處理 客戶端和服務(wù)端的交互

3.流被創(chuàng)建用于處理 socket 的輸入和輸出數(shù)據(jù)。BufferedReader 讀取從字符輸入流里面的文本。PrintWriter 打印格式化展示的對(duì)象讀到本文輸出流

4.處理循環(huán)開(kāi)始 readLine() 阻塞,讀取字符串直到最后是換行或者輸入終止。

5.如果客戶端發(fā)送的是“Done”處理循環(huán)退出

6.執(zhí)行方法處理請(qǐng)求,返回服務(wù)器的響應(yīng)

7.響應(yīng)發(fā)回客戶端

8.處理循環(huán)繼續(xù)

顯然,這段代碼限制每次只能處理一個(gè)連接。為了實(shí)現(xiàn)多個(gè)并行的客戶端我們需要分配一個(gè)新的 Thread 給每個(gè)新的客戶端 Socket(當(dāng)然需要更多的代碼)。但考慮使用這種方法來(lái)支持大量的同步,長(zhǎng)連接。在任何時(shí)間點(diǎn)多線程可能處于休眠狀態(tài),等待輸入或輸出數(shù)據(jù)。這很容易使得資源的大量浪費(fèi),對(duì)性能產(chǎn)生負(fù)面影響。當(dāng)然,有一種替代方案。

除了示例中所示阻塞調(diào)用,原生 socket 庫(kù)同時(shí)也包含了非阻塞 I/O 的功能。這使我們能夠確定任何一個(gè) socket 中是否有數(shù)據(jù)準(zhǔn)備讀或?qū)?。我們還可以設(shè)置標(biāo)志,因?yàn)樽x/寫(xiě)調(diào)用如果沒(méi)有數(shù)據(jù)立即返回;就是說(shuō),如果一個(gè)阻塞被調(diào)用后就會(huì)一直阻塞,直到處理完成。通過(guò)這種方法,會(huì)帶來(lái)更大的代碼的復(fù)雜性成本,其實(shí)我們可以獲得更多的控制權(quán)來(lái)如何利用網(wǎng)絡(luò)資源。

JAVA NIO

在 2002 年,Java 1.4 引入了非阻塞 API 在 java.nio 包(NIO)。

"New"還是"Nonblocking"?

NIO 最初是為 New Input/Output 的縮寫(xiě)。然而,Java 的 API 已經(jīng)存在足夠長(zhǎng)的時(shí)間,它不再是新的?,F(xiàn)在普遍使用的縮寫(xiě)來(lái)表示Nonblocking I/O (非阻塞 I/O)。另一方面,一般(包括作者)指阻塞 I/O 為 OIO 或 Old Input/Output。你也可能會(huì)遇到普通 I/O。

我們已經(jīng)展示了在 Java 的 I/O 阻塞一例例子。圖 1.1 展示了方法 必須擴(kuò)大到處理多個(gè)連接:給每個(gè)連接創(chuàng)建一個(gè)線程,有些連接是空閑的!顯然,這種方法的可擴(kuò)展性將是受限于可以在 JVM 中創(chuàng)建的線程數(shù)。

Figure 1.1 Blocking I/O

Figure%201

當(dāng)你的應(yīng)用中連接數(shù)比較少,這個(gè)方案還是可以接受。當(dāng)并發(fā)連接超過(guò)10000 時(shí),context-switching(上下文切換)開(kāi)銷將是明顯的。此外,每個(gè)線程都有一個(gè)默認(rèn)的堆棧內(nèi)存分配了 128K 和 1M 之間的空間。考慮到整體的內(nèi)存和操作系統(tǒng)需要處理 100000 個(gè)或更多的并發(fā)連接資源,這似乎是一個(gè)不理想的解決方案。

SELECTOR

相比之下,圖1.2 顯示了使用非阻塞I/O,主要是消除了這些方法 約束。在這里,我們介紹了“Selector”,這是 Java 的無(wú)阻塞 I/O 實(shí)現(xiàn)的關(guān)鍵。

Figure 1.2 Nonblocking I/O

v2-d2cbae084dd6d8babb9fb9da7351334f_720w

Selector 最終決定哪一組注冊(cè)的 socket 準(zhǔn)備執(zhí)行 I/O。正如我們之前所解釋的那樣,這 I/O 操作設(shè)置為非阻塞模式。通過(guò)通知,一個(gè)線程可以同時(shí)處理多個(gè)并發(fā)連接。(一個(gè) Selector 由一個(gè)線程通常處理,但具體實(shí)施可以使用多個(gè)線程。)因此,每次讀或?qū)懖僮鲌?zhí)行能立即檢查完成??傮w而言,該模型提供了比 阻塞 I/O 模型 更好的資源使用,因?yàn)?/p>

  • 可以用較少的線程處理更多連接,這意味著更少的開(kāi)銷在內(nèi)存和上下文切換上
  • 當(dāng)沒(méi)有 I/O 處理時(shí),線程可以被重定向到其他任務(wù)上。

如果你要直接使用這些 Java API 構(gòu)建的 NIO 建立你的應(yīng)用程序,只是這樣做正確和安全是無(wú)法保證的。實(shí)現(xiàn)可靠和可擴(kuò)展的 event-processing(事件處理器)來(lái)處理和調(diào)度數(shù)據(jù)并保證盡可能有效地,這是一個(gè)繁瑣和容易出錯(cuò)的任務(wù),最好留給專家 - Netty。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)