一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 從一個Demo開始,揭開Netty的神秘面紗

從一個Demo開始,揭開Netty的神秘面紗

2021-04-19 23:50阿丸筆記 Java教程

到目前為止,我們已經(jīng)從I/O模型出發(fā),逐步接觸到了Netty框架。這個過程中,基本解答了Netty是什么、為什么使用Netty等前置問題。給我們學習Netty提供了最原始的背景知識。

從一個Demo開始,揭開Netty的神秘面紗

上一篇文章我們對于I/O多路復用、Java NIO包 和 Netty 的關系有了全面的認識。

到目前為止,我們已經(jīng)從I/O模型出發(fā),逐步接觸到了Netty框架。這個過程中,基本解答了Netty是什么、為什么使用Netty等前置問題。給我們學習Netty提供了最原始的背景知識。

有了這些做基礎,下面我們可以開始慢慢去揭開Netty的神秘面紗了。

本文預計閱讀時間約 5分鐘,將重點圍繞以下幾個問題展開:

  • 如何用Netty編寫一個Server端服務Demo
  • 從Demo看Netty的邏輯架構,初識各個組件

1.編寫一個Server端Demo

 

1.1 基于主從Reactor模式的Demo實現(xiàn)

如果從來沒用過Netty,那么了解一下用Netty編寫的Server端Demo是必不可少的。

還記得我們上一篇說的 “主從Reactor模式” 嗎?可以構建兩個 Reactor,主 Reactor 單獨監(jiān)聽server socket,accept新連接,然后將建立的 SocketChannel 注冊給指定的從 Reactor,從Reactor再執(zhí)行事件的讀寫、分發(fā),把業(yè)務處理就扔給worker線程池完成。

從一個Demo開始,揭開Netty的神秘面紗

我們就按照這個模式,用Netty編寫一個服務端程序吧。

直接上代碼!

一個簡單的自定義ChannelHandler類,用來自定義業(yè)務處理邏輯:

從一個Demo開始,揭開Netty的神秘面紗

一個包含Bootstrap的服務端啟動類:

  1. public class EchoServer { 
  2.     private int port; 
  3.  
  4.     public EchoServer(int port) { 
  5.         this.port = port; 
  6.     } 
  7.  
  8.     public static void main(String[] args) throws Exception { 
  9.         new EchoServer(8833).start(); 
  10.     } 
  11.  
  12.     public void start() throws Exception { 
  13.         //1.Reactor模型的主、從多線程 
  14.         EventLoopGroup mainGroup = new NioEventLoopGroup(); 
  15.         EventLoopGroup childGroup = new NioEventLoopGroup(); 
  16.  
  17.         try { 
  18.             //2.構造引導器實例ServerBootstrap 
  19.             ServerBootstrap b = new ServerBootstrap(); 
  20.             b.group(mainGroup, childGroup) 
  21.                     .channel(NioServerSocketChannel.class) //2.1 設置NIO的channel 
  22.                     .localAddress(new InetSocketAddress(port)) //2.2 配置本地監(jiān)聽端口 
  23.                     .childHandler(new ChannelInitializer<SocketChannel>() { //2.3 初始化channel的時候,配置Handler 
  24.                         @Override 
  25.                         protected void initChannel(final SocketChannel socketChannel) { 
  26.                             socketChannel.pipeline() 
  27.                                     .addLast("codec", new HttpServerCodec()) 
  28.                                     .addLast("compressor", new HttpContentCompressor()) 
  29.                                     .addLast("aggregator", new HttpObjectAggregator(65536)) 
  30.                                     .addLast("handler", new EchoServerHandler()); //2.4 加入自定義業(yè)務邏輯ChannelHandler 
  31.                         } 
  32.                     }); 
  33.             ChannelFuture f = b.bind().sync(); //3.啟動監(jiān)聽 
  34.             System.out.println("Http Server started, Listening on " + port); 
  35.             f.channel().closeFuture().sync(); 
  36.         } finally { 
  37.             mainGroup.shutdownGracefully().sync(); 
  38.             childGroup.shutdownGracefully().sync(); 
  39.         } 
  40.     } 

啟動后,通過curl調用,得到響應。

從一個Demo開始,揭開Netty的神秘面紗

Demo完成了!

對于之前覺得用Java NIO包實現(xiàn)起來很復雜的的 “主從Reactor模式” ,用Netty簡簡單單就完成了。

從一個Demo開始,揭開Netty的神秘面紗

只需要創(chuàng)建兩個EventLoopGroup,然后綁定到引導器ServerBootstrap上就好了.

mainGroup 是主 Reactor,childGroup 是從 Reactor。它們分別使用不同的 NioEventLoopGroup,主 Reactor 負責處理 Accept,然后把 Channel 注冊到從 Reactor 上,從 Reactor 主要負責 Channel 生命周期內的所有 I/O 事件。

1.2 Demo分析

從上面的Demo代碼可以看出,對于所有用Netty編寫的服務端程序,至少需要兩個部分:

  • 至少一個ChannelHandler
  • Bootstrapping

1)ChannelHandler

這個組件用來實現(xiàn)對客戶端發(fā)送過來的數(shù)據(jù)進行處理,可能包括編解碼、自定義業(yè)務邏輯處理等等。

對于ChannelHandler來說,有非常多的實現(xiàn)。在Demo中我們簡單使用了幾個Netty自帶的Handler,包括HttpServerCodec、HttpContentCompressor、HttpObjectAggregator,也使用了一個自定義的EchoServerHandler。

可以看到,對于Handler的使用,是非常重要也是非常方便的一個環(huán)節(jié)。我們會在以后的文章中詳細展開。

2)Bootstrapping

啟動代碼部分。用來配置服務端的啟動參數(shù),包括監(jiān)聽端口、服務端線程池配置、網(wǎng)絡連接屬性配置、ChannelHandler配置等等。

結合Demo來看,主要分為這幾個步驟:

  • 創(chuàng)建一個ServerBootstrap實例,用來引導啟動。
  • 創(chuàng)建一個(當我們使用主從Reactor模式時,需要創(chuàng)建兩個)NioEventLoopGroup實例來處理事件, 比如接受一個新的客戶端連接、讀寫數(shù)據(jù)等。
  • 指定一個端口,用來作為服務端的監(jiān)聽端口。
  • 使用一系列channelHandler來初始化每個Channel,包括自定義業(yè)務邏輯實現(xiàn)的channelHandler。
  • 調用ServerBootstrap.bind() 來真正觸發(fā)啟動。

2. Netty的邏輯架構

 

通過上面的Demo演示,我們對 Netty 的使用已經(jīng)有了一個大概的印象。

下面,我們根據(jù)Demo中使用的幾個組件,一起梳理一下 Netty 的邏輯架構。

從一個Demo開始,揭開Netty的神秘面紗

結合我們的Demo和這個邏輯架構圖,我們梳理下各個組件的流轉過程:

  • 服務端利用ServerBootstrap進行啟動引導,綁定監(jiān)聽端口
  • 啟動初始化時有 main EventLoopGroup 和 child EventLoopGroup 兩個組件,其中 main EventLoopGroup負責監(jiān)聽網(wǎng)絡連接事件。當有新的網(wǎng)絡連接時,就將 Channel 注冊到 child EventLoopGroup。
  • child EventLoopGroup 會被分配一個 EventLoop 負責處理該 Channel 的讀寫事件。
  • 當客戶端發(fā)起 I/O 讀寫事件時,服務端 EventLoop 會進行數(shù)據(jù)的讀取,然后通過 ChannelPipeline 依次有序觸發(fā)各種ChannelHandler進行數(shù)據(jù)處理。
  • 客戶端數(shù)據(jù)會被依次傳遞到 ChannelPipeline 的 ChannelInboundHandler 中,在一個handler中處理完后就會傳入下一個handler。
  • 當數(shù)據(jù)寫回客戶端時,會將處理結果依次傳遞到 ChannelPipeline 的 ChannelOutboundHandler 中,在一個handler中處理完后就會傳入下一個handler,最后返回客戶端。

以上便是 Netty 各個組件的邏輯架構,我們暫時只需要了解個大致框架即可,后面我們會詳細介紹各個組件。

有幾個比較常見的問題在這里總結下:

1)什么是Channel

Channel 的字面意思是“通道”,它是網(wǎng)絡通信的載體,提供了基本的 API 用于網(wǎng)絡 I/O 操作,如 register、bind、connect、read、write、flush 等。

Netty 實現(xiàn)的 Channel 是以 JDK NIO Channel 為基礎的,提供了更高層次的抽象,屏蔽了底層 Socket。

2)什么是ChannleHandler和ChannelPipeline

ChannelHandler實現(xiàn)對客戶端發(fā)送過來的數(shù)據(jù)進行處理,可能包括編解碼、自定義業(yè)務邏輯處理等等。

ChannelPipeline 負責組裝各種 ChannelHandler,當 I/O 讀寫事件觸發(fā)時,ChannelPipeline 會依次調用 ChannelHandler 列表對 Channel 的數(shù)據(jù)進行攔截和處理。

3)什么是EventLoopGroup?

EventLoopGroup 本質是一個線程池, 是 Netty Reactor 線程模型的具體實現(xiàn)方式,主要負責接收 I/O 請求,并分配線程執(zhí)行處理請求。我們在demo中使用了它的實現(xiàn)類 NioEventLoopGroup,也是 Netty 中最被推薦使用的線程模型。

我們還通過構建main EventLoopGroup 和 child EventLoopGroup 實現(xiàn)了 “主從Reactor模式”。

4)EventLoopGroup、EventLoop、Channel有什么關系?

一個 EventLoopGroup 往往包含一個或者多個 EventLoop。

EventLoop 用于處理 Channel 生命周期內的所有 I/O 事件,如 accept、connect、read、write 等 I/O 事件。

EventLoop 同一時間會與一個線程綁定,每個 EventLoop 負責處理多個 Channel。

參考書目:

《Netty in Action》

【編輯推薦】https://mp.weixin.qq.com/s/7AxE5QMDnlR8gzilR8HajQ

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 91精品综合国产在线观看 | 日本剧情片在线播放中文版 | 免费看日本 | 2021麻豆剧果冻传媒入口永久 | 亚洲 欧美 日韩 综合 | 亚洲国产日韩欧美mv | 国产精品www视频免费看 | 美女沟厕撒尿全过程高清图片 | 99久久综合给久久精品 | 色综合天天综合网站中国 | 男人狂躁女人gif动态图 | 男同桌扒开女同桌胸罩喝奶 | 满溢游泳池免费土豪全集下拉版 | 三上悠亚精品专区久久 | 欧美男男gaysgays | 黄瓜视频黄版 | 黄色wwwwww | 羞羞漫画免费漫画页面在线看漫画秋蝉 | 免费aⅴ在线 | 我强进了老师身体在线观看 | 青青青国产在线观看 | 911爱豆传媒国产 | 国产一区二区在线观看美女 | 国产在线播放一区 | 暖暖视频高清图片免费完整版 | 无限资源在线观看8 | 亚洲国产99在线精品一区69堂 | 欧美夫妇野外交换hd高清版 | 久久亚洲精品AV无码四区 | 免费高清特黄a 大片 | 四虎影院免费视频 | 成人欧美一区在线视频在线观看 | 青久久 | 日本免费全黄一级裸片视频 | 国产亚洲欧美一区二区三区 | 免费日批视频 | 亚洲高清国产品国语在线观看 | 成人伊人亚洲人综合网站222 | 无人区乱码1区2区3区网站 | 草莓视频在线免费观看 | 免费高清在线视频色yeye |