圖解Netty5.0

前言:

如果知識(shí)不能夠在短時(shí)間內(nèi)應(yīng)用那么就很難記住席怪,換句話說沒有應(yīng)用的知識(shí)都是你沒有掌握的生兆!圖解系列相當(dāng)于在大腦中建立了一個(gè)模型苦始,這個(gè)模型和頭腦中的原有知識(shí)可以形成高速公路调榄,而這樣的高速公路越多就越容易找到這個(gè)模型维咸,這樣以后真正應(yīng)用的時(shí)候可以快速遍歷知識(shí)體系而做到有的放矢壤追。

言歸正傳撩轰,上一篇我們回顧了一下Java NIO坟乾,使用環(huán)形傳送帶和管道檢查點(diǎn)以及管道形象化了這些抽象的概念。然而枪孩,Java NIO的操作步驟著實(shí)復(fù)雜横蜒,簡(jiǎn)單寫一個(gè)程序都需要特別多的步驟。我們還沒有考慮到可靠性問題销凑,即超時(shí)處理、心跳檢測(cè)仅炊、網(wǎng)絡(luò)故障處理等斗幼,想要寫一個(gè)完整的高性能Java NIO,這些模塊我們都要自己實(shí)現(xiàn)抚垄。Netty NIO恰好實(shí)現(xiàn)了這些模塊蜕窿,免去了我們重復(fù)造輪子的麻煩

1:Netty結(jié)構(gòu)和處理流程:

高清圖下載:Netty結(jié)構(gòu)和流程高清圖

Netty結(jié)構(gòu)和流程圖

A:從外到內(nèi)闡述結(jié)構(gòu):

內(nèi)存:計(jì)算機(jī)內(nèi)存,4g 8g 16g等等

ByteBuf:字節(jié)緩沖區(qū)呆馁。想想JavaNIO里面的ByteBuffer效果一樣桐经,操作更加人性化了!ByteBuf在內(nèi)存中分為直接內(nèi)存浙滤,堆內(nèi)存和混合內(nèi)存阴挣,其中堆內(nèi)存較常用!

客戶端:想象成一個(gè)客戶纺腊。包含一個(gè)工作線程組畔咧,綁定IP和端口后就可以收發(fā)TCP等協(xié)議的消息了

服務(wù)端:想象成一個(gè)工廠。

????????a:包含老板和工人兩個(gè)線程組揖膜,老板負(fù)責(zé)監(jiān)聽分派任務(wù)誓沸,工人們負(fù)責(zé)去車間干活(Java NIO2即AIO里,我們不可以指定工人線程壹粟,而是由Java內(nèi)部自動(dòng)從線程池里取出線程去工作)拜隧。

????????b:流水線:所有代加工的材料(收到的字節(jié)數(shù)組)都需要按照順序經(jīng)過流水線上的每個(gè)車間處理加工。

? ? ? ????????b1:車間:Handler趁仙,車間實(shí)際上由工人線程們操控洪添,是真正干活兒的部分,我們的代碼一般都寫到車間里

? ? ? ????????b2:車間流水線連接器:聯(lián)通車間和流水線幸撕,讓車間有調(diào)用下一個(gè)車間的能力薇组,實(shí)際上這個(gè)連接器還連接著通道,可以從通道讀寫

啟動(dòng)器:想象成公司董事會(huì)坐儿。分為客戶端啟動(dòng)器和服務(wù)端啟動(dòng)器律胀,想想Java NIO宋光,每次啟動(dòng)都需要各種open操作,這里直接一個(gè)Bootstrap就可以讓工廠運(yùn)行了

B:現(xiàn)實(shí)世界映射:

Server公司(服務(wù)端)打算成立一個(gè)項(xiàng)目組生產(chǎn)服裝炭菌,可以接收Client(客戶端)這樣的公司的各種訂單

首先罪佳,S公司的董事會(huì)(ServerBootstrap服務(wù)端啟動(dòng)器)召開董事會(huì),決定接手項(xiàng)目黑低,并分配了幾個(gè)包工頭(boss = new NioEventLoopGroup())和一群工人(workers = new NioEventLoopGroup())來處理這個(gè)項(xiàng)目赘艳。項(xiàng)目開工之前可以先設(shè)定一下工廠的一些規(guī)則,比如同時(shí)接受多少個(gè)C這樣類型的公司的原材料(backlog)克握,由哪些車間進(jìn)行生產(chǎn)(childHandler)等

然后蕾管,項(xiàng)目按照預(yù)定計(jì)劃開工(bootstrap.group(boss,workers))

然后,boss開始接收到C公司訂單菩暗,然后把原材料扔到生產(chǎn)線上掰曾,由工廠派出worker線程去生產(chǎn)線(ChannelPipeLine)上的車間(ChannelHander)工作

然后,某個(gè)車間工作完成之后可以把產(chǎn)品(response)通過連接器(ChannelHanlerContext)放回到管道(Channel.write)里交給客戶端停团,也可以通過連接器把產(chǎn)品交給下一個(gè)車間(ctx.fireNext)旷坦。

最后,所有工作都完成佑稠,優(yōu)雅的讓工人和老板退出生產(chǎn)線(shutdownGracefully())秒梅,而不是直接趕走。

C:代碼體現(xiàn):(服務(wù)端)

public class Server {

private int port;

public Server(int port) {

? ? ? ?this.port = port;

}

public void run() {

????????EventLoopGroup bossGroup = new NioEventLoopGroup(); // 用于處理服務(wù)器端接收客戶端連接

????????EventLoopGroup workerGroup = new NioEventLoopGroup(); // 進(jìn)行網(wǎng)絡(luò)通信(讀寫)

????????try {

????????????????ServerBootstrap bootstrap = new ServerBootstrap(); // 輔助工具類舌胶,用于服務(wù)器通道的一系列配置

????????????????bootstrap.group(bossGroup, workerGroup) // 綁定兩個(gè)線程組

? ? ? ? ? ? ? ? .channel(NioServerSocketChannel.class) // 指定NIO的模式

????????????????.childHandler(new ChannelInitializer() { // 配置具體的數(shù)據(jù)處理方式

? ? ? ? ? ? ? ? ? ? ? ? @Override

? ? ? ? ? ? ? ? ? ? ? ? protected void initChannel(SocketChannel socketChannel) throws Exception {

? ? ? ? ? ? ? ? ? ? ? ? ? ? socketChannel.pipeline().addLast(new ServerHandler());

? ? ? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? }).option(ChannelOption.SO_BACKLOG, 128) // 設(shè)置TCP緩沖區(qū)

? ? ? ? ? ? ? ? ? ? .option(ChannelOption.SO_SNDBUF, 32 * 1024) // 設(shè)置發(fā)送數(shù)據(jù)緩沖大小

? ? ? ? ? ? ? ? ? ? .option(ChannelOption.SO_RCVBUF, 32 * 1024) // 設(shè)置接受數(shù)據(jù)緩沖大小

? ? ? ? ? ? ? ? ? ? .childOption(ChannelOption.SO_KEEPALIVE, true); // 保持連接

? ? ? ? ? ? ChannelFuture future = bootstrap.bind(port).sync();

? ? ? ? ? ? future.channel().closeFuture().sync();

? ? ? ? } catch (Exception e) {

? ? ? ? ? ? e.printStackTrace();

? ? ? ? } finally {

? ? ? ? ? ? workerGroup.shutdownGracefully();

? ? ? ? ? ? bossGroup.shutdownGracefully();

? ? ? ? }

? ? }

? ? public static void main(String[] args) {

? ? ? ? new Server(8379).run();

? ? }

}

public class ServerHandler extends ChannelHandlerAdapter {

? @Override

? public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {

????????ByteBuf buf = (ByteBuf)msg;

????????byte[] data = new byte[buf.readableBytes()];

????????buf.readBytes(data);

????????String request = new String(data, "utf-8");

????????System.out.println("Server: " + request); //寫給客戶端

????????ctx.writeAndFlush(Unpooled.copiedBuffer("888".getBytes())); //.addListener(ChannelFutureListener.CLOSE);

????}

@Override

public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {

????cause.printStackTrace(); ctx.close();

????}

}

2:總結(jié):

????????本篇博客意在讓大家對(duì)Netty有一個(gè)結(jié)構(gòu)和流程上的認(rèn)識(shí)捆蜀,基于本博客可以快速了解Netty兩端的數(shù)據(jù)交互流程,以及Netty的重要工作組件辆琅。后續(xù)還會(huì)繼續(xù)為大家奉上Netty各個(gè)組件的詳細(xì)使用方法漱办。歡迎大家提出寶貴意見!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末婉烟,一起剝皮案震驚了整個(gè)濱河市娩井,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌似袁,老刑警劉巖洞辣,帶你破解...
    沈念sama閱讀 217,406評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異昙衅,居然都是意外死亡扬霜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門而涉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來著瓶,“玉大人,你說我怎么就攤上這事啼县〔脑” “怎么了沸久?”我有些...
    開封第一講書人閱讀 163,711評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長余蟹。 經(jīng)常有香客問我卷胯,道長,這世上最難降的妖魔是什么威酒? 我笑而不...
    開封第一講書人閱讀 58,380評(píng)論 1 293
  • 正文 為了忘掉前任窑睁,我火速辦了婚禮,結(jié)果婚禮上葵孤,老公的妹妹穿的比我還像新娘担钮。我一直安慰自己,他們只是感情好尤仍,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,432評(píng)論 6 392
  • 文/花漫 我一把揭開白布裳朋。 她就那樣靜靜地躺著,像睡著了一般吓著。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上送挑,一...
    開封第一講書人閱讀 51,301評(píng)論 1 301
  • 那天绑莺,我揣著相機(jī)與錄音,去河邊找鬼惕耕。 笑死纺裁,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的司澎。 我是一名探鬼主播欺缘,決...
    沈念sama閱讀 40,145評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼挤安!你這毒婦竟也來了谚殊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,008評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蛤铜,失蹤者是張志新(化名)和其女友劉穎嫩絮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體围肥,經(jīng)...
    沈念sama閱讀 45,443評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剿干,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,649評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了穆刻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片置尔。...
    茶點(diǎn)故事閱讀 39,795評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖氢伟,靈堂內(nèi)的尸體忽然破棺而出榜轿,到底是詐尸還是另有隱情幽歼,我是刑警寧澤,帶...
    沈念sama閱讀 35,501評(píng)論 5 345
  • 正文 年R本政府宣布差导,位于F島的核電站试躏,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏设褐。R本人自食惡果不足惜颠蕴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,119評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望助析。 院中可真熱鬧犀被,春花似錦、人聲如沸外冀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽雪隧。三九已至西轩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間脑沿,已是汗流浹背藕畔。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留庄拇,地道東北人注服。 一個(gè)月前我還...
    沈念sama閱讀 47,899評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像措近,于是被迫代替她去往敵國和親溶弟。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,724評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容