
Netty°¸Àý¼¯½õϵÁÐÎÄÕ½éÉÜ
1£üNettyµÄÌØµã
NettyÈëÃűȽϼòµ¥£¬Ö÷ÒªÔÒòÓÐÈçϼ¸µã£º
- NettyµÄAPI·â×°±È½Ï¼òµ¥£¬½«¸´ÔÓµÄÍøÂçͨÐÅͨ¹ýBootStrapµÈ¹¤¾ßÀà×öÁ˶þ´Î·â×°£¬Óû§Ê¹ÓÃÆðÀ´±È½Ï¼òµ¥£»
-
NettyÔ´Âë×Ô´øµÄDemo±È½Ï¶à£¬Í¨¹ýDemo¿ÉÒԺܿìÈëÃÅ£»
-
NettyÉçÇø×ÊÁÏ¡¢Ïà¹ØÑ§Ï°Êé¼®Ò²±È½Ï¶à£¬Ñ§Ï°×ÊÁϱȽϷḻ¡£
µ«ÊǺܶàÈëÃÅÖ®ºóµÄNettyѧϰÕßÓöµ½Á˺ܶàÀ§»ó£¬ÀýÈç²»ÖªµÀÔÚʵ¼ÊÏîÄ¿ÖÐÈçºÎʹÓÃNetty¡¢Óöµ½NettyÎÊÌâÖ®ºóÎÞ´Ó¶¨Î»µÈ£¬ÕâЩÎÊÌâÑÏÖØÖÆÔ¼Á˶ÔNettyµÄÉîÈëÕÆÎÕºÍʵ¼ÊÏîĿӦÓá£
NettyÏà¹ØÎÊÌâ±È½ÏÄѶ¨Î»µÄÖ÷ÒªÔÒòÈçÏ£º
1) NIO±à³Ì×ÔÉíµÄ¸´ÔÓÐÔ£¬Éæ¼°µ½´óÁ¿NIOÀà¿â¡¢Netty×ÔÉí·â×°µÄÀà¿âµÈ£¬µ±ÄãÐèÒª´ò¿ªºÚºÐ¶¨Î»ÎÊÌâʱ£¬±ØÐë¶ÔÕâЩÀà¿âÁËÈçÖ¸ÕÆ£»·ñÔò¼´±ã¶¨Î»µ½ÎÊÌâËùÔÚ£¬Ò²²»ÖªËùÒÔÈ»£¬¸üÎÞ·¨ÐÞ¸´£»
2) Netty¸´ÔӵĶàÏß³ÌÄ£ÐÍ£¬Óû§ÔÚʵ¼ÊʹÓÃNettyʱ£¬»áÉæ¼°µ½Netty×Ô¼º·â×°µÄÏß³Ì×é¡¢Ï̳߳ء¢NIOỊ̈߳¬ÒÔ¼°ÒµÎñỊ̈߳¬Í¨ÐÅÁ´Â·µÄ´´½¨¡¢I/OÏûÏ¢µÄ¶Áд»áÉæ¼°µ½¸´ÔÓµÄÏß³ÌÇл»£¬Õâ»áÈóõѧÕßÔÆÉ½ÎíÈÆ£¬µ÷ÊÔÆðÀ´·Ç³£Í´¿à£¬ÉõÖÁ¶¼²»ÖªµÀ´ÓÄÄÀïµ÷ÊÔ£»
3) Netty°æ±¾µÄ¿ç¶È´ó£¬´Óʵ¼ÊÉÌÓÃÇé¿ö¿´£¬Éæ¼°µ½ÁËNetty 3.X¡¢4.XºÍ5.XµÈ¶à¸ö°æ±¾£¬Ã¿¸öMajor°æ±¾Ö®¼äÌØÐԱ仯·Ç³£´ó£¬¼´±ãÊÇMinor°æ±¾¶¼´æÔÚһЩ²îÒ죬ÕâЩ¹¦ÄÜÌØÐÔºÍÀà¿â²îÒì»á¸øÊ¹ÓÃÕß´øÀ´ºÜ¶àÎÊÌ⣬°æ±¾Éý¼¶Ö®ºóÉÔÓв»É÷¾Í»áµôÈëÏÝÚå¡£
2£ü°¸ÀýÀ´Ô´
Netty°¸Àý¼¯½õµÄ°¸ÀýÀ´Ô´ÓÚ×÷ÕßÔÚʵ¼ÊÏîÄ¿ÖÐÓöµ½µÄÎÊÌâ×ܽᡢÒÔ¼°NettyÉçÇøÍøÓѵķ´À¡£¬´ó¶àÊý°¸Àý¶¼À´Ô´ÓÚʵ¼ÊÏîÄ¿£¬Ò²ÓÐÉÙ²¿·ÖÊǶÁÕßÔÚѧϰNettyÖÐÔâÓöµÄ±È½ÏµäÐ͵ÄÎÊÌâ¡£
3£ü¶àÏß³ÌÆª
ѧϰºÍÕÆÎÕNetty¶àÏß³ÌÄ£ÐÍÊǸöÄѵ㣬ÔÚʵ¼ÊÏîÄ¿ÖÐÈçºÎʹÓúÃNetty¶àÏ̸߳ü¼ÓÀ§ÄÑ£¬ºÜ¶àÍøÉÏÎÊÌâºÍʹʶ¼À´Ô´ÓÚ¶ÔNettyÏß³ÌÄ£ÐÍÁ˽ⲻ͸³¹ËùÖ¡£¼øÓÚ´Ë£¬Netty°¸Àý¼¯½õϵÁоÍÊ×ÏÈ´Ó¶àÏ̷߳½Ã濪ʼ¡£
Netty 3 °æ±¾Éý¼¶ÔâÓöÄÚ´æÐ¹Â©°¸Àý
1£üÎÊÌâÃèÊö
ÒµÎñ´úÂëÉý¼¶Netty 3µ½Netty4Ö®ºó£¬ÔËÐÐÒ»¶Îʱ¼ä£¬Java½ø³Ì¾Í»áå´»ú£¬²é¿´ÏµÍ³ÔËÐÐÈÕÖ¾·¢ÏÖϵͳ·¢ÉúÁËÄÚ´æÐ¹Â¶£¨Ê¾Àý¶ÑÕ»£©£º

ͼ2-1 ÄÚ´æÐ¹Â©¶ÑÕ»
¶ÔÄÚ´æ½øÐÐ¼à¿Ø£¨Çл»Ê¹ÓöÑÄÚ´æ³Ø£¬·½±ã¶ÔÄÚ´æ½øÐÐ¼à¿Ø£©£¬·¢ÏÖ¶ÑÄÚ´æÒ»Ö±ìÉý£¬ÈçÏÂËùʾ£¨Ê¾Àý¶ÑÄÚ´æ¼à¿Ø£©£º

ͼ2-2 ¶ÑÄÚ´æ¼à¿ØÊ¾Àý
2£üÎÊÌⶨλ
ʹÓÃjmap -dump:format=b,file=netty.bin PID ½«¶ÑÄÚ´ædump³öÀ´£¬Í¨¹ýIBMµÄHeapAnalyzer¹¤¾ß½øÐзÖÎö£¬·¢ÏÖByteBuf·¢ÉúÁËй¶¡£
ÒòΪʹÓÃÁËNetty 4µÄÄÚ´æ³Ø£¬ËùÒÔÊ×ÏÈ»³ÒÉÊDz»ÊÇÉêÇëµÄByteBufûÓб»Êͷŵ¼Ö£¿²é¿´´úÂ룬·¢ÏÖÏûÏ¢·¢ËÍÍê³ÉÖ®ºó£¬Nettyµ×²ãÒѾµ÷ÓÃReferenceCountUtil.release(message)¶ÔÄÚ´æ½øÐÐÁËÊÍ·Å¡£ÕâÊÇÔõô»ØÊÂÄØ£¿ÄѵÀNetty 4.XµÄÄÚ´æ³ØÓÐBug£¬µ÷ÓÃrelease²Ù×÷ÊÍ·ÅÄÚ´æÊ§°Ü£¿
¿¼Âǵ½Netty ÄÚ´æ³Ø×ÔÉíBugµÄ¿ÉÄÜÐÔ²»´ó£¬Ê×ÏÈ´ÓÒµÎñµÄʹÓ÷½Ê½ÈëÊÖ·ÖÎö£º
1£©ÄÚ´æµÄ·ÖÅäÊÇÔÚÒµÎñ´úÂëÖнøÐУ¬ÓÉÓÚʹÓõ½ÁËÒµÎñÏ̳߳Ø×öI/O²Ù×÷ºÍÒµÎñ²Ù×÷µÄ¸ôÀ룬ʵ¼ÊÉÏÄÚ´æÊÇÔÚÒµÎñÏß³ÌÖзÖÅäµÄ£»
2£©ÄÚ´æµÄÊͷŲÙ×÷ÊÇÔÚoutboundÖнøÐУ¬°´ÕÕNetty 3µÄÏß³ÌÄ£ÐÍ£¬downstream£¨¶ÔÓ¦Netty 4µÄoutbound£¬Netty 4È¡ÏûÁËupstreamºÍdownstream£©µÄhandlerÒ²ÊÇÓÉÒµÎñµ÷ÓÃÕßÏß³ÌÖ´Ðеģ¬Ò²¾ÍÊÇ˵ÉêÇëºÍÊÍ·ÅÔÚͬһ¸öÒµÎñÏß³ÌÖнøÐС£³õ´ÎÅŲ鲢ûÓз¢ÏÖµ¼ÖÂÄÚ´æÐ¹Â¶µÄ¸ùÒò£¬¼ÌÐø·ÖÎöNettyÄÚ´æ³ØµÄʵÏÖÔÀí¡£
Netty ÄÚ´æ³ØÊµÏÖÔÀí·ÖÎö£º²é¿´NettyµÄÄÚ´æ³Ø·ÖÅäÆ÷PooledByteBufAllocatorµÄÔ´ÂëʵÏÖ£¬·¢ÏÖÄÚ´æ³ØÊµ¼ÊÊÇ»ùÓÚÏß³ÌÉÏÏÂÎÄʵÏֵģ¬Ïà¹Ø´úÂëÈçÏ£º

ͼ2-3
Ò²¾ÍÊÇ˵ÄÚ´æµÄÉêÇëºÍÊͷűØÐëÔÚͬһÏß³ÌÉÏÏÂÎÄÖУ¬²»ÄÜ¿çÏ̡߳£¿çÏß³ÌÖ®ºóʵ¼Ê²Ù×÷µÄ¾Í²»ÊÇͬһ¿é¶ùÄÚ´æÇøÓò£¬Õâ»áµ¼ÖºܶàÑÏÖØµÄÎÊÌ⣬ÄÚ´æÐ¹Â¶±ãÊÇÆäÖÐÖ®Ò»¡£ÄÚ´æÔÚAÏß³ÌÉêÇ룬Çл»µ½BÏß³ÌÊÍ·Å£¬Êµ¼ÊÊÇÎÞ·¨ÕýÈ·»ØÊյġ£
3£üÎÊÌâ¸ùÒò
Netty 4ÐÞ¸ÄÁËNetty 3µÄÏß³ÌÄ£ÐÍ£ºÔÚNetty 3µÄʱºò£¬upstreamÊÇÔÚI/OÏß³ÌÀïÖ´Ðе쬶ødownstreamÊÇÔÚÒµÎñÏß³ÌÀïÖ´ÐС£µ±Netty´ÓÍøÂç¶Áȡһ¸öÊý¾Ý±¨Í¶µÝ¸øÒµÎñhandlerµÄʱºò£¬handlerÊÇÔÚI/OÏß³ÌÀïÖ´ÐУ»¶øµ±ÎÒÃÇÔÚÒµÎñÏß³ÌÖе÷ÓÃwriteºÍwriteAndFlushÏòÍøÂç·¢ËÍÏûÏ¢µÄʱºò,handlerÊÇÔÚÒµÎñÏß³ÌÀïÖ´ÐУ¬Ö±µ½×îºóÒ»¸öHeader handler½«ÏûϢдÈëµ½·¢ËͶÓÁÐÖУ¬ÒµÎñÏ̲߳ŷµ»Ø¡£
Netty4ÐÞ¸ÄÁËÕâһģÐÍ£¬ÔÚNetty 4Àïinbound(¶ÔÓ¦Netty 3µÄupstream)ºÍoutbound(¶ÔÓ¦Netty 3µÄdownstream)¶¼ÊÇÔÚNioEventLoop(I/OÏß³Ì)ÖÐÖ´ÐС£µ±ÎÒÃÇÔÚÒµÎñÏß³ÌÀïͨ¹ýChannelHandlerContext.write·¢ËÍÏûÏ¢µÄʱºò£¬Netty 4ÔÚ½«ÏûÏ¢·¢ËÍʼþµ÷¶Èµ½ChannelPipelineµÄʱºò£¬Ê×ÏȽ«´ý·¢Ë͵ÄÏûÏ¢·â×°³ÉÒ»¸öTask£¬È»ºó·Åµ½NioEventLoopµÄÈÎÎñ¶ÓÁÐÖУ¬ÓÉNioEventLoopÏß³ÌÒì²½Ö´ÐС£ºóÐøËùÓÐhandlerµÄµ÷¶ÈºÍÖ´ÐУ¬°üÀ¨ÏûÏ¢µÄ·¢ËÍ¡¢I/OʼþµÄ֪ͨ£¬¶¼ÓÉNioEventLoopÏ̸߳ºÔð´¦Àí¡£
ÔÚ±¾°¸ÀýÖУ¬ByteBufÔÚÒµÎñÏß³ÌÖÐÉêÇ룬ÔÚºóÐøµÄChannelHandlerÖÐÊÍ·Å£¬ChannelHandlerÊÇÓÉNettyµÄI/OÏß³Ì(EventLoop)Ö´Ðеģ¬Òò´ËÄÚ´æµÄÉêÇëºÍÊͷŲ»ÔÚͬһ¸öÏß³ÌÖУ¬µ¼ÖÂÄÚ´æÐ¹Â©¡£
Netty 3µÄI/Oʼþ´¦ÀíÁ÷³Ì£º

ͼ2-4 Netty 3µÄI/OÏß³ÌÄ£ÐÍ
Netty 4µÄI/OÏûÏ¢´¦ÀíÁ÷³Ì£º

ͼ2-5 Netty 4 I/OÏß³ÌÄ£ÐÍ
4£ü°¸Àý×ܽá
Netty 4.X°æ±¾ÐÂÔöµÄÄÚ´æ³ØÈ·Êµ·Ç³£¸ßЧ£¬µ«ÊÇÈç¹ûʹÓò»µ±Ôò»áµ¼Ö¸÷ÖÖÑÏÖØµÄÎÊÌâ¡£ÖîÈçÄÚ´æÐ¹Â¶ÕâÀàÎÊÌ⣬¹¦ÄܲâÊÔ²¢Ã»ÓÐÒì³££¬Èç¹ûÏà¹Ø½Ó¿ÚûÓнøÐÐѹ²â»òÕßÎȶ¨ÐÔ²âÊÔ¶øÖ±½ÓÉÏÏߣ¬Ôò»áµ¼ÖÂÑÏÖØµÄÏßÉÏÎÊÌâ¡£
ÄÚ´æ³ØPooledByteBufµÄʹÓý¨Ò飺
1£©ÉêÇëÖ®ºóÒ»¶¨Òª¼ÇµÃÊÍ·Å£¬Netty×ÔÉíSocket¶ÁÈ¡ºÍ·¢Ë͵ÄByteBufϵͳ»á×Ô¶¯ÊÍ·Å£¬Óû§²»ÐèÒª×ö¶þ´ÎÊÍ·Å£»Èç¹ûÓû§Ê¹ÓÃNettyµÄÄÚ´æ³ØÔÚÓ¦ÓÃÖÐ×öByteBufµÄ¶ÔÏó³ØÊ¹Óã¬ÔòÐèÒª×Ô¼ºÖ÷¶¯ÊÍ·Å£»
2£©±ÜÃâ´íÎóµÄÊÍ·Å£º¿çÏß³ÌÊÍ·Å¡¢Öظ´Êͷŵȶ¼ÊÇ·Ç·¨²Ù×÷£¬Òª±ÜÃâ¡£ÌØ±ðÊÇ¿çÏß³ÌÉêÇëºÍÊÍ·Å£¬ÍùÍù¾ßÓÐÒþ±ÎÐÔ£¬ÎÊÌⶨλÄѶȽϴó£»
3£©·ÀÖ¹ÒþʽµÄÉêÇëºÍ·ÖÅä£ºÖ®Ç°Ôø¾·¢Éú¹ýÒ»¸ö°¸Àý£¬ÎªÁ˽â¾öÄÚ´æ³Ø¿çÏß³ÌÉêÇëºÍÊÍ·ÅÎÊÌ⣬ÓÐÓû§¶ÔÄÚ´æ³Ø×öÁ˶þ´Î°ü×°£¬ÒÔʵÏÖ¶àÏ̲߳Ù×÷ʱ£¬ÄÚ´æÊ¼ÖÕÓɰü×°µÄ¹ÜÀíÏß³ÌÉêÇëºÍÊÍ·Å£¬ÕâÑù¿ÉÒÔÆÁ±ÎÓû§ÒµÎñÏß³ÌÄ£ÐͺͷÃÎÊ·½Ê½µÄ²îÒì¡£ËÖªÔËÐÐÒ»¶Îʱ¼äÖ®ºóÔٴη¢ÉúÁËÄÚ´æÐ¹Â¶£¬×îºó·¢ÏÖÔÀ´µ÷ÓÃByteBufµÄwrite²Ù×÷ʱ£¬Èç¹ûÄÚ´æÈÝÁ¿²»×㣬»á×Ô¶¯½øÐÐÈÝÁ¿À©Õ¹¡£À©Õ¹²Ù×÷ÓÉÒµÎñÏß³ÌÖ´ÐУ¬Õâ¾ÍÈÆ¹ýÁËÄÚ´æ³Ø¹ÜÀíỊ̈߳¬·¢ÉúÁË¡°ÒýÓÃÌÓÒÝ¡±£»
4£©±ÜÃâ¿çÏß³ÌÉêÇëºÍʹÓÃÄÚ´æ³Ø£¬ÓÉÓÚ´æÔÚ¡°ÒýÓÃÌÓÒÝ¡±µÈÒþʽµÄÄÚ´æ´´½¨£¬Êµ¼ÊÉÏ¿çÏß³ÌÉêÇëºÍʹÓÃÄÚ´æ³ØÊǷdz£Î£ÏÕµÄÐÐΪ¡£¾¡¹Ü´Ó¼¼Êõ½Ç¶È¿´¿ÉÒÔʵÏÖÒ»¸ö¿çÏß³Ìе÷µÄÄÚ´æ³Ø»úÖÆ£¬ÉõÖÁÖØÐ´PooledByteBufAllocator£¬µ«ÊÇÕâÎÞÒÉ»áÔö¼ÓºÜ¶à¸´ÔÓÐÔ£¬Í¨³£Ò²Ê¹Óò»µ½¡£Èç¹ûȷʵ´æÔÚ¿çÏ̵߳ÄByteBuf´«µÝ£¬¶øÇÒÎÞ·¨±£Ö¤ByteBufÔÚÁíÒ»¸öÏß³ÌÖлáÖØÐ·ÖÅä´óСµÈ²Ù×÷£¬×î¼òµ¥±£Ïյķ½Ê½¾ÍÊÇÔÚÏß³ÌÇл»µã×öÒ»´ÎByteBufµÄ¿½±´£¬µ«Õâ»áÔì³ÉÐÔÄÜϽµ¡£
±È½ÏºÃµÄÒ»ÖÖ·½°¸¾ÍÊÇÈç¹û´æÔÚ¿çÏ̵߳ÄByteBuf´«µÝ£¬¶ÔByteBufµÄд²Ù×÷ÒªÔÚ·ÖÅäÏß³ÌÍê³É£¬ÁíÒ»¸öÏß³ÌÖ»ÄÜ×ö¶Á²Ù×÷¡£²Ù×÷Íê³ÉÖ®ºó·¢ËÍÒ»¸öʼþ֪ͨ·ÖÅäỊ̈߳¬ÓÉ·ÖÅäÏß³ÌÖ´ÐÐÄÚ´æÊͷŲÙ×÷¡£
Netty 3 °æ±¾Éý¼¶ÐÔÄÜϽµ°¸Àý
1£üÎÊÌâÃèÊö
ÒµÎñ´úÂëÉý¼¶Netty 3µ½Netty4Ö®ºó£¬²¢Ã»Óиø²úÆ·´øÀ´Ô¤ÆÚµÄÐÔÄÜÌáÉý£¬ÓÐЩÉõÖÁ»¹·¢ÉúÁ˷dz£ÑÏÖØµÄÐÔÄÜϽµ£¬ÕâÓëNetty ¹Ù·½¸ø³öµÄÊý¾Ý²¢²»Ò»Ö¡£
Netty ¹Ù·½ÐÔÄܲâÊÔ¶Ô±ÈÊý¾Ý£ºÎÒÃDZȽÏÁËÁ½¸ö·Ö±ð½¨Á¢ÔÚNetty 3ºÍ4»ù´¡ÉÏechoÐÒé·þÎñÆ÷¡££¨Echo·Ç³£¼òµ¥£¬ÕâÑù£¬ÈκÎÀ¬»øµÄ²úÉú¶¼ÊÇNettyµÄÔÒò£¬¶ø²»ÊÇÐÒéµÄÔÒò£©¡£ÎÒʹËüÃÇ·þÎñÓÚÏàͬµÄ·Ö²¼Ê½echoÐÒé¿Í»§¶Ë£¬À´×ÔÕâЩ¿Í»§¶ËµÄ16384¸ö²¢·¢Á¬½ÓÖØ¸´·¢ËÍ256×Ö½ÚµÄËæ»ú¸ºÔØ£¬¼¸ºõʹǧÕ×ÒÔÌ«Íø±¥ºÍ¡£
¸ù¾Ý²âÊÔ½á¹û£¬Netty 4£º
- GCÖÐ¶ÏÆµÂÊÊÇÔÀ´µÄ1/5£º 45.5 vs. 9.2´Î/·ÖÖÓ
-
À¬»øÉú³ÉËÙ¶ÈÊÇÔÀ´µÄ1/5£º 207.11 vs 41.81 MiB/Ãë
2£üÎÊÌⶨλ
Ê×ÏÈͨ¹ýJMCµÈÐÔÄÜ·ÖÎö¹¤¾ß¶ÔÐÔÄÜÈÈµã½øÐзÖÎö£¬Ê¾ÀýÈçÏ£¨ÐÅÏ¢°²È«µÈÔÒò£¬Ö»¸ø³ö·ÖÎö¹ý³ÌʾÀý½ØÍ¼£©£º

ͼ3-1 ÐÔÄÜÈȵãÏ̶߳ÑÕ»
ͨ¹ý¶ÔÈȵ㷽·¨µÄ·ÖÎö£¬·¢ÏÖÔÚÏûÏ¢·¢Ë͹ý³ÌÖУ¬ÓÐÁ½´¦Èȵ㣺
- 1£©ÏûÏ¢·¢ËÍÐÔÄÜͳ¼ÆÏà¹ØHandler;
-
2£©±àÂëHandler¡£
¶ÔʹÓÃNetty 3°æ±¾µÄÒµÎñ²úÆ·½øÐÐÐÔÄܶԱȲâÊÔ£¬·¢ÏÖÉÏÊöÁ½¸öHandlerÒ²ÊÇÈȵ㷽·¨¡£¼ÈÈ»¶¼ÊÇÈȵ㣬ΪɶÇл»µ½Netty4Ö®ºóÐÔÄÜϽµÕâôÀ÷º¦ÄØ£¿
ͨ¹ý·½·¨µÄµ÷ÓÃÊ÷·ÖÎö·¢ÏÖÁËÁ½¸ö°æ±¾µÄ²îÒ죺ÔÚNetty 3ÖУ¬ÉÏÊöÁ½¸öÈȵ㷽·¨¶¼ÊÇÓÉÒµÎñÏ̸߳ºÔðÖ´ÐУ»¶øÔÚNetty 4ÖУ¬ÔòÊÇÓÉNioEventLoop(I/O)Ïß³ÌÖ´ÐС£¶ÔÓÚij¸öÁ´Â·£¬ÒµÎñÊÇÓµÓжà¸öÏ̵߳ÄÏ̳߳أ¬¶øNioEventLoopÖ»ÓÐÒ»¸ö£¬ËùÒÔÖ´ÐÐЧÂʸüµÍ£¬·µ»Ø¸ø¿Í»§¶ËµÄÓ¦´ðʱÑӾʹó¡£Ê±ÑÓÔö´óÖ®ºó£¬×ÔÈ»µ¼ÖÂϵͳ²¢·¢Á¿½µµÍ£¬ÐÔÄÜϽµ¡£
ÕÒ³öÎÊÌâ¸ùÒòÖ®ºó£¬Õë¶ÔNetty 4µÄÏß³ÌÄ£ÐͶÔÒµÎñ½øÐÐרÏîÓÅ»¯£¬½«ºÄʱµÄ±àÂëµÈ²Ù×÷Ç¨ÒÆµ½ÒµÎñÏß³ÌÖÐÖ´ÐУ¬ÎªI/OÏ̼߳õ¸º£¬ÐÔÄÜ´ïµ½Ô¤ÆÚ£¬Ô¶³¬¹ýÁËNetty 3Àϰ汾µÄÐÔÄÜ¡£
Netty 3µÄÒµÎñÏ̵߳÷¶ÈÄ£ÐÍͼÈçÏÂËùʾ£º³ä·ÖÀûÓÃÁËÒµÎñ¶àÏ̲߳¢ÐбàÂëºÍHandler´¦ÀíµÄÓÅÊÆ£¬ÖÜÆÚTÄÚ¿ÉÒÔ´¦ÀíNÌõÒµÎñÏûÏ¢£º

ͼ3-2 Netty 3 HandlerÖ´ÐÐÏß³ÌÄ£ÐÍ
Çл»µ½Netty 4Ö®ºó£¬ÒµÎñºÄʱHandler±»I/OÏ̴߳®ÐÐÖ´ÐУ¬Òò´ËÐÔÄÜ·¢Éú±È½Ï´óµÄϽµ£º

ͼ3-3 Netty 4 HandlerÖ´ÐÐÏß³ÌÄ£ÐÍ
3£üÎÊÌâ×ܽá
¸ÃÎÊÌâµÄ¸ùÒò»¹ÊÇÓÉÓÚNetty 4µÄÏß³ÌÄ£Ðͱä¸üÒýÆð£¬Ïß³ÌÄ£Ðͱä¸üÖ®ºó£¬²»½öÓ°ÏìÒµÎñµÄ¹¦ÄÜ£¬ÉõÖÁ¶ÔÐÔÄÜÒ²»áÔì³ÉºÜ´óµÄÓ°Ïì¡£
¶ÔNettyµÄÉý¼¶ÐèÒª´Ó¹¦ÄÜ¡¢¼æÈÝÐÔºÍÐÔÄܵȶà¸ö½Ç¶È½øÐÐ×ۺϿ¼ÂÇ£¬Çв»¿ÉÖ»¶¢×ÅAPI±ä¸üÕâ¸öÖ¥Â飬¶ø¶ªµôÁËÐÔÄÜÕâ¸öÎ÷¹Ï¡£APIµÄ±ä¸ü»áµ¼Ö±àÒë´íÎ󣬵«ÊÇÐÔÄÜϽµÈ´Òþ²ØÓÚÎÞÐÎÖ®ÖУ¬ÉÔ²»ÁôÒâ¾Í»áÖÐÕС£
¶ÔÓÚ½²¾¿¿ìËÙ½»¸¶¡¢Ãô½Ý¿ª·¢ºÍ»Ò¶È·¢²¼µÄ»¥ÁªÍøÓ¦Óã¬Éý¼¶µÄʱºò¸üÓ¦¸ÃÒªµ±ÐÄ¡£
NettyÒµÎñHandler½ÓÊÕ²»µ½ÏûÏ¢°¸Àý
1£üÎÊÌâÃèÊö
ÎҵķþÎñÅöµ½Ò»¸öÎÊÌ⣬¾³£ÓÐÇëÇóÉÏÀ´µ½MessageDecoder¾Í½áÊøÁË£¬Ã»ÓмÌÐøÍùLogicServerHandlerÀïÃæËÍ£¬¾õµÃºÜÆæ¹Ö£¬ÊDz»ÊÇÏ̳߳ØÂúÁË£¿ÎÒÏëÇë½Ì£º
1£©netty 5ÈçºÎ´òÓ¡executorÏ̵߳ÄÕ¼ÓÃÇé¿ö£¬Èç¿ÕÏÐÏß³ÌÊý£¿
2£©executorÉèÖõĴóСһ°ãÈçºÎ½øÐмÆËãµÄ£¿
ÒµÎñ´úÂëʾÀýÈçÏ£º

2£üÎÊÌⶨλ
´Ó·þÎñ¶Ë³õʼ»¯´úÂëÀ´¿´£¬²¢Ã»ÓÐʲôÎÊÌ⣬ҵÎñLogicServerHandlerûÓнÓÊÕµ½ÏûÏ¢£¬ÓÐÈçϼ¸ÖÖ¿ÉÄÜ£º
1£©¿Í»§¶Ë²¢Ã»Óн«ÏûÏ¢·¢Ë͵½·þÎñ¶Ë£¬¿ÉÒÔÔÚ·þÎñ¶ËLoggingHandlerÖдòÓ¡ÈÕÖ¾²é¿´£»
2£©·þÎñ¶Ë²¿·ÖÏûÏ¢½âÂë·¢ÉúÒì³££¬µ¼ÖÂÏûÏ¢±»¶ªÆú/ºöÂÔ£¬Ã»ÓÐ×ßµ½LogicServerHandlerÖУ»
3£©Ö´ÐÐÒµÎñHandlerµÄDefaultEventExecutorÖеÄÏß³ÌÌ«·±Ã¦£¬µ¼ÖÂÈÎÎñ¶ÓÁлýѹ£¬³¤Ê±¼äµÃ²»µ½´¦Àí¡£
ͨ¹ý×¥°ü½áºÏÈÕÖ¾·ÖÎö£¬¿ÉÄܵ¼ÖÂÎÊÌâµÄÔÒò1ºÍ2Åųý£¬ÐèÒª¼ÌÐø¶Ô¿ÉÄÜÔÒò3½øÐÐÅŲ顣
Netty 5ÈçºÎ´òÓ¡executorÏ̵߳ÄÕ¼ÓÃÇé¿ö£¬Èç¿ÕÏÐÏß³ÌÊý£¿»Ø´ðÕâЩÎÊÌ⣬Ê×ÏÈÒªÁ˽âNettyµÄÏß³Ì×éºÍÏ̳߳ػúÖÆ¡£
NettyµÄEventExecutorGroupʵ¼Ê¾ÍÊÇÒ»×éEventExecutor£¬ËüµÄ¶¨ÒåÈçÏ£º

ͨ³£Í¨¹ýËüµÄnext·½·¨´ÓÏß³Ì×éÖлñȡһ¸öÏ̳߳أ¬´úÂëÈçÏ£º

Netty EventExecutorµÄµäÐÍʵÏÖÓÐÁ½¸ö£ºDefaultEventExecutorºÍSingleThreadEventLoop£¬ÔÚ±¾°¸ÀýÖУ¬ÒòΪʹÓõÄÊÇDefaultEventExecutorGroup£¬ËùÒÔʵ¼ÊÖ´ÐÐÒµÎñHandlerµÄÏ̳߳ؾÍÊÇDefaultEventExecutor£¬Ëü¼Ì³Ð×ÔSingleThreadEventExecutor£¬´ÓÃû³Æ¾Í¿ÉÒÔ¿´³öËüÊǸöµ¥Ï̵߳ÄÏ̳߳ء£ËüµÄ¹¤×÷ÔÀíÈçÏ£º
1£©DefaultEventExecutor¾ÛºÏJDKµÄExecutorºÍThread, Ê×´ÎÖ´ÐÐTaskµÄʱºòÆô¶¯Ị̈߳¬½«Ï̳߳Ø×´Ì¬ÐÞ¸ÄΪÔËÐÐ̬£»
2£©Thread run·½·¨Ñ»·´Ó¶ÓÁÐÖлñÈ¡TaskÖ´ÐУ¬Èç¹û¶ÓÁÐΪ¿Õ£¬Ôòͬ²½×èÈû£¬Ïß³ÌÎÞÏÞÑ»·Ö´ÐУ¬Ö±µ½½ÓÊÕµ½Í˳öÐźš£

ͼ4-1 DefaultEventExecutor¹¤×÷ÔÀí
Óû§Ïëͨ¹ýNettyÌṩµÄDefaultEventExecutorGroupÀ´²¢·¢Ö´ÐÐÒµÎñHandler£¬µ«Êµ¼ÊÉÏÈ´Êǵ¥Ïß³ÌSingleThreadEventExecutorÔÚ´®ÐÐÖ´ÐÐÒµÎñÂß¼£¬µ±·þÎñ¶ËÏûÏ¢½ÓÊÕËٶȳ¬¹ýÒµÎñÂß¼Ö´ÐÐËÙ¶Èʱ£¬¾Í»áµ¼ÖÂÒµÎñÏûÏ¢»ýѹÔÚSingleThreadEventExecutorµÄÏûÏ¢¶ÓÁÐÖеò»µ½¼°Ê±´¦Àí£¬ÏÖÏó¾ÍÊÇÒµÎñHandlerºÃÏñµÃ²»µ½Ö´ÐУ¬²¿·ÖÒµÎñÏûÏ¢¶ªÊ§¡£
½²½âÍêNettyÏß³ÌÄ£Ðͺó£¬ÎÊÌâÔÒòÒ²¶¨Î»³öÀ´ÁË¡£ÆäʵÎÒÃÇ·¢ÏÖ£¬¿ÉÒÔͨ¹ýEventExecutor»ñÈ¡EventExecutorGroupµÄÐÅÏ¢£¬È»ºó»ñÈ¡Õû¸öEventExecutorÏß³Ì×éÐÅÏ¢£¬×îºó´òÓ¡Ï̸߳ºÔØÐÅÏ¢£¬´úÂëÈçÏ£º

Ö´Ðнá¹ûÈçÏ£º

3£üÎÊÌâ×ܽá
ÊÂʵÉÏ£¬NettyΪÁË·ÀÖ¹¶àÏß³ÌÖ´ÐÐij¸öHandler£¨Channel£©ÒýÆðḬ̈߳²È«ÎÊÌ⣬ʵ¼ÊÖ»ÓÐÒ»¸öÏ̻߳áÖ´ÐÐij¸öHandler£¬´úÂëÈçÏ£º

ÐèÒªÖ¸³öµÄÊÇ£¬SingleThreadEventExecutorµÄpendingTasks¿ÉÄÜÊǸöºÄʱµÄ²Ù×÷£¬Òò´Ëµ÷ÓõÄʱºòÐèҪעÒ⣺

ʵ¼Ê¾ÍÏñJDKµÄÏ̳߳أ¬²»Í¬µÄÒµÎñ³¡¾°¡¢Ó²¼þ»·¾³ºÍÐÔÄܱê¾Í»áÓв»Í¬µÄÅäÖã¬ÎÞ·¨¸ø³ö±ê×¼µÄ´ð°¸¡£ÐèÒª½øÐÐʵ¼Ê²âÊÔ¡¢ÆÀ¹ÀºÍµ÷ÓÅÀ´Áé»îµ÷Õû¡£
×îºóÔÙ×Ü½á»Ø¹ËÏÂÎÊÌ⣬¶ÔÓÚ°¸ÀýÖеĴúÂ룬ʵ¼ÊÉÏÔÚʹÓõ¥Ï̴߳¦Àíij¸öHandlerµÄLogicServerHandler£¬×÷Õß¿ÉÄÜÏë²¢·¢¶àÏß³ÌÖ´ÐÐÕâ¸öHandler£¬ÌáÉýÒµÎñ´¦ÀíÐÔÄÜ£¬µ«Êµ¼Ê²¢Ã»ÓдﵽÉè¼ÆÐ§¹û¡£
Èç¹ûÒµÎñÐÔÄÜ´æÔÚÎÊÌ⣬²¢²»Ææ¹Ö£¬ÒòΪҵÎñʵ¼ÊÊǵ¥Ï̴߳®Ðд¦ÀíµÄ£¡µ±È»£¬Èç¹ûÒµÎñ´æÔÚ¶à¸öChannel£¬Ôòÿ¸ö/¶à¸öChannel»á¶ÔÓ¦Ò»¸öỊ̈߳¨³Ø£©£¬Ò²¿ÉÒÔʵÏÖ¶àÏ̴߳¦Àí£¬ÕâÈ¡¾öÓÚ¿Í»§¶ËµÄ½ÓÈëÊý¡£
°¸ÀýÖдúÂëµÄÏ̴߳¦ÀíÄ£ÐÍÈçÏÂËùʾ£¨µ¥¸öÁ´Â·Ä£ÐÍ£©£º

ͼ4-3 µ¥Ïß³ÌÖ´ÐÐÒµÎñÂß¼Ïß³ÌÄ£ÐÍͼ
Netty 4 ChannelHandlerḬ̈߳²È«ÒÉÎÊ
1£üÎÊÌâ×Éѯ
ÎÒÓÐÒ»¸ö·ÇḬ̈߳²È«µÄÀàThreadUnsafeClass£¬Õâ¸öÀà»áÔÚchannelRead·½·¨Öб»µ÷Óá£ÎÒÏÂÃæÕâÑùµÄµ÷Ó÷½·¨ÔÚ¶àÏ̻߳·¾³Ï°²È«Âð£¿Ð»Ð»£¡
´úÂëʾÀýÈçÏ£º

2£ü½â´ð
Netty 4ÓÅ»¯ÁËNetty 3µÄÏß³ÌÄ£ÐÍ£¬ÆäÖÐÒ»¸ö·Ç³£´óµÄÓÅ»¯¾ÍÊÇÓû§²»ÐèÒªÔÙµ£ÐÄChannelHandler»á±»²¢·¢µ÷Óã¬×ܽáÈçÏ£º
- 1£©ChannelHandler'sµÄ·½·¨²»»á±»Netty²¢·¢µ÷Óã»
-
2£©Óû§²»ÔÙÐèÒª¶ÔChannelHandlerµÄ¸÷¸ö·½·¨×öͬ²½±£»¤£»
-
3£©ChannelHandlerʵÀý²»ÔÊÐí±»¶à´ÎÌí¼Óµ½ChannelPipleÖУ¬·ñÔòḬ̈߳²È«½«µÃ²»µ½±£Ö¤¡£
¸ù¾ÝÉÏÊö·ÖÎö£¬MyHandlerµÄchannelRead·½·¨²»»á±»²¢·¢µ÷Óã¬Òò´Ë²»´æÔÚḬ̈߳²È«ÎÊÌâ¡£
3£üÒ»Ð©ÌØÀý
ChannelHandlerµÄḬ̈߳²È«´æÔÚ¼¸¸öÌØÀý£¬×ܽáÈçÏ£º
1£©Èç¹ûChannelHandler±»×¢½âΪ @Sharable£¬È«¾ÖÖ»ÓÐÒ»¸öhandlerʵÀý£¬Ëü»á±»¶à¸öChannelµÄPipeline¹²Ïí£¬»á±»¶àÏ̲߳¢·¢µ÷Óã¬Òò´ËËü²»ÊÇḬ̈߳²È«µÄ£»
2£©Èç¹û´æÔÚ¿çChannelHandlerµÄʵÀý¼¶±äÁ¿¹²Ïí£¬ÐèÒªÌØ±ð×¢Ò⣬Ëü¿ÉÄܲ»ÊÇḬ̈߳²È«µÄ¡£
·ÇḬ̈߳²È«µÄ¿çChannelHandler±äÁ¿ÔÀíÈçÏ£º

ͼ5-1 ´®Ðе÷Óã¬Ḭ̈߳²È«
NettyÖ§³ÖÔÚÌí¼ÓChannelHandlerµÄʱºò£¬Ö¸¶¨Ö´ÐиÃHandlerµÄEventExecutorGroup£¬Õâ¾ÍÒâζ×ÅÔÚÕû¸öChannelPipelineÖ´Ðйý³ÌÖУ¬¿ÉÄܻᷢÉúÏß³ÌÇл»¡£´Ëʱ£¬Èç¹ûͬһ¸ö¶ÔÏóÔÚ¶à¸öChannelHandlerÖб»¹²Ïí£¬¿ÉÄܻᱻ¶àÏ̲߳¢·¢²Ù×÷£¬ÔÀíÈçÏ£º

ͼ5-2 ²¢Ðе÷Ó㬶àHandler¹²Ïí³ÉÔ±±äÁ¿£¬·ÇḬ̈߳²È«
|