±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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£¬Ôö¼ÓÁË´úÂëµÄ¸´ÔÓ¶È£¬µ«ÊǶÔÐÔÄܵĸÄÉÆÈ´²»Ã÷ÏÔ£¬ËùÒÔÕâ¸ö°æ±¾²»ÍƼöʹÓá£
|