Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
NettyÔ­Àí¼Ü¹¹½âÎö
 
  3076  次浏览      30
 2019-9-20
 
±à¼­ÍƼö:

±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾ÎÄÖ÷Òª½éÉÜÁ˹ØÓÚNettyµÄÔ­Àí¼Ü¹¹½âÎö£¬½éÉܵÄNetty Reactor Ä£ÐÍÒÔ¼°·þÎñ¶Ë Netty µÄ¹¤×÷¼Ü¹¹£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£

NettyÊÇÒ»¸öÒ첽ʼþÇý¶¯µÄÍøÂçÓ¦ÓóÌÐò¿ò¼Ü£¬ÓÃÓÚ¿ìËÙ¿ª·¢¿Éά»¤µÄ¸ßÐÔÄÜЭÒé·þÎñÆ÷ºÍ¿Í»§¶Ë¡£JDKÔ­ÉúÒ²ÓÐÒ»Ì×ÍøÂçÓ¦ÓóÌÐòAPI£¬NIO£¬µ«ÊÇ´æÔÚһЩÎÊÌâʹµÃÓÃÆðÀ´²»ÊǺܷ½±ã£¬Ö÷ÒªÈçÏ£º

NIOµÄÀà¿âºÍAPI·±ÔÓ£¬Ê¹ÓÃÂé·³¡£Ê¹ÓÃʱÐèÒªÊìÁ·ÕÆÎÕSelector¡¢ServerSocketChannel¡¢SocketChannel¡¢ByteBufferµÈ

ÐèÒª¾ß±¸ÆäËûµÄ¶îÍâ¼¼ÄÜ×öÆÌµæ¡£ÀýÈçÊìϤJava¶àÏ̱߳à³Ì£¬ÒòΪNIO±à³ÌÉæ¼°µ½Reactorģʽ£¬Äã±ØÐë¶Ô¶àÏ̺߳ÍÍøÂç±à³Ì·Ç³£ÊìϤ£¬²ÅÄܱàд³ö¸ßÖÊÁ¿µÄNIO³ÌÐò

¿É¿¿ÐÔÄÜÁ¦²¹Æë£¬¿ª·¢¹¤×÷Á¿ºÍÄѶȶ¼·Ç³£´ó¡£ÀýÈç¿Í»§¶ËÃæÁÙ¶ÏÁ¬ÖØÁ¬¡¢ÍøÂçÉÁ¶Ï¡¢°ë°ü¶Áд¡¢Ê§°Ü»º´æ¡¢ÍøÂçÓµÈûºÍÒì³£ÂëÁ÷µÄ´¦ÀíµÈµÈ¡£NIO±à³ÌµÄÌØµãÊǹ¦ÄÜ¿ª·¢Ïà¶ÔÈÝÒ×£¬µ«Êǿɿ¿ÐÔÄÜÁ¦²¹Æë¹¤×÷Á¿ºÍÄѶȶ¼·Ç³£´ó

JDK NIOµÄBug¡£ÀýÈç³ôÃûÕÑÖøµÄEpoll Bug£¬Ëü»áµ¼ÖÂSelector¿ÕÂÖѯ£¬×îÖÕµ¼ÖÂCPU 100%¡£¹Ù·½Éù³ÆÔÚJDK 1.6°æ±¾µÄupdate 18ÐÞ¸´Á˸ÃÎÊÌ⣬µ«ÊÇÖ±µ½JDK1.7°æ±¾¸ÃÎÊÌâÈԾɴæÔÚ£¬Ö»²»¹ý¸ÃBug·¢Éú¸ÅÂʽµµÍÁËһЩ¶øÒÑ£¬Ëü²¢Ã»Óб»¸ù±¾½â¾ö

Netty¶ÔJDK×Ô´øµÄNIOµÄAPI½øÐзâ×°£¬½â¾öÉÏÊöÎÊÌ⣬Ö÷ÒªÌØµãÓУº

Éè¼ÆÓÅÑÅ£¬ÊÊÓÃÓÚ¸÷ÖÖ´«ÊäÀàÐ͵ÄͳһAPI×èÈûºÍ·Ç×èÈûSocket£»»ùÓÚÁé»îÇÒ¿ÉÀ©Õ¹µÄʼþÄ£ÐÍ£¬¿ÉÒÔÇåÎúµØ·ÖÎö¹Ø×¢µã£»¸ß¶È¿É¶¨ÖƵÄÏß³ÌÄ£ÐÍ-µ¥Ị̈߳¬Ò»¸ö»ò¶à¸öÏ̳߳أ»ÕæÕýµÄÎÞÁ¬½ÓÊý¾Ý±¨Ì×½Ó×ÖÖ§³Ö

ʹÓ÷½±ã£¬Ïêϸ¼Ç¼µÄJavadoc£¬Óû§Ö¸ÄϺÍʾÀý£»Ã»ÓÐÆäËûÒÀÀµÏJDK5£¨Netty3.x£©»ò6 (Netty4.x) ¾Í×ã¹»ÁË

¸ßÐÔÄÜ£¬ÍÌÍÂÁ¿¸ü¸ß£¬ÑÓ³Ù¸üµÍ£»¼õÉÙ×ÊÔ´ÏûºÄ£»×îС»¯²»±ØÒªµÄÄÚ´æ¸´ÖÆ

°²È«£¬ÍêÕûµÄSSL/TLSºÍStartTLSÖ§³Ö

ÉçÇø»îÔ¾£¬²»¶Ï¸üУ¬ÉçÇø»îÔ¾£¬°æ±¾µü´úÖÜÆÚ¶Ì£¬·¢ÏÖµÄBug¿ÉÒÔ±»¼°Ê±ÐÞ¸´£¬Í¬Ê±£¬¸ü¶àµÄй¦Äܻᱻ¼ÓÈë

Netty³£¼ûµÄʹÓó¡¾°ÈçÏ£º

»¥ÁªÍøÐÐÒµ¡£ÔÚ·Ö²¼Ê½ÏµÍ³ÖУ¬¸÷¸ö½ÚµãÖ®¼äÐèÒªÔ¶³Ì·þÎñµ÷Ó㬸ßÐÔÄܵÄRPC¿ò¼Ü±Ø²»¿ÉÉÙ£¬Netty×÷ΪÒì²½¸ßÐÔÄܵÄͨÐÅ¿ò¼Ü£¬ÍùÍù×÷Ϊ»ù´¡Í¨ÐÅ×é¼þ±»ÕâЩRPC¿ò¼ÜʹÓᣵäÐ͵ÄÓ¦ÓÃÓУº°¢Àï·Ö²¼Ê½·þÎñ¿ò¼ÜDubboµÄRPC¿ò¼ÜʹÓÃDubboЭÒé½øÐнڵã¼äͨÐÅ£¬DubboЭÒéĬÈÏʹÓÃNetty×÷Ϊ»ù´¡Í¨ÐÅ×é¼þ£¬ÓÃÓÚʵÏÖ¸÷½ø³Ì½ÚµãÖ®¼äµÄÄÚ²¿Í¨ÐÅ

ÓÎÏ·ÐÐÒµ¡£ÎÞÂÛÊÇÊÖÓηþÎñ¶Ë»¹ÊÇ´óÐ͵ÄÍøÂçÓÎÏ·£¬JavaÓïÑԵõ½ÁËÔ½À´Ô½¹ã·ºµÄÓ¦Óá£Netty×÷Ϊ¸ßÐÔÄܵĻù´¡Í¨ÐÅ×é¼þ£¬Ëü±¾ÉíÌṩÁËTCP/UDPºÍHTTPЭÒéÕ»¡£·Ç³£·½±ã¶¨ÖƺͿª·¢Ë½ÓÐЭÒéÕ»£¬Õ˺ŵǼ·þÎñÆ÷£¬µØÍ¼·þÎñÆ÷Ö®¼ä¿ÉÒÔ·½±ãµÄͨ¹ýNetty½øÐиßÐÔÄܵÄͨÐÅ

´óÊý¾ÝÁìÓò¡£¾­µäµÄHadoopµÄ¸ßÐÔÄÜͨÐźÍÐòÁл¯×é¼þAvroµÄRPC¿ò¼Ü£¬Ä¬ÈϲÉÓÃNetty½øÐпç½ÚµãͨÐÅ£¬ËüµÄNetty Service»ùÓÚNetty¿ò¼Ü¶þ´Î·âװʵÏÖ

Netty×ÔÒÔΪÒ첽ʼþÇý¶¯µÄÍøÂ磬¸ßÐÔÄÜÖ®´¦Ö÷ÒªÀ´×ÔÓÚÆäI/OÄ£ÐͺÍÏ̴߳¦ÀíÄ£ÐÍ£¬Ç°Õß¾ö¶¨ÈçºÎÊÕ·¢Êý¾Ý£¬ºóÕß¾ö¶¨ÈçºÎ´¦ÀíÊý¾Ý

×èÈûI/O

´«Í³×èÈûI/O£¨BIO£©µÄÌØµãÊÇ£º

ÿ¸öÇëÇó¶¼ÐèÒª¶ÀÁ¢µÄÏß³ÌÍê³ÉÊý¾Ýread£¬ÒµÎñ´¦Àí£¬Êý¾ÝwriteµÄÍêÕû²Ù×÷ÎÊÌâ

µ±²¢·¢Êý½Ï´óʱ£¬ÐèÒª´´½¨´óÁ¿Ïß³ÌÀ´´¦ÀíÁ¬½Ó£¬ÏµÍ³×ÊÔ´Õ¼Óýϴó

Á¬½Ó½¨Á¢ºó£¬Èç¹ûµ±Ç°Ïß³ÌÔÝʱûÓÐÊý¾Ý¿É¶Á£¬ÔòÏ߳̾Í×èÈûÔÚreadÉÏ£¬Ôì³ÉÏß³Ì×ÊÔ´ÀË·Ñ

I/O¸´ÓÃÄ£ÐÍ

ÔÚI/O¸´ÓÃÄ£ÐÍÖУ¬»áÓõ½select£¬Õâ¸öº¯ÊýÒ²»áʹ½ø³Ì×èÈû£¬µ«ÊǺÍ×èÈûI/OËù²»Í¬µÄÊÇÕâ¸öº¯Êý¿ÉÒÔÔÚÒ»¸öÏß³ÌÖÐͬʱ×èÈû¶à¸öI/O²Ù×÷£¬¶øÇÒ¿ÉÒÔͬʱ¶Ô¶à¸ö¶Á²Ù×÷£¬¶à¸öд²Ù×÷µÄI/Oº¯Êý½øÐмì²â£¬Ö±µ½ÓÐÊý¾Ý¿É¶Á»ò¿Éдʱ£¬²ÅÕæÕýµ÷ÓÃI/Oº¯Êý¡£NettyµÄ·Ç×èÈûI/OµÄʵÏֹؼüÊÇ»ùÓÚI/O¸´ÓÃÄ£ÐÍ£¬ÕâÀïÓÃselector¶ÔÏó±íʾ¡£

NettyµÄIOÏß³ÌNioEventLoopÓÉÓÚ¾ÛºÏÁ˶à·¸´ÓÃÆ÷Selector£¬¿ÉÒÔͬʱ²¢·¢´¦Àí³É°ÙÉÏǧ¸ö¿Í»§¶ËÁ¬½Ó¡£

µ±Ï̴߳Óij¿Í»§¶ËSocketͨµÀ½øÐжÁдÊý¾Ýʱ£¬ÈôûÓÐÊý¾Ý¿ÉÓÃʱ£¬¸ÃÏ߳̿ÉÒÔ½øÐÐÆäËûÈÎÎñ

Ïß³Ìͨ³£½«·Ç×èÈûIOµÄ¿ÕÏÐʱ¼äÓÃÓÚÔÚÆäËûͨµÀÉÏÖ´ÐÐIO²Ù×÷£¬ËùÒÔµ¥¶ÀµÄÏ߳̿ÉÒÔ¹ÜÀí¶à¸öÊäÈëºÍÊä³öͨµÀ

ÓÉÓÚ¶Áд²Ù×÷¶¼ÊÇ·Ç×èÈûµÄ£¬Õâ¾Í¿ÉÒÔ³ä·ÖÌáÉýIOÏ̵߳ÄÔËÐÐЧÂÊ£¬±ÜÃâÓÉÓÚÆµ·±IO×èÈûµ¼ÖµÄÏß³Ì¹ÒÆð

Ò»¸öI/OÏ߳̿ÉÒÔ²¢·¢´¦ÀíN¸ö¿Í»§¶ËÁ¬½ÓºÍ¶Áд²Ù×÷£¬Õâ´Ó¸ù±¾ÉϽâ¾öÁË´«Í³Í¬²½×èÈûI/O-Á¬½Ó-Ïß³ÌÄ£ÐÍ£¬¼Ü¹¹µÄÐÔÄÜ¡¢µ¯ÐÔÉìËõÄÜÁ¦ºÍ¿É¿¿ÐÔ¶¼µÃµ½Á˼«´óµÄÌáÉý

»ùÓÚBuffer

´«Í³µÄIOÊÇÃæÏò×Ö½ÚÁ÷»î×Ö·ûÁ÷µÄ£¬ÒÔÁ÷ʽµÄ·½Ê½Ë³ÐòµØ´ÓÒ»¸östreamÖжÁȡһ¸ö»ò¶à¸ö×Ö½Ú£¬Òò´ËÒ²¾Í²»ÄÜËæÒâ¸Ä±ä¶ÁȡָÕëµÄλÖÃ

ÔÚNIOÖУ¬ÅׯúÁË´«Í³µÄIOÁ÷£¬£¬¶øÊÇÒýÈëÁËChannelºÍBufferµÄ¸ÅÄî¡£ÔÚNIOÖУ¬Ö»ÄÜ´ÓchannelÖжÁÈ¡Êý¾Ýµ½BufferÖлò½«Êý¾Ý´ÓBufferÖÐдÈëµ½channelÖÐ

»ùÓÚBuffer²Ù×÷²»Ïñ´«Í³IOµÄ˳Ðò²Ù×÷£¬NIOÖпÉÒÔËæÒâµØ¶ÁÈ¡ÈÎÒâλÖõÄÊý¾Ý

ʼþÇý¶¯Ä£ÐÍ

ͨ³££¬ÎÒÃÇÉè¼ÆÒ»¸öʼþ´¦ÀíÄ£Ð͵ijÌÐòÓÐÁ½ÖÖ˼·£º

ÂÖѯ·½Ê½£¬Ï̲߳»¶ÏÂÖѯ·ÃÎÊÏà¹ØÊ¼þ·¢ÉúÔ´ÓÐûÓз¢Éúʼþ£¬Óз¢Éúʼþ¾Íµ÷ÓÃʼþ´¦ÀíÂß¼­

ʼþÇý¶¯·½Ê½£¬·¢Éúʼþ£¬Ö÷Ḭ̈߳Éʼþ·ÅÈëʼþ¶ÓÁУ¬ÔÚÁíÍâÏ̲߳»¶ÏÑ­»·Ïû·ÑʼþÁбíÖеÄʼþ£¬µ÷ÓÃʼþ¶ÔÓ¦µÄ´¦ÀíÂß¼­´¦Àíʼþ¡£Ê¼þÇý¶¯·½Ê½Ò²±»³ÉΪÏûϢ֪ͨ·½Ê½£¬ÆäʵÊÇÉè¼ÆÄ£Ê½ÖеĹ۲ìÕßģʽµÄ˼·

Ö÷Òª°üÀ¨4¸ö×é¼þ£º

ʼþ¶ÓÁУº½ÓÊÕʼþµÄÈë¿Ú£¬´æ´¢´ý´¦Àíʼþ

·Ö·¢Æ÷£º½«²»Í¬µÄʼþ·Ö·¢µ½²»Í¬µÄÒµÎñÂß¼­µ¥Ôª

ʼþͨµÀ£º·Ö·¢Æ÷Óë´¦ÀíÆ÷Ö®¼äµÄÁªÏµÇþµÀ

ʼþ´¦ÀíÆ÷£ºÊµÏÖÒµÎñÂß¼­£¬´¦ÀíÍê³Éºó»á·¢³öʼþ£¬´¥·¢ÏÂÒ»²½²Ù×÷

¿ÉÒÔ¿´³ö£¬Ïà¶Ô´«Í³ÂÖѯģʽ£¬Ê¼þÇý¶¯ÓÐÈçÏÂÓŵ㣺

¿ÉÀ©Õ¹ÐԺ㬷ֲ¼Ê½µÄÒì²½¼Ü¹¹£¬Ê¼þ´¦ÀíÆ÷Ö®¼ä¸ß¶È½âñ¿ÉÒÔ·½±ãÀ©Õ¹Ê¼þ´¦ÀíÂß¼­

¸ßÐÔÄÜ£¬»ùÓÚ¶ÓÁÐÔÝ´æÊ¼þ£¬ÄÜ·½±ã²¢ÐÐÒì²½´¦Àíʼþ

ReactorÏß³ÌÄ£ÐÍ

ReactorÊÇ·´Ó¦¶ÑµÄÒâ˼£¬ReactorÄ£ÐÍÊÇָͨ¹ýÒ»¸ö»ò¶à¸öÊäÈëͬʱ´«µÝ¸ø·þÎñ´¦ÀíÆ÷µÄ·þÎñÇëÇóµÄʼþÇý¶¯´¦Àíģʽ

·þÎñ¶Ë³ÌÐò´¦Àí´«Èë¶à·ÇëÇ󣬲¢½«ËüÃÇͬ²½·ÖÅɸøÇëÇó¶ÔÓ¦µÄ´¦ÀíỊ̈߳¬ReactorģʽҲ½ÐDispatcherģʽ£¬¼´I/O¶à·¸´ÓÃͳһ¼àÌýʼþ£¬ÊÕµ½Ê¼þºó·Ö·¢(Dispatch¸øÄ³½ø³Ì)£¬ÊDZàд¸ßÐÔÄÜÍøÂç·þÎñÆ÷µÄ±Ø±¸¼¼ÊõÖ®Ò»

ReactorÄ£ÐÍÖÐÓÐ2¸ö¹Ø¼ü×é³É£º

Reactor£¬ÔÚÒ»¸öµ¥¶ÀµÄÏß³ÌÖÐÔËÐУ¬¸ºÔð¼àÌýºÍ·Ö·¢Ê¼þ£¬·Ö·¢¸øÊʵ±µÄ´¦Àí³ÌÐòÀ´¶ÔIOʼþ×÷³ö·´Ó¦¡£

Handlers£¬´¦Àí³ÌÐòÖ´ÐÐIOʼþÒªÍê³ÉµÄʵ¼Êʼþ£¬£¬reactorͨ¹ýµ÷ÓÃÊʵ±µÄ´¦Àí³ÌÐòÀ´ÏìÓ¦IOʼþ£¬´¦Àí³ÌÐòÖ´ÐзÇ×èÈû²Ù×÷

È¡¾öÓÚReactorµÄÊýÁ¿ºÍHandlerÏß³ÌÊýÁ¿µÄ²»Í¬£¬ReactorÄ£ÐÍÓÐ3¸ö±äÖÖ£º

µ¥reactor µ¥Ïß³Ì

µ¥reactor ¶àÏß³Ì

Ö÷´Óreactor ¶àÏß³Ì

NettyÏß³ÌÄ£ÐÍ

NettyÖ÷ÒªÊÇ»ùÓÚÖ÷´ÓReactors¶àÏß³ÌÄ£ÐÍ(ÈçÏÂͼ)×öÁËһЩÐ޸쬯äÖÐÖ÷´Óreactor¶àÏß³ÌÄ£ÐÍÓжà¸öreactor£º

MainReactor¸ºÔð¿Í»§¶ËµÄÁ¬½ÓÇëÇ󣬲¢½«ÇëÇóת½»¸øSubReactor

SubReactor¸ºÔðÏàӦͨµÀµÄIO¶ÁдÇëÇó

·ÇIOÇëÇó(¾ßÌåÂß¼­´¦Àí)µÄÈÎÎñÔò»áÖ±½Ó½øÈëдÈë¶ÓÁУ¬µÈµ½worker threads½øÐд¦Àí

ÕâÀïÒýÓÃDoug Lee´óÉñµÄReactor½éÉÜ£ºScalable IO in JavaÀïÃæ¹ØÓÚÖ÷´ÓReactor¶àÏß³ÌÄ£Ð͵Äͼ£º

ÌØ±ð˵Ã÷µÄÊÇ£ºËäÈ»NettyµÄÏß³ÌÄ£ÐÍ»ùÓÚÖ÷´ÓReactor¶àỊ̈߳¬½èÓÃÁËMainReactorºÍSubReactorµÄ½á¹¹¡£µ«ÊÇʵ¼ÊʵÏÖÉÏSubReactorºÍWorkerÏß³ÌÔÚͬһ¸öÏ̳߳ØÖÐ

bossGroupÏ̳߳ØÔòÖ»ÊÇÔÚbindij¸ö¶Ë¿Úºó£¬»ñµÃÆäÖÐÒ»¸öÏß³Ì×÷ΪMainReactor£¬×¨ÃÅ´¦Àí¶Ë¿ÚµÄAcceptʼþ£¬Ã¿¸ö¶Ë¿Ú¶ÔÓ¦Ò»¸öbossÏß³Ì

workerGroupÏ̳߳ػᱻ¸÷¸öSubReactorºÍWorkerÏ̳߳ä·ÖÀûÓÃ

Òì³£´¦Àí

Òì²½µÄ¸ÅÄîºÍͬ²½Ïà¶Ô¡£µ±Ò»¸öÒì²½¹ý³Ìµ÷Ó÷¢³öºó£¬µ÷ÓÃÕß²»ÄÜÁ¢¿ÌµÃµ½½á¹û¡£Êµ¼Ê´¦ÀíÕâ¸öµ÷ÓõIJ¿¼þÔÚÍê³Éºó£¬Í¨¹ý״̬¡¢Í¨ÖªºÍ»Øµ÷À´Í¨Öªµ÷ÓÃÕß

NettyÖеÄIO²Ù×÷ÊÇÒì²½µÄ£¬°üÀ¨Bind¡¢Write¡¢ConnectµÈ²Ù×÷»á¼òµ¥µÄ·µ»ØÒ»¸öchannelFuture

µ÷ÓÃÕß²¢²»ÄÜÁ¢¿Ì»ñµÃ½á¹û£¬¶øÊÇͨ¹ýFuture-Listener»úÖÆ£¬Óû§¿ÉÒÔ·½±ãµÄÖ÷¶¯»ñÈ¡»òͨ¹ý֪ͨ»úÖÆÀ´»ñµÃIO²Ù×÷½á¹û

µ±future¶ÔÏó¸Õ¸Õ´´½¨Ê±£¬´¦ÓÚ·ÇÍê³É״̬£¬µ÷ÓÃÕß¿ÉÒÔͨ¹ý·µ»ØµÄChannelFutureÀ´»ñÈ¡²Ù×÷Ö´ÐеÄ״̬£¬×¢²á¼àÌýº¯ÊýÀ´Ö´ÐÐÍê³ÉºóµÄ²Ù×÷

Ä£¿é×é¼þ

Bootstrap¡¢ServerBootstrap

Bootstrap Òâ˼ÊÇÒýµ¼£¬Ò»¸ö Netty Ó¦ÓÃͨ³£ÓÉÒ»¸ö Bootstrap ¿ªÊ¼£¬Ö÷Òª×÷ÓÃÊÇÅäÖÃÕû¸ö Netty ³ÌÐò£¬´®Áª¸÷¸ö×é¼þ£¬Netty ÖÐ Bootstrap ÀàÊǿͻ§¶Ë³ÌÐòµÄÆô¶¯Òýµ¼À࣬ServerBootstrap ÊÇ·þÎñ¶ËÆô¶¯Òýµ¼Àà¡£

Future¡¢ChannelFuture

ÕýÈçÇ°Ãæ½éÉÜ£¬ÔÚ Netty ÖÐËùÓÐµÄ IO ²Ù×÷¶¼ÊÇÒì²½µÄ£¬²»ÄÜÁ¢¿ÌµÃÖªÏûÏ¢ÊÇ·ñ±»ÕýÈ·´¦Àí¡£

µ«ÊÇ¿ÉÒÔ¹ýÒ»»áµÈËüÖ´ÐÐÍê³É»òÕßÖ±½Ó×¢²áÒ»¸ö¼àÌý£¬¾ßÌåµÄʵÏÖ¾ÍÊÇͨ¹ý Future ºÍ ChannelFutures£¬ËûÃÇ¿ÉÒÔ×¢²áÒ»¸ö¼àÌý£¬µ±²Ù×÷Ö´Ðгɹ¦»òʧ°Üʱ¼àÌý»á×Ô¶¯´¥·¢×¢²áµÄ¼àÌýʼþ¡£

Channel

Netty ÍøÂçͨÐŵÄ×é¼þ£¬Äܹ»ÓÃÓÚÖ´ÐÐÍøÂç I/O ²Ù×÷¡£Channel ΪÓû§Ìṩ£º

µ±Ç°ÍøÂçÁ¬½ÓµÄͨµÀµÄ״̬£¨ÀýÈçÊÇ·ñ´ò¿ª£¿ÊÇ·ñÒÑÁ¬½Ó£¿£©

ÍøÂçÁ¬½ÓµÄÅäÖòÎÊý £¨ÀýÈç½ÓÊÕ»º³åÇø´óС£©

ÌṩÒì²½µÄÍøÂç I/O ²Ù×÷(È罨Á¢Á¬½Ó£¬¶Áд£¬°ó¶¨¶Ë¿Ú)£¬Òì²½µ÷ÓÃÒâζ×ÅÈκΠI/O µ÷Óö¼½«Á¢¼´·µ»Ø£¬²¢ÇÒ²»±£Ö¤ÔÚµ÷ÓýáÊøÊ±ËùÇëÇóµÄ I/O ²Ù×÷ÒÑÍê³É¡£ µ÷ÓÃÁ¢¼´·µ»ØÒ»¸ö ChannelFuture ʵÀý£¬Í¨¹ý×¢²á¼àÌýÆ÷µ½ ChannelFuture ÉÏ£¬¿ÉÒÔ I/O ²Ù×÷³É¹¦¡¢Ê§°Ü»òÈ¡Ïûʱ»Øµ÷֪ͨµ÷Ó÷½¡£

Ö§³Ö¹ØÁª I/O ²Ù×÷Óë¶ÔÓ¦µÄ´¦Àí³ÌÐò¡£

²»Í¬Ð­Òé¡¢²»Í¬µÄ×èÈûÀàÐ͵ÄÁ¬½Ó¶¼Óв»Í¬µÄ Channel ÀàÐÍÓëÖ®¶ÔÓ¦¡£ÏÂÃæÊÇһЩ³£ÓÃµÄ Channel ÀàÐÍ£º

NioSocketChannel£¬Òì²½µÄ¿Í»§¶Ë TCP Socket Á¬½Ó¡£

NioServerSocketChannel£¬Òì²½µÄ·þÎñÆ÷¶Ë TCP Socket Á¬½Ó¡£

NioDatagramChannel£¬Òì²½µÄ UDP Á¬½Ó¡£

NioSctpChannel£¬Òì²½µÄ¿Í»§¶Ë Sctp Á¬½Ó¡£

NioSctpServerChannel£¬Òì²½µÄ Sctp ·þÎñÆ÷¶ËÁ¬½Ó£¬ÕâЩͨµÀº­¸ÇÁË UDP ºÍ TCP ÍøÂç IO ÒÔ¼°Îļþ IO¡£

Selector

Netty »ùÓÚ Selector ¶ÔÏóʵÏÖ I/O ¶à·¸´Óã¬Í¨¹ý Selector Ò»¸öÏ߳̿ÉÒÔ¼àÌý¶à¸öÁ¬½ÓµÄ Channel ʼþ¡£

µ±ÏòÒ»¸ö Selector ÖÐ×¢²á Channel ºó£¬Selector ÄÚ²¿µÄ»úÖÆ¾Í¿ÉÒÔ×Ô¶¯²»¶ÏµØ²éѯ(Select) ÕâЩע²áµÄ Channel ÊÇ·ñÓÐÒѾÍÐ÷µÄ I/O ʼþ£¨ÀýÈç¿É¶Á£¬¿Éд£¬ÍøÂçÁ¬½ÓÍê³ÉµÈ£©£¬ÕâÑù³ÌÐò¾Í¿ÉÒԺܼòµ¥µØÊ¹ÓÃÒ»¸öÏ̸߳ßЧµØ¹ÜÀí¶à¸ö Channel ¡£

NioEventLoop

NioEventLoop ÖÐά»¤ÁËÒ»¸öÏ̺߳ÍÈÎÎñ¶ÓÁУ¬Ö§³ÖÒì²½Ìá½»Ö´ÐÐÈÎÎñ£¬Ïß³ÌÆô¶¯Ê±»áµ÷Óà NioEventLoop µÄ run ·½·¨£¬Ö´ÐÐ I/O ÈÎÎñºÍ·Ç I/O ÈÎÎñ£º

I/O ÈÎÎñ£¬¼´ selectionKey ÖÐ ready µÄʼþ£¬Èç accept¡¢connect¡¢read¡¢write µÈ£¬ÓÉ processSelectedKeys ·½·¨´¥·¢¡£

·Ç IO ÈÎÎñ£¬Ìí¼Óµ½ taskQueue ÖеÄÈÎÎñ£¬Èç register0¡¢bind0 µÈÈÎÎñ£¬ÓÉ runAllTasks ·½·¨´¥·¢¡£

Á½ÖÖÈÎÎñµÄÖ´ÐÐʱ¼ä±ÈÓɱäÁ¿ ioRatio ¿ØÖÆ£¬Ä¬ÈÏΪ 50£¬Ôò±íʾÔÊÐí·Ç IO ÈÎÎñÖ´ÐеÄʱ¼äÓë IO ÈÎÎñµÄÖ´ÐÐʱ¼äÏàµÈ¡£

NioEventLoopGroup

NioEventLoopGroup£¬Ö÷Òª¹ÜÀí eventLoop µÄÉúÃüÖÜÆÚ£¬¿ÉÒÔÀí½âΪһ¸öÏ̳߳أ¬ÄÚ²¿Î¬»¤ÁËÒ»×éỊ̈߳¬Ã¿¸öÏß³Ì(NioEventLoop)¸ºÔð´¦Àí¶à¸ö Channel ÉϵÄʼþ£¬¶øÒ»¸ö Channel Ö»¶ÔÓ¦ÓÚÒ»¸öÏ̡߳£

ChannelHandler

ChannelHandler ÊÇÒ»¸ö½Ó¿Ú£¬´¦Àí I/O ʼþ»òÀ¹½Ø I/O ²Ù×÷£¬²¢½«Æäת·¢µ½Æä ChannelPipeline(ÒµÎñ´¦ÀíÁ´)ÖеÄÏÂÒ»¸ö´¦Àí³ÌÐò¡£

ChannelHandler ±¾Éí²¢Ã»ÓÐÌṩºÜ¶à·½·¨£¬ÒòΪÕâ¸ö½Ó¿ÚÓÐÐí¶àµÄ·½·¨ÐèҪʵÏÖ£¬·½±ãʹÓÃÆÚ¼ä£¬¿ÉÒԼ̳ÐËüµÄ×ÓÀࣺ

ChannelInboundHandler ÓÃÓÚ´¦ÀíÈëÕ¾ I/O ʼþ¡£

ChannelOutboundHandler ÓÃÓÚ´¦Àí³öÕ¾ I/O ²Ù×÷¡£

»òÕßʹÓÃÒÔÏÂÊÊÅäÆ÷Àࣺ

ChannelInboundHandlerAdapter ÓÃÓÚ´¦ÀíÈëÕ¾ I/O ʼþ¡£

ChannelOutboundHandlerAdapter ÓÃÓÚ´¦Àí³öÕ¾ I/O ²Ù×÷¡£

ChannelDuplexHandler ÓÃÓÚ´¦ÀíÈëÕ¾ºÍ³öվʼþ¡£

ChannelHandlerContext

±£´æ Channel Ïà¹ØµÄËùÓÐÉÏÏÂÎÄÐÅÏ¢£¬Í¬Ê±¹ØÁªÒ»¸ö ChannelHandler ¶ÔÏó¡£

ChannelPipline

±£´æ ChannelHandler µÄ List£¬ÓÃÓÚ´¦Àí»òÀ¹½Ø Channel µÄÈëվʼþºÍ³öÕ¾²Ù×÷¡£

ChannelPipeline ʵÏÖÁËÒ»Öָ߼¶ÐÎʽµÄÀ¹½Ø¹ýÂËÆ÷ģʽ£¬Ê¹Óû§¿ÉÒÔÍêÈ«¿ØÖÆÊ¼þµÄ´¦Àí·½Ê½£¬ÒÔ¼° Channel Öи÷¸öµÄ ChannelHandler ÈçºÎÏ໥½»»¥¡£

ÏÂͼÒýÓà Netty µÄ Javadoc 4.1 ÖÐ ChannelPipeline µÄ˵Ã÷£¬ÃèÊöÁË ChannelPipeline ÖÐ ChannelHandler ͨ³£ÈçºÎ´¦Àí I/O ʼþ¡£

I/O ʼþÓÉ ChannelInboundHandler »ò ChannelOutboundHandler ´¦Àí£¬²¢Í¨¹ýµ÷Óà ChannelHandlerContext Öж¨ÒåµÄʼþ´«²¥·½·¨¡£

ÀýÈç ChannelHandlerContext.fireChannelRead£¨Object£©ºÍ ChannelOutboundInvoker.write£¨Object£©×ª·¢µ½Æä×î½üµÄ´¦Àí³ÌÐò¡£

ÈëվʼþÓÉ×Ô϶øÉÏ·½ÏòµÄÈëÕ¾´¦Àí³ÌÐò´¦Àí£¬Èçͼ×ó²àËùʾ¡£ÈëÕ¾ Handler ´¦Àí³ÌÐòͨ³£´¦ÀíÓÉͼµ×²¿µÄ I/O Ïß³ÌÉú³ÉµÄÈëÕ¾Êý¾Ý¡£

ͨ³£Í¨¹ýʵ¼ÊÊäÈë²Ù×÷£¨ÀýÈç SocketChannel.read£¨ByteBuffer£©£©´ÓÔ¶³Ì¶ÁÈ¡ÈëÕ¾Êý¾Ý¡£

³öվʼþÓÉÉÏÏ·½Ïò´¦Àí£¬ÈçͼÓÒ²àËùʾ¡£³öÕ¾ Handler ´¦Àí³ÌÐòͨ³£»áÉú³É»òת»»³öÕ¾´«Ê䣬ÀýÈç write ÇëÇó¡£

I/O Ïß³Ìͨ³£Ö´ÐÐʵ¼ÊµÄÊä³ö²Ù×÷£¬ÀýÈç SocketChannel.write£¨ByteBuffer£©¡£

ÔÚ Netty ÖÐÿ¸ö Channel ¶¼ÓÐÇÒ½öÓÐÒ»¸ö ChannelPipeline ÓëÖ®¶ÔÓ¦£¬ËüÃǵÄ×é³É¹ØÏµÈçÏ£º

Ò»¸ö Channel °üº¬ÁËÒ»¸ö ChannelPipeline£¬¶ø ChannelPipeline ÖÐÓÖά»¤ÁËÒ»¸öÓÉ ChannelHandlerContext ×é³ÉµÄË«ÏòÁ´±í£¬²¢ÇÒÿ¸ö ChannelHandlerContext ÖÐÓÖ¹ØÁª×ÅÒ»¸ö ChannelHandler¡£

ÈëվʼþºÍ³öվʼþÔÚÒ»¸öË«ÏòÁ´±íÖУ¬Èëվʼþ»á´ÓÁ´±í head Íùºó´«µÝµ½×îºóÒ»¸öÈëÕ¾µÄ handler£¬³öվʼþ»á´ÓÁ´±í tail Íùǰ´«µÝµ½×îǰһ¸ö³öÕ¾µÄ handler£¬Á½ÖÖÀàÐ굀 handler »¥²»¸ÉÈÅ¡£

Netty ¹¤×÷Ô­Àí¼Ü¹¹

³õʼ»¯²¢Æô¶¯ Netty ·þÎñ¶Ë¹ý³ÌÈçÏ£º

publicstaticvoidmain(String[] args) {
// ´´½¨mainReactor
NioEventLoopGroup boosGroup = newNioEventLoopGroup();
// ´´½¨¹¤×÷Ïß³Ì×é
NioEventLoopGroup workerGroup = newNioEventLoopGroup();
final ServerBootstrap serverBootstrap = newServerBootstrap();
serverBootstrap
// ×é×°NioEventLoopGroup
. group(boosGroup, workerGroup)
// ÉèÖÃchannelÀàÐÍΪNIOÀàÐÍ
.channel(NioServerSocketChannel.class)
// ÉèÖÃÁ¬½ÓÅäÖòÎÊý
.option(ChannelOption.SO_BACKLOG, 1024)
.childOption(ChannelOption.SO_KEEPALIVE, true)
.childOption(ChannelOption.TCP_NODELAY, true)
// ÅäÖÃÈëÕ¾¡¢³öվʼþhandler
.childHandler( newChannelInitializer() {
@ Override
protectedvoidinitChannel(NioSocketChannel ch) {
// ÅäÖÃÈëÕ¾¡¢³öվʼþchannel
ch.pipeline().addLast(¡­);
ch.pipeline().addLast(¡­);
}
});
// °ó¶¨¶Ë¿Ú
intport = 8080;
serverBootstrap.bind(port).addListener(future -> {
if(future.isSuccess()) {
System. out.println( newDate() + ¡°: ¶Ë¿Ú[¡±+ port + ¡°]°ó¶¨³É¹¦!¡±);
} else{
System.err.println( ¡°¶Ë¿Ú[¡±+ port + ¡°]°ó¶¨Ê§°Ü!¡±);
}
});
}

»ù±¾¹ý³ÌÈçÏ£º

³õʼ»¯´´½¨ 2 ¸ö NioEventLoopGroup£¬ÆäÖÐ boosGroup ÓÃÓÚ Accetpt Á¬½Ó½¨Á¢Ê¼þ²¢·Ö·¢ÇëÇó£¬workerGroup ÓÃÓÚ´¦Àí I/O ¶ÁдʼþºÍÒµÎñÂß¼­¡£

»ùÓÚ ServerBootstrap(·þÎñ¶ËÆô¶¯Òýµ¼Àà)£¬ÅäÖà EventLoopGroup¡¢Channel ÀàÐÍ£¬Á¬½Ó²ÎÊý¡¢ÅäÖÃÈëÕ¾¡¢³öվʼþ handler¡£

°ó¶¨¶Ë¿Ú£¬¿ªÊ¼¹¤×÷¡£

½áºÏÉÏÃæ½éÉÜµÄ Netty Reactor Ä£ÐÍ£¬½éÉÜ·þÎñ¶Ë Netty µÄ¹¤×÷¼Ü¹¹Í¼£º

·þÎñ¶Ë Netty Reactor ¹¤×÷¼Ü¹¹Í¼

Server ¶Ë°üº¬ 1 ¸ö Boss NioEventLoopGroup ºÍ 1 ¸ö Worker NioEventLoopGroup¡£

NioEventLoopGroup Ï൱ÓÚ 1 ¸öʼþÑ­»·×飬Õâ¸ö×éÀï°üº¬¶à¸öʼþÑ­»· NioEventLoop£¬Ã¿¸ö NioEventLoop °üº¬ 1 ¸ö Selector ºÍ 1 ¸öʼþÑ­»·Ï̡߳£

ÿ¸ö Boss NioEventLoop Ñ­»·Ö´ÐеÄÈÎÎñ°üº¬ 3 ²½£º

ÂÖѯ Accept ʼþ¡£

´¦Àí Accept I/O ʼþ£¬Óë Client ½¨Á¢Á¬½Ó£¬Éú³É NioSocketChannel£¬²¢½« NioSocketChannel ×¢²áµ½Ä³¸ö Worker NioEventLoop µÄ Selector ÉÏ¡£

´¦ÀíÈÎÎñ¶ÓÁÐÖеÄÈÎÎñ£¬runAllTasks¡£ÈÎÎñ¶ÓÁÐÖеÄÈÎÎñ°üÀ¨Óû§µ÷Óà eventloop.execute »ò schedule Ö´ÐеÄÈÎÎñ£¬»òÕ߯äËûÏß³ÌÌá½»µ½¸Ã eventloop µÄÈÎÎñ¡£

ÿ¸ö Worker NioEventLoop Ñ­»·Ö´ÐеÄÈÎÎñ°üº¬ 3 ²½£º

ÂÖѯ Read¡¢Write ʼþ¡£

´¦Àí I/O ʼþ£¬¼´ Read¡¢Write ʼþ£¬ÔÚ NioSocketChannel ¿É¶Á¡¢¿Éдʼþ·¢Éúʱ½øÐд¦Àí¡£

´¦ÀíÈÎÎñ¶ÓÁÐÖеÄÈÎÎñ£¬runAllTasks¡£

ÆäÖÐÈÎÎñ¶ÓÁÐÖÐµÄ Task ÓÐ 3 ÖÖµäÐÍʹÓó¡¾°¡£

¢ÙÓû§³ÌÐò×Ô¶¨ÒåµÄÆÕͨÈÎÎñ

ctx.channel().eventLoop().execute( newRunnable() {
@Override
publicvoidrun(){
//¡­
}
});

¢Ú·Çµ±Ç° Reactor Ï̵߳÷Óà Channel µÄ¸÷ÖÖ·½·¨

ÀýÈçÔÚÍÆËÍϵͳµÄÒµÎñÏß³ÌÀïÃæ£¬¸ù¾ÝÓû§µÄ±êʶ£¬ÕÒµ½¶ÔÓ¦µÄ Channel ÒýÓã¬È»ºóµ÷Óà Write Àà·½·¨Ïò¸ÃÓû§ÍÆËÍÏûÏ¢£¬¾Í»á½øÈëµ½ÕâÖÖ³¡¾°¡£×îÖÕµÄ Write »áÌá½»µ½ÈÎÎñ¶ÓÁÐÖкó±»Òì²½Ïû·Ñ¡£

¢ÛÓû§×Ô¶¨Ò嶨ʱÈÎÎñ

ctx.channel().eventLoop().schedule( newRunnable() {
@Override
publicvoidrun(){
}
}, 60, TimeUnit.SECONDS);

×ܽá

ÏÖÔÚÎȶ¨ÍƼöʹÓõÄÖ÷Á÷°æ±¾»¹ÊÇ Netty4£¬Netty5 ÖÐʹÓÃÁË ForkJoinPool£¬Ôö¼ÓÁË´úÂëµÄ¸´ÔÓ¶È£¬µ«ÊǶÔÐÔÄܵĸÄÉÆÈ´²»Ã÷ÏÔ£¬ËùÒÔÕâ¸ö°æ±¾²»ÍƼöʹÓá£

 

 

   
3076 ´Îä¯ÀÀ       30
Ïà¹ØÎÄÕÂ

Java΢·þÎñÐÂÉú´úÖ®Nacos
ÉîÈëÀí½âJavaÖеÄÈÝÆ÷
JavaÈÝÆ÷Ïê½â
Java´úÂëÖÊÁ¿¼ì²é¹¤¾ß¼°Ê¹Óð¸Àý
Ïà¹ØÎĵµ

JavaÐÔÄÜÓÅ»¯
Spring¿ò¼Ü
SSM¿ò¼Ü¼òµ¥¼òÉÜ
´ÓÁ㿪ʼѧjava±à³Ì¾­µä
Ïà¹Ø¿Î³Ì

¸ßÐÔÄÜJava±à³ÌÓëϵͳÐÔÄÜÓÅ»¯
JavaEE¼Ü¹¹¡¢ Éè¼ÆÄ£Ê½¼°ÐÔÄܵ÷ÓÅ
Java±à³Ì»ù´¡µ½Ó¦Óÿª·¢
JAVAÐéÄâ»úÔ­ÀíÆÊÎö