锘??xml version="1.0" encoding="utf-8" standalone="yes"?>youjizz亚洲,亚洲熟妇无码一区二区三区导航,亚洲AV无码专区在线播放中文http://m.tkk7.com/paulwong/category/54729.htmlzh-cnWed, 02 Dec 2020 14:17:25 GMTWed, 02 Dec 2020 14:17:25 GMT60鍙蹭笂鏈閫氫織Netty鍏ラ棬闀挎枃錛氬熀鏈粙緇嶃佺幆澧冩惌寤恒佸姩鎵嬪疄鎴?/title><link>http://m.tkk7.com/paulwong/archive/2020/12/02/435738.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 02 Dec 2020 01:15:00 GMT</pubDate><guid>http://m.tkk7.com/paulwong/archive/2020/12/02/435738.html</guid><wfw:comment>http://m.tkk7.com/paulwong/comments/435738.html</wfw:comment><comments>http://m.tkk7.com/paulwong/archive/2020/12/02/435738.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/paulwong/comments/commentRss/435738.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/paulwong/services/trackbacks/435738.html</trackback:ping><description><![CDATA[<a href="http://m.tkk7.com/jb2011/archive/2020/11/18/435727.html" target="_blank">http://m.tkk7.com/jb2011/archive/2020/11/18/435727.html</a><img src ="http://m.tkk7.com/paulwong/aggbug/435738.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/paulwong/" target="_blank">paulwong</a> 2020-12-02 09:15 <a href="http://m.tkk7.com/paulwong/archive/2020/12/02/435738.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>SPRING MVC鏁村悎NETTYhttp://m.tkk7.com/paulwong/archive/2016/04/19/430146.htmlpaulwongpaulwongTue, 19 Apr 2016 05:27:00 GMThttp://m.tkk7.com/paulwong/archive/2016/04/19/430146.htmlhttp://m.tkk7.com/paulwong/comments/430146.htmlhttp://m.tkk7.com/paulwong/archive/2016/04/19/430146.html#Feedback0http://m.tkk7.com/paulwong/comments/commentRss/430146.htmlhttp://m.tkk7.com/paulwong/services/trackbacks/430146.htmlhttp://wenku.baidu.com/view/4573aba4ce2f0066f53322e8.html

paulwong 2016-04-19 13:27 鍙戣〃璇勮
]]>
Netty鏄粈涔堬紵http://m.tkk7.com/paulwong/archive/2016/04/12/430057.htmlpaulwongpaulwongTue, 12 Apr 2016 07:19:00 GMThttp://m.tkk7.com/paulwong/archive/2016/04/12/430057.htmlhttp://m.tkk7.com/paulwong/comments/430057.htmlhttp://m.tkk7.com/paulwong/archive/2016/04/12/430057.html#Feedback0http://m.tkk7.com/paulwong/comments/commentRss/430057.htmlhttp://m.tkk7.com/paulwong/services/trackbacks/430057.html鏈川錛欽Boss鍋氱殑涓涓狫ar鍖?/p>

 

鐩殑錛氬揩閫熷紑鍙戦珮鎬ц兘銆侀珮鍙潬鎬х殑緗戠粶鏈嶅姟鍣ㄥ拰瀹㈡埛绔▼搴?/p>

 

浼樼偣錛氭彁渚涘紓姝ョ殑銆佷簨浠墮┍鍔ㄧ殑緗戠粶搴旂敤紼嬪簭妗嗘灦鍜屽伐鍏?/p>

 

閫氫織鐨勮錛氫竴涓ソ浣跨殑澶勭悊Socket鐨勪笢涓?/p>

 

 

濡傛灉娌℃湁Netty錛?/p>

 

榪滃彜錛歫ava.net + java.io

 

榪戜唬錛歫ava.nio

 

鍏朵粬錛歁ina錛孏rizzly

 

涓轟粈涔堜笉鏄疢ina錛?/p>

 

1銆侀兘鏄疶rustin Lee鐨勪綔鍝侊紝Netty鏇存櫄錛?/p>

2銆丮ina灝嗗唴鏍稿拰涓浜涚壒鎬х殑鑱旂郴榪囦簬绱у瘑錛屼嬌寰楃敤鎴峰湪涓嶉渶瑕佽繖浜涚壒鎬х殑鏃跺欐棤娉曡劚紱伙紝鐩告瘮涓嬫ц兘浼?xì)鏈夋墍涓嬮檷錛孨etty瑙e喅浜?jiǎn)杩欎釜璁捐闂锛?/p>

3銆丯etty鐨勬枃妗f洿娓呮櫚錛屽緢澶歁ina鐨勭壒鎬у湪Netty閲岄兘鏈夛紱

4銆丯etty鏇存柊鍛ㄦ湡鏇寸煭錛屾柊鐗堟湰鐨勫彂甯冩瘮杈冨揩錛?/p>

5銆佸畠浠殑鏋舵瀯宸埆涓嶅ぇ錛孧ina闈燼pache鐢熷瓨錛岃孨etty闈爅boss錛屽拰jboss鐨勭粨鍚堝害闈炲父楂橈紝Netty鏈夊google protocal buf鐨勬敮鎸侊紝鏈夋洿瀹屾暣鐨刬oc瀹瑰櫒鏀寔(spring,guice,jbossmc鍜宱sgi)錛?/p>

6銆丯etty姣擬ina浣跨敤璧鋒潵鏇寸畝鍗曪紝Netty閲屼綘鍙互鑷畾涔夌殑澶勭悊upstream events 鎴?鍜?downstream events錛屽彲浠ヤ嬌鐢╠ecoder鍜宔ncoder鏉ヨВ鐮佸拰緙栫爜鍙戦佸唴瀹癸紱

7銆丯etty鍜孧ina鍦ㄥ鐞哢DP鏃舵湁涓浜涗笉鍚岋紝Netty灝哢DP鏃犺繛鎺ョ殑鐗規(guī)ф毚闇插嚭鏉ワ紱鑰孧ina瀵筓DP榪涜浜?jiǎn)楂樉Uу眰嬈$殑鎶借薄錛屽彲浠ユ妸UDP褰撴垚"闈㈠悜榪炴帴"鐨勫崗璁紝鑰岃Netty鍋氬埌榪欎竴鐐規(guī)瘮杈冨洶闅俱?/p>

 

 

Netty鐨勭壒鎬?/p>

 

璁捐

緇熶竴鐨凙PI錛岄傜敤浜庝笉鍚岀殑鍗忚錛堥樆濉炲拰闈為樆濉烇級(jí)

鍩轟簬鐏墊椿銆佸彲鎵╁睍鐨勪簨浠墮┍鍔ㄦā鍨?/p>

楂樺害鍙畾鍒剁殑綰跨▼妯″瀷

鍙潬鐨勬棤榪炴帴鏁版嵁Socket鏀寔錛圲DP錛?/p>

 

鎬ц兘

鏇村ソ鐨勫悶鍚愰噺錛屼綆寤惰繜

鏇寸渷璧勬簮

灝介噺鍑忓皯涓嶅繀瑕佺殑鍐呭瓨鎷瘋礉

 

瀹夊叏

瀹屾暣鐨凷SL/TLS鍜孲TARTTLS鐨勬敮鎸?/p>

鑳藉湪Applet涓嶢ndroid鐨勯檺鍒剁幆澧冭繍琛岃壇濂?/p>

 

鍋ュ.鎬?/p>

涓嶅啀鍥犺繃蹇佽繃鎱㈡垨瓚呰礋杞借繛鎺ュ鑷碠utOfMemoryError

涓嶅啀鏈夊湪楂橀熺綉緇滅幆澧冧笅NIO璇誨啓棰戠巼涓嶄竴鑷寸殑闂

 

鏄撶敤

瀹屽杽鐨凧avaDoc錛岀敤鎴鋒寚鍗楀拰鏍蜂緥

綆媧佺畝鍗?/p>

浠呬俊璧栦簬JDK1.5

 

鐪嬩緥瀛愬惂錛?/p>

 

Server绔細(xì)

 

Java浠g爜  鏀惰棌浠g爜
  1. package me.hello.netty;  
  2.   
  3. import org.jboss.netty.bootstrap.ServerBootstrap;  
  4. import org.jboss.netty.channel.*;  
  5. import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;  
  6. import org.jboss.netty.handler.codec.string.StringDecoder;  
  7. import org.jboss.netty.handler.codec.string.StringEncoder;  
  8.   
  9. import java.net.InetSocketAddress;  
  10. import java.util.concurrent.Executors;  
  11.   
  12. /** 
  13.  * God Bless You! 
  14.  * Author: Fangniude 
  15.  * Date: 2013-07-15 
  16.  */  
  17. public class NettyServer {  
  18.     public static void main(String[] args) {  
  19.         ServerBootstrap bootstrap = new ServerBootstrap(new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));  
  20.   
  21.         // Set up the default event pipeline.  
  22.         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  23.             @Override  
  24.             public ChannelPipeline getPipeline() throws Exception {  
  25.                 return Channels.pipeline(new StringDecoder(), new StringEncoder(), new ServerHandler());  
  26.             }  
  27.         });  
  28.   
  29.         // Bind and start to accept incoming connections.  
  30.         Channel bind = bootstrap.bind(new InetSocketAddress(8000));  
  31.         System.out.println("Server宸茬粡鍚姩錛岀洃鍚鍙? " + bind.getLocalAddress() + "錛?nbsp;絳夊緟瀹㈡埛绔敞鍐屻傘傘?);  
  32.     }  
  33.   
  34.     private static class ServerHandler extends SimpleChannelHandler {  
  35.         @Override  
  36.         public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {  
  37.             if (e.getMessage() instanceof String) {  
  38.                 String message = (String) e.getMessage();  
  39.                 System.out.println("Client鍙戞潵:" + message);  
  40.   
  41.                 e.getChannel().write("Server宸叉敹鍒板垰鍙戦佺殑:" + message);  
  42.   
  43.                 System.out.println("\n絳夊緟瀹㈡埛绔緭鍏ャ傘傘?);  
  44.             }  
  45.   
  46.             super.messageReceived(ctx, e);  
  47.         }  
  48.   
  49.         @Override  
  50.         public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) throws Exception {  
  51.             super.exceptionCaught(ctx, e);  
  52.         }  
  53.   
  54.         @Override  
  55.         public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {  
  56.             System.out.println("鏈変竴涓鎴風(fēng)娉ㄥ唽涓婃潵浜?jiǎn)銆傘傘?);  
  57.             System.out.println("Client:" + e.getChannel().getRemoteAddress());  
  58.             System.out.println("Server:" + e.getChannel().getLocalAddress());  
  59.             System.out.println("\n絳夊緟瀹㈡埛绔緭鍏ャ傘傘?);  
  60.             super.channelConnected(ctx, e);  
  61.         }  
  62.     }  
  63. }  

 

瀹㈡埛绔細(xì)

 

Java浠g爜  鏀惰棌浠g爜
  1. package me.hello.netty;  
  2.   
  3. import org.jboss.netty.bootstrap.ClientBootstrap;  
  4. import org.jboss.netty.channel.*;  
  5. import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;  
  6. import org.jboss.netty.handler.codec.string.StringDecoder;  
  7. import org.jboss.netty.handler.codec.string.StringEncoder;  
  8.   
  9. import java.io.BufferedReader;  
  10. import java.io.InputStreamReader;  
  11. import java.net.InetSocketAddress;  
  12. import java.util.concurrent.Executors;  
  13.   
  14. /** 
  15.  * God Bless You! 
  16.  * Author: Fangniude 
  17.  * Date: 2013-07-15 
  18.  */  
  19. public class NettyClient {  
  20.   
  21.     public static void main(String[] args) {  
  22.         // Configure the client.  
  23.         ClientBootstrap bootstrap = new ClientBootstrap(new NioClientSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()));  
  24.   
  25.         // Set up the default event pipeline.  
  26.         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  27.             @Override  
  28.             public ChannelPipeline getPipeline() throws Exception {  
  29.                 return Channels.pipeline(new StringDecoder(), new StringEncoder(), new ClientHandler());  
  30.             }  
  31.         });  
  32.   
  33.         // Start the connection attempt.  
  34.         ChannelFuture future = bootstrap.connect(new InetSocketAddress("localhost", 8000));  
  35.   
  36.         // Wait until the connection is closed or the connection attempt fails.  
  37.         future.getChannel().getCloseFuture().awaitUninterruptibly();  
  38.   
  39.         // Shut down thread pools to exit.  
  40.         bootstrap.releaseExternalResources();  
  41.     }  
  42.   
  43.     private static class ClientHandler extends SimpleChannelHandler {  
  44.         private BufferedReader sin = new BufferedReader(new InputStreamReader(System.in));  
  45.   
  46.         @Override  
  47.         public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {  
  48.             if (e.getMessage() instanceof String) {  
  49.                 String message = (String) e.getMessage();  
  50.                 System.out.println(message);  
  51.   
  52.                 e.getChannel().write(sin.readLine());  
  53.   
  54.                 System.out.println("\n絳夊緟瀹㈡埛绔緭鍏ャ傘傘?);  
  55.             }  
  56.   
  57.             super.messageReceived(ctx, e);  
  58.         }  
  59.   
  60.         @Override  
  61.         public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception {  
  62.             System.out.println("宸茬粡涓嶴erver寤虹珛榪炴帴銆傘傘傘?);  
  63.             System.out.println("\n璇瘋緭鍏ヨ鍙戦佺殑淇℃伅錛?);  
  64.             super.channelConnected(ctx, e);  
  65.   
  66.             e.getChannel().write(sin.readLine());  
  67.         }  
  68.     }  
  69. }  

 

Netty鏁翠綋鏋舵瀯



 

Netty緇勪歡

 

ChannelFactory

Boss

Worker

Channel

ChannelEvent

Pipeline

ChannelContext

Handler

Sink

 

Server绔牳蹇?jī)绫?/p>

NioServerSocketChannelFactory

NioServerBossPool 

NioWorkerPool

NioServerBoss

NioWorker

NioServerSocketChannel

NioAcceptedSocketChannel

DefaultChannelPipeline

NioServerSocketPipelineSink

Channels

 

 

ChannelFactory

Channel宸ュ巶錛屽緢閲嶈鐨勭被

淇濆瓨鍚姩鐨勭浉鍏沖弬鏁?/p>

 

NioServerSocketChannelFactory

NioClientSocketChannelFactory

NioDatagramChannelFactory

 

榪欐槸Nio鐨勶紝榪樻湁Oio鍜孡ocal鐨?/p>

 

 

SelectorPool

 

Selector鐨勭嚎紼嬫睜

 

NioServerBossPool 榛樿綰跨▼鏁幫細(xì)1

NioClientBossPool      1

NioWorkerPool      2 * Processor

NioDatagramWorkerPool

 

 

Selector

 

閫夋嫨鍣紝寰堟牳蹇?jī)鐨劸l勪歡

 

NioServerBoss

NioClientBoss

NioWorker

NioDatagramWorker

 

 

Channel

 

閫氶亾

 

NioServerSocketChannel

NioClientSocketChannel

NioAcceptedSocketChannel

NioDatagramChannel

 

Sink

璐熻矗鍜屽簳灞傜殑浜や簰

濡俠ind錛學(xué)rite錛孋lose絳?/p>

 

NioServerSocketPipelineSink

NioClientSocketPipelineSink

NioDatagramPipelineSink

 

Pipeline

璐熻矗緇存姢鎵鏈夌殑Handler

 

ChannelContext

涓涓狢hannel涓涓紝鏄疕andler鍜孭ipeline鐨勪腑闂翠歡

 

Handler

瀵笴hannel浜嬩歡鐨勫鐞嗗櫒

 

 

ChannelPipeline

 



 

 

 

浼樼鐨勮璁?---浜嬩歡椹卞姩



 

 

浼樼鐨勮璁?---綰跨▼妯″瀷



 

娉ㄦ剰浜嬮」

 

瑙g爜鏃剁殑Position

 

Channel鐨勫叧闂?/p>

 

鏇村Handler

 

 

Channel鐨勫叧闂?/p>

 

鐢ㄥ畬鐨凜hannel錛屽彲浠ョ洿鎺ュ叧闂紱

1銆丆hannelFuture鍔燣istener

2銆亀riteComplete

 

涓孌墊椂闂存病鐢紝涔熷彲浠ュ叧闂?/p>

TimeoutHandler



paulwong 2016-04-12 15:19 鍙戣〃璇勮
]]>
杞婚噺綰у垎甯冨紡 RPC 妗嗘灦http://m.tkk7.com/paulwong/archive/2016/04/12/430053.htmlpaulwongpaulwongTue, 12 Apr 2016 05:44:00 GMThttp://m.tkk7.com/paulwong/archive/2016/04/12/430053.htmlhttp://m.tkk7.com/paulwong/comments/430053.htmlhttp://m.tkk7.com/paulwong/archive/2016/04/12/430053.html#Feedback0http://m.tkk7.com/paulwong/comments/commentRss/430053.htmlhttp://m.tkk7.com/paulwong/services/trackbacks/430053.html1銆佹瘡濂楁湇鍔¢渶鎼厤涓涓猂PCSERVER2銆丷PCSERVER浣滀負(fù)SPRING 瀹瑰櫒鐨勪竴涓狟EAN3銆佸湪SPRING鍚姩鐨勬椂鍊欙紝RPCSERVER浼?xì)鍚姩涓涓狽ETTY鏈嶅姟鍣ㄧ錛岀劧鍚庡皢SPRING...  闃呰鍏ㄦ枃

paulwong 2016-04-12 13:44 鍙戣〃璇勮
]]>
Reactor妯″紡璇﹁Вhttp://m.tkk7.com/paulwong/archive/2015/09/08/427190.htmlpaulwongpaulwongTue, 08 Sep 2015 04:28:00 GMThttp://m.tkk7.com/paulwong/archive/2015/09/08/427190.htmlhttp://m.tkk7.com/paulwong/comments/427190.htmlhttp://m.tkk7.com/paulwong/archive/2015/09/08/427190.html#Feedback0http://m.tkk7.com/paulwong/comments/commentRss/427190.htmlhttp://m.tkk7.com/paulwong/services/trackbacks/427190.html

鍓嶈

絎竴嬈″惉鍒癛eactor妯″紡鏄笁騫村墠鐨勬煇涓櫄涓婏紝涓涓鍙嬬獊鐒惰窇榪囨潵闂垜浠涔堟槸Reactor妯″紡錛熸垜涓婄綉鏌ヤ簡(jiǎn)涓涓嬶紝寰堝浜洪兘鏄粰鍑篘IO涓殑 Selector鐨勪緥瀛愶紝鑰屼笖灝辨槸NIO閲孲elector澶氳礬澶嶇敤妯″瀷錛屽彧鏄粰瀹冭搗浜?jiǎn)涓涓瘮杈僨ancy鐨勫悕瀛楄屽凡錛岃櫧鐒跺畠寮曞叆浜?jiǎn)EventLoop姒?蹇碉紝榪欏鎴戞潵璇存槸鏂扮殑姒傚康錛屼絾鏄唬鐮佸疄鐜板嵈鏄竴鏍風(fēng)殑錛屽洜鑰屾垜騫舵病鏈夊緢鍦ㄦ剰榪欎釜妯″紡銆傜劧鑰屾渶榪戝紑濮嬭Netty婧愮爜錛岃孯eactor妯″紡鏄緢澶氫粙緇峃etty鐨勬枃绔犱腑琚ぇ鑲嗗浼犵殑妯″紡錛屽洜鑰屾垜鍐嶆闂嚜宸憋紝浠涔堟槸Reactor妯″紡錛熸湰鏂囧氨鏄榪欎釜闂鍏充簬鎴戠殑涓浜涚悊瑙e拰灝濊瘯鐫鏉ヨВ絳斻?br />

浠涔堟槸Reactor妯″紡

瑕佸洖絳旇繖涓棶棰橈紝棣栧厛褰撶劧鏄眰鍔〨oogle鎴朩ikipedia錛屽叾涓璚ikipedia涓婅錛?#8220;The reactor design pattern is an event handling pattern for handling service requests delivered concurrently by one or more inputs. The service handler then demultiplexes the incoming requests and dispatches them synchronously to associated request handlers.”銆備粠榪欎釜鎻忚堪涓紝鎴戜滑鐭ラ亾Reactor妯″紡棣栧厛鏄?strong>浜嬩歡椹卞姩鐨勶紝鏈変竴涓垨澶氫釜騫跺彂杈撳叆婧愶紝鏈変竴涓猄ervice Handler錛屾湁澶氫釜Request Handlers錛涜繖涓猄ervice Handler浼?xì)鍚屾鐨劄畣杈撳叆鐨勮h眰錛圗vent錛夊璺鐢ㄧ殑鍒嗗彂緇欑浉搴旂殑Request Handler銆傚鏋滅敤鍥炬潵琛ㄨ揪錛?br />

浠庣粨鏋勪笂錛岃繖鏈夌偣綾諱技鐢熶駭鑰呮秷璐硅呮ā寮忥紝鍗蟲湁涓涓垨澶氫釜鐢熶駭鑰呭皢浜嬩歡鏀懼叆涓涓猀ueue涓紝鑰屼竴涓垨澶氫釜娑堣垂鑰呬富鍔ㄧ殑浠庤繖涓猀ueue涓璓oll浜嬩歡鏉ュ鐞嗭紱鑰孯eactor妯″紡鍒欏茍娌℃湁Queue鏉ュ仛緙撳啿錛屾瘡褰撲竴涓狤vent杈撳叆鍒癝ervice Handler涔嬪悗錛岃Service Handler浼?xì)涓诲姩鐨勬犚?guī)嵁涓嶅悓鐨凟vent綾誨瀷灝嗗叾鍒嗗彂緇欏搴旂殑Request Handler鏉ュ鐞嗐?br />
鏇村鏈殑錛岃繖綃囨枃绔狅紙Reactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events錛変笂璇達(dá)細(xì)“The Reactor design pattern handles service requests that are delivered concurrently to an application by one or more clients. Each service in an application may consistent of several methods and is represented by a separate event handler that is responsible for dispatching service-specific requests. Dispatching of event handlers is performed by an initiation dispatcher, which manages the registered event handlers. Demultiplexing of service requests is performed by a synchronous event demultiplexer. Also known as Dispatcher, Notifier”銆傝繖孌墊弿榪板拰W(xué)ikipedia涓婄殑鎻忚堪綾諱技錛屾湁澶氫釜杈撳叆婧愶紝鏈夊涓笉鍚岀殑EventHandler錛圧equestHandler錛夋潵澶勭悊涓嶅悓鐨勮姹傦紝Initiation Dispatcher鐢ㄤ簬綆$悊EventHander錛孍ventHandler棣栧厛瑕佹敞鍐屽埌Initiation Dispatcher涓紝鐒跺悗Initiation Dispatcher鏍規(guī)嵁杈撳叆鐨凟vent鍒嗗彂緇欐敞鍐岀殑EventHandler錛涚劧鑰孖nitiation Dispatcher騫朵笉鐩戝惉Event鐨勫埌鏉ワ紝榪欎釜宸ヤ綔浜ょ粰Synchronous Event Demultiplexer鏉ュ鐞嗐?br />

Reactor妯″紡緇撴瀯

鍦ㄨВ鍐充簡(jiǎn)浠涔堟槸Reactor妯″紡鍚庯紝鎴戜滑鏉ョ湅鐪婻eactor妯″紡鏄敱浠涔堟ā鍧楁瀯鎴愩傚浘鏄竴縐嶆瘮杈冪畝媧佸艦璞$殑琛ㄧ幇鏂瑰紡錛屽洜鑰屽厛涓婁竴寮犲浘鏉ヨ〃杈懼悇涓ā鍧楃殑鍚嶇О鍜屼粬浠箣闂寸殑鍏崇郴錛?br />

Handle錛?/strong>鍗蟲搷浣滅郴緇熶腑鐨勫彞鏌勶紝鏄璧勬簮鍦ㄦ搷浣滅郴緇熷眰闈笂鐨勪竴縐嶆娊璞★紝瀹冨彲浠ユ槸鎵撳紑鐨勬枃浠躲佷竴涓繛鎺?Socket)銆乀imer絳夈傜敱浜嶳eactor妯″紡涓鑸嬌鐢ㄥ湪緗戠粶緙栫▼涓紝鍥犺岃繖閲屼竴鑸寚Socket Handle錛屽嵆涓涓綉緇滆繛鎺ワ紙Connection錛屽湪Java NIO涓殑Channel錛夈傝繖涓狢hannel娉ㄥ唽鍒癝ynchronous Event Demultiplexer涓紝浠ョ洃鍚琀andle涓彂鐢熺殑浜嬩歡錛屽ServerSocketChannnel鍙互鏄疌ONNECT浜嬩歡錛屽SocketChannel鍙互鏄疪EAD銆乄RITE銆丆LOSE浜嬩歡絳夈?br />Synchronous Event Demultiplexer錛?/strong>闃誨絳夊緟涓緋誨垪鐨凥andle涓殑浜嬩歡鍒版潵錛屽鏋滈樆濉炵瓑寰呰繑鍥烇紝鍗寵〃紺哄湪榪斿洖鐨凥andle涓彲浠ヤ笉闃誨鐨勬墽琛岃繑鍥炵殑浜嬩歡綾誨瀷銆傝繖涓ā鍧椾竴鑸嬌鐢ㄦ搷浣滅郴緇熺殑select鏉ュ疄鐜般傚湪Java NIO涓敤Selector鏉ュ皝瑁咃紝褰揝elector.select()榪斿洖鏃訛紝鍙互璋冪敤Selector鐨剆electedKeys()鏂規(guī)硶鑾峰彇Set<SelectionKey>錛屼竴涓猄electionKey琛ㄨ揪涓涓湁浜嬩歡鍙戠敓鐨凜hannel浠ュ強(qiáng)璇hannel涓婄殑浜嬩歡綾誨瀷銆備笂鍥劇殑“Synchronous Event Demultiplexer ---notifies--> Handle”鐨勬祦紼嬪鏋滄槸瀵圭殑錛岄偅鍐呴儴瀹炵幇搴旇鏄痵elect()鏂規(guī)硶鍦ㄤ簨浠跺埌鏉ュ悗浼?xì)鍏堣畡〗瓾andle鐨勭姸鎬侊紝鐒跺悗榪斿洖銆備笉浜?jiǎn)瑙e唴閮ㄥ疄鐜版満鍒跺Q屽洜鑰屼繚鐣欏師鍥俱?br />Initiation Dispatcher錛?/strong>鐢ㄤ簬綆$悊Event Handler錛屽嵆EventHandler鐨勫鍣紝鐢ㄤ互娉ㄥ唽銆佺Щ闄ventHandler絳夛紱鍙﹀錛屽畠榪樹綔涓篟eactor妯″紡鐨勫叆鍙h皟鐢⊿ynchronous Event Demultiplexer鐨剆elect鏂規(guī)硶浠ラ樆濉炵瓑寰呬簨浠惰繑鍥烇紝褰撻樆濉炵瓑寰呰繑鍥炴椂錛屾牴鎹簨浠跺彂鐢熺殑Handle灝嗗叾鍒嗗彂緇欏搴旂殑Event Handler澶勭悊錛屽嵆鍥炶皟EventHandler涓殑handle_event()鏂規(guī)硶銆?br />Event Handler錛?/strong>瀹氫箟浜嬩歡澶勭悊鏂規(guī)硶錛歨andle_event()錛屼互渚汭nitiationDispatcher鍥炶皟浣跨敤銆?br />Concrete Event Handler錛?/strong>浜嬩歡EventHandler鎺ュ彛錛屽疄鐜扮壒瀹氫簨浠跺鐞嗛昏緫銆?br />

Reactor妯″紡妯″潡涔嬮棿鐨勪氦浜?/h2>綆鍗曟弿榪頒竴涓婻eactor鍚勪釜妯″潡涔嬮棿鐨勪氦浜掓祦紼嬶紝鍏堜粠搴忓垪鍥懼紑濮嬶細(xì)

1. 鍒濆鍖朓nitiationDispatcher錛屽茍鍒濆鍖栦竴涓狧andle鍒癊ventHandler鐨凪ap銆?br />2. 娉ㄥ唽EventHandler鍒癐nitiationDispatcher涓紝姣忎釜EventHandler鍖呭惈瀵圭浉搴擧andle鐨勫紩鐢紝浠庤屽緩绔婬andle鍒癊ventHandler鐨勬槧灝勶紙Map錛夈?br />3. 璋冪敤InitiationDispatcher鐨刪andle_events()鏂規(guī)硶浠ュ惎鍔‥vent Loop銆傚湪Event Loop涓紝璋冪敤select()鏂規(guī)硶錛圫ynchronous Event Demultiplexer錛夐樆濉炵瓑寰匛vent鍙戠敓銆?br />4. 褰撴煇涓垨鏌愪簺Handle鐨凟vent鍙戠敓鍚庯紝select()鏂規(guī)硶榪斿洖錛孖nitiationDispatcher鏍規(guī)嵁榪斿洖鐨凥andle鎵懼埌娉ㄥ唽鐨凟ventHandler錛屽茍鍥炶皟璇ventHandler鐨刪andle_events()鏂規(guī)硶銆?br />5. 鍦‥ventHandler鐨刪andle_events()鏂規(guī)硶涓繕鍙互鍚慖nitiationDispatcher涓敞鍐屾柊鐨凟venthandler錛屾瘮濡傚AcceptorEventHandler鏉ワ紝褰撴湁鏂扮殑client榪炴帴鏃訛紝瀹冧細(xì)浜х敓鏂扮殑EventHandler浠ュ鐞嗘柊鐨勮繛鎺ワ紝騫舵敞鍐屽埌InitiationDispatcher涓?br />

Reactor妯″紡瀹炵幇

鍦?a target="_blank" bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Reactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events涓紝涓鐩翠互Logging Server鏉ュ垎鏋怰eactor妯″紡錛岃繖涓狶ogging Server鐨勫疄鐜板畬鍏ㄩ伒寰繖閲屽Reactor鎻忚堪錛屽洜鑰屾斁鍦ㄨ繖閲屼互鍋氬弬鑰冦侺ogging Server涓殑Reactor妯″紡瀹炵幇鍒嗕袱涓儴鍒嗭細(xì)Client榪炴帴鍒癓ogging Server鍜孋lient鍚慙ogging Server鍐橪og銆傚洜鑰屽瀹冪殑鎻忚堪鍒嗘垚榪欎袱涓楠ゃ?br />Client榪炴帴鍒癓ogging Server

1. Logging Server娉ㄥ唽LoggingAcceptor鍒癐nitiationDispatcher銆?br />2. Logging Server璋冪敤InitiationDispatcher鐨刪andle_events()鏂規(guī)硶鍚姩銆?br />3. InitiationDispatcher鍐呴儴璋冪敤select()鏂規(guī)硶錛圫ynchronous Event Demultiplexer錛夛紝闃誨絳夊緟Client榪炴帴銆?br />4. Client榪炴帴鍒癓ogging Server銆?br />5. InitiationDisptcher涓殑select()鏂規(guī)硶榪斿洖錛屽茍閫氱煡LoggingAcceptor鏈夋柊鐨勮繛鎺ュ埌鏉ャ?nbsp;
6. LoggingAcceptor璋冪敤accept鏂規(guī)硶accept榪欎釜鏂拌繛鎺ャ?br />7. LoggingAcceptor鍒涘緩鏂扮殑LoggingHandler銆?br />8. 鏂扮殑LoggingHandler娉ㄥ唽鍒癐nitiationDispatcher涓?鍚屾椂涔熸敞鍐屽埌Synchonous Event Demultiplexer涓?錛岀瓑寰匔lient鍙戣搗鍐檒og璇鋒眰銆?br />Client鍚慙ogging Server鍐橪og

1. Client鍙戦乴og鍒癓ogging server銆?br />2. InitiationDispatcher鐩戞祴鍒扮浉搴旂殑Handle涓湁浜嬩歡鍙戠敓錛岃繑鍥為樆濉炵瓑寰咃紝鏍規(guī)嵁榪斿洖鐨凥andle鎵懼埌LoggingHandler錛屽茍鍥炶皟LoggingHandler涓殑handle_event()鏂規(guī)硶銆?br />3. LoggingHandler涓殑handle_event()鏂規(guī)硶涓鍙朒andle涓殑log淇℃伅銆?br />4. 灝嗘帴鏀跺埌鐨刲og鍐欏叆鍒版棩蹇楁枃浠躲佹暟鎹簱絳夎澶囦腑銆?br />3.4姝ラ寰幆鐩村埌褰撳墠鏃ュ織澶勭悊瀹屾垚銆?br />5. 榪斿洖鍒癐nitiationDispatcher絳夊緟涓嬩竴嬈℃棩蹇楀啓璇鋒眰銆?br />
鍦?a target="_blank" bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Reactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events鏈夊Reactor妯″紡鐨凜++鐨勫疄鐜扮増鏈紝澶氬勾涓嶇敤C++錛屽洜鑰岀暐榪囥?nbsp;

Java NIO瀵筊eactor鐨勫疄鐜?/h2>鍦↗ava鐨凬IO涓紝瀵筊eactor妯″紡鏈夋棤緙濈殑鏀寔錛屽嵆浣跨敤Selector綾誨皝瑁呬簡(jiǎn)鎿嶄綔緋葷粺鎻愪緵鐨凷ynchronous Event Demultiplexer鍔熻兘銆傝繖涓狣oug Lea宸茬粡鍦?a target="_blank" bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Scalable IO In Java涓湁闈炲父娣卞叆鐨勮В閲婁簡(jiǎn)錛屽洜鑰屼笉鍐嶈禈榪幫紝鍙﹀榪欑瘒鏂囩珷瀵笵oug Lea鐨?a target="_blank" bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Scalable IO In Java鏈変竴浜涚畝鍗曡В閲婏紝鑷沖皯瀹冪殑浠g爜鏍煎紡姣擠oug Lea鐨凱PT瑕佹暣媧佷竴浜涖?br />
闇瑕佹寚鍑虹殑鏄紝涓嶅悓榪欓噷浣跨敤InitiationDispatcher鏉ョ鐞咵ventHandler錛屽湪Doug Lea鐨勭増鏈腑浣跨敤SelectionKey涓殑Attachment鏉ュ瓨鍌ㄥ搴旂殑EventHandler錛屽洜鑰屼笉闇瑕佹敞鍐孍ventHandler榪欎釜姝ラ錛屾垨鑰呰緗瓵ttachment灝辨槸榪欓噷鐨勬敞鍐屻傝屼笖鍦ㄨ繖綃囨枃绔犱腑錛孌oug Lea浠庡崟綰跨▼鐨凴eactor銆丄cceptor銆丠andler瀹炵幇榪欎釜妯″紡鍑哄彂錛涙紨鍖栦負(fù)灝咹andler涓殑澶勭悊閫昏緫澶氱嚎紼嬪寲錛屽疄鐜扮被浼糚roactor妯″紡錛屾鏃舵墍鏈夌殑IO鎿嶄綔榪樻槸鍗曠嚎紼嬬殑錛屽洜鑰屽啀婕斿寲鍑轟竴涓狹ain Reactor鏉ュ鐞咰ONNECT浜嬩歡(Acceptor)錛岃屽涓猄ub Reactor鏉ュ鐞哛EAD銆乄RITE絳変簨浠?Handler)錛岃繖浜汼ub Reactor鍙互鍒嗗埆鍐嶈嚜宸辯殑綰跨▼涓墽琛岋紝浠庤孖O鎿嶄綔涔熷綰跨▼鍖栥傝繖涓渶鍚庝竴涓ā鍨嬫鏄疦etty涓嬌鐢ㄧ殑妯″瀷銆傚茍涓斿湪Reactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events鐨?.5 Determine the Number of Initiation Dispatchers in an Application涓篃鏈夌浉搴旂殑鎻忚堪銆?br />

EventHandler鎺ュ彛瀹氫箟

瀵笶ventHandler鐨勫畾涔夋湁涓ょ璁捐鎬濊礬錛歴ingle-method璁捐鍜宮ulti-method璁捐錛?br />A single-method interface錛?/strong>瀹冨皢Event灝佽鎴愪竴涓狤vent Object錛孍ventHandler鍙畾涔変竴涓猦andle_event(Event event)鏂規(guī)硶銆傝繖縐嶈璁$殑濂藉鏄湁鍒╀簬鎵╁睍錛屽彲浠ュ悗鏉ユ柟渚跨殑娣誨姞鏂扮殑Event綾誨瀷錛岀劧鑰屽湪瀛愮被鐨勫疄鐜頒腑錛岄渶瑕佸垽鏂笉鍚岀殑Event綾誨瀷鑰屽啀嬈℃墿灞曟垚 涓嶅悓鐨勫鐞嗘柟娉曪紝浠庤繖涓搴︿笂鏉ヨ錛屽畠鍙堜笉鍒╀簬鎵╁睍銆傚彟澶栧湪Netty3鐨勪嬌鐢ㄨ繃紼嬩腑錛岀敱浜庡畠涓嶅仠鐨勫垱寤篊hannelEvent綾伙紝鍥犺屼細(xì)寮曡搗GC鐨勪笉紼沖畾銆?br />A multi-method interface錛?/strong>榪欑璁捐鏄皢涓嶅悓鐨凟vent綾誨瀷鍦?EventHandler涓畾涔夌浉搴旂殑鏂規(guī)硶銆傝繖縐嶈璁″氨鏄疦etty4涓嬌鐢ㄧ殑絳栫暐錛屽叾涓竴涓洰鐨勬槸閬垮厤ChannelEvent鍒涘緩寮曡搗鐨凣C涓嶇ǔ瀹氾紝 鍙﹀涓涓ソ澶勬槸瀹冨彲浠ラ伩鍏嶅湪EventHandler瀹炵幇鏃跺垽鏂笉鍚岀殑Event綾誨瀷鑰屾湁涓嶅悓鐨勫疄鐜幫紝鐒惰岃繖縐嶈璁′細(xì)緇欐墿灞曟柊鐨凟vent綾誨瀷鏃跺甫鏉ラ潪甯?澶х殑楹葷儲(chǔ)錛屽洜涓哄畠闇瑕佽鎺ュ彛銆?br />
鍏充簬Netty4瀵筃etty3鐨勬敼榪涘彲浠ュ弬鑰?a target="_blank" bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">榪欓噷錛?br />ChannelHandler with no event objectIn 3.x, every I/O operation created a ChannelEvent object. For each read / write, it additionally created a new ChannelBuffer. It simplified the internals of Netty quite a lot because it delegates resource management and buffer pooling to the JVM. However, it often was the root cause of GC pressure and uncertainty which are sometimes observed in a Netty-based application under high load.

4.0 removes event object creation almost completely by replacing the event objects with strongly typed method invocations. 3.x had catch-all event handler methods such as handleUpstream() andhandleDownstream(), but this is not the case anymore. Every event type has its own handler method now:

涓轟粈涔堜嬌鐢≧eactor妯″紡

褰掑姛涓嶯etty鍜孞ava NIO瀵筊eactor鐨勫浼狅紝鏈枃鎱曞悕鑰屽涔?fàn)鐨凴eactor妯″紡錛屽洜鑰屽凡緇忛粯璁eactor鍏鋒湁闈炲父浼樼鐨勬ц兘錛岀劧鑰屾厱鍚嶅綊鎱曞悕錛屽埌榪欓噷錛屾垜榪樻槸瑕佷笉寰椾笉闂嚜宸盧eactor妯″紡鐨勫ソ澶勫湪鍝噷錛熷嵆涓轟粈涔堣浣跨敤榪欎釜Reactor妯″紡錛熷湪Reactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events涓槸榪欎箞璇寸殑錛?br />Reactor Pattern浼樼偣

Separation of concerns: The Reactor pattern decouples application-independent demultiplexing and dispatching mechanisms from application-specific hook method functionality. The application-independent mechanisms become reusable components that know how to demultiplex events and dispatch the appropriate hook methods defined byEvent Handlers. In contrast, the application-specific functionality in a hook method knows how to perform a particular type of service.

Improve modularity, reusability, and configurability of event-driven applications: The pattern decouples application functionality into separate classes. For instance, there are two separate classes in the logging server: one for establishing connections and another for receiving and processing logging records. This decoupling enables the reuse of the connection establishment class for different types of connection-oriented services (such as file transfer, remote login, and video-on-demand). Therefore, modifying or extending the functionality of the logging server only affects the implementation of the logging handler class.

Improves application portability: The Initiation Dispatcher’s interface can be reused independently of the OS system calls that perform event demultiplexing. These system calls detect and report the occurrence of one or more events that may occur simultaneously on multiple sources of events. Common sources of events may in- clude I/O handles, timers, and synchronization objects. On UNIX platforms, the event demultiplexing system calls are calledselect and poll [1]. In the Win32 API [16], the WaitForMultipleObjects system call performs event demultiplexing.

Provides coarse-grained concurrency control: The Reactor pattern serializes the invocation of event handlers at the level of event demultiplexing and dispatching within a process or thread. Serialization at the Initiation Dispatcher level often eliminates the need for more complicated synchronization or locking within an application process.

榪欎簺璨屼技鏄緢澶氭ā寮忕殑鍏辨э細(xì)瑙h︺佹彁鍗囧鐢ㄦс佹ā鍧楀寲銆佸彲縐繪鎬с佷簨浠墮┍鍔ㄣ佺粏鍔涘害鐨勫茍鍙戞帶鍒剁瓑錛屽洜鑰屽茍涓嶈兘寰堝ソ鐨勮鏄庝粈涔堬紝鐗瑰埆鏄畠榧撳惞鐨勫鎬ц兘鐨勬彁鍗囷紝榪欓噷騫舵病鏈変綋鐜板嚭鏉ャ傚綋鐒跺湪榪欑瘒鏂囩珷鐨勫紑澶存湁鎻忚堪榪囧彟涓縐嶇洿瑙傜殑瀹炵幇錛歍hread-Per-Connection錛屽嵆浼犵粺鐨勫疄鐜幫紝鎻愬埌浜?jiǎn)杩欎釜浼牼l熷疄鐜扮殑浠ヤ笅闂錛?br />Thread Per Connection緙虹偣

Efficiency: Threading may lead to poor performance due to context switching, synchronization, and data movement [2];

Programming simplicity: Threading may require complex concurrency control schemes;

Portability: Threading is not available on all OS platforms. 瀵逛簬鎬ц兘錛屽畠鍏跺疄灝辨槸絎竴鐐瑰叧浜嶦fficiency鐨勬弿榪幫紝鍗崇嚎紼嬬殑鍒囨崲銆佸悓姝ャ佹暟鎹殑縐誨姩浼?xì)寮曡典hц兘闂銆備篃灝辨槸璇翠粠鎬ц兘鐨勮搴︿笂錛屽畠鏈澶х殑鎻愬崌灝辨槸鍑忓皯浜?jiǎn)鎬ц兘鐨勪嬌鐢紝鍗充笉闇瑕佹瘡涓狢lient瀵瑰簲涓涓嚎紼嬨傛垜鐨勭悊瑙o紝鍏朵粬涓氬姟閫昏緫澶勭悊寰堝鏃跺欎篃浼?xì)鐢ㄥ埌鐩稿悓鐨劸U跨▼錛孖O璇誨啓鎿嶄綔鐩稿CPU鐨勬搷浣滆繕鏄鎱㈠緢澶氾紝鍗充嬌Reactor鏈哄埗涓瘡嬈¤鍐欏凡緇忚兘淇濊瘉闈為樆濉炶鍐欙紝榪欓噷鍙互鍑忓皯涓浜涚嚎紼嬬殑浣跨敤錛屼絾鏄繖鍑忓皯鐨勭嚎紼嬩嬌鐢ㄥ鎬ц兘鏈夐偅涔堝ぇ鐨勫獎(jiǎng)鍝嶅悧錛熺瓟妗堣矊浼兼槸鑲畾鐨勶紝榪欑瘒璁烘枃(SEDA: Staged Event-Driven Architecture - An Architecture for Well-Conditioned, Scalable Internet Service)瀵歸殢鐫綰跨▼鐨勫闀垮甫鏉ユц兘闄嶄綆鍋氫簡(jiǎn)涓涓粺璁★細(xì)

鍦ㄨ繖涓粺璁′腑錛屾瘡涓嚎紼嬩粠紓佺洏涓8KB鏁版嵁錛屾瘡涓嚎紼嬭鍚屼竴涓枃浠訛紝鍥犺屾暟鎹湰韜槸緙撳瓨鍦ㄦ搷浣滅郴緇熷唴閮ㄧ殑錛屽嵆鍑忓皯IO鐨勫獎(jiǎng)鍝嶏紱鎵鏈夌嚎紼嬫槸浜嬪厛鍒嗛厤鐨勶紝涓嶄細(xì)鏈夌嚎紼嬪惎鍔ㄧ殑褰卞搷錛涙墍鏈変換鍔″湪嫻嬭瘯鍐呴儴浜х敓錛屽洜鑰屼笉浼?xì)鏈壘|戠粶鐨勫獎(jiǎng)鍝嶃傝緇熻鏁版嵁榪愯鐜錛歀inux 2.2.14錛?GB鍐呭瓨錛?-way 500MHz Pentium III銆備粠鍥句腑鍙互鐪嬪嚭錛岄殢鐫綰跨▼鐨勫闀匡紝鍚炲悙閲忓湪綰跨▼鏁頒負(fù)8涓乏鍙崇殑鏃跺欏紑濮嬬嚎鎬т笅闄嶏紝騫朵笖鍒?4涓互鍚庤岃繀閫熶笅闄嶏紝鍏剁浉搴斾簨浠朵篃鍦ㄧ嚎紼嬭揪鍒?56涓悗鎸囨暟涓婂崌銆傚嵆1+1<2錛屽洜涓虹嚎紼嬪垏鎹€佸悓姝ャ佹暟鎹Щ鍔ㄤ細(xì)鏈夋ц兘鎹熷け錛岀嚎紼嬫暟澧炲姞鍒頒竴瀹氭暟閲忔椂錛岃繖縐嶆ц兘褰卞搷鏁堟灉浼?xì)鏇村姞鏄庢樉銆?br />
瀵逛簬榪欑偣錛岃繕鍙互鍙傝?a target="_blank" bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">C10K Problem錛岀敤浠ユ弿榪板悓鏃舵湁10K涓狢lient鍙戣搗榪炴帴鐨勯棶棰橈紝鍒?010騫寸殑鏃跺欏凡緇忓嚭鐜?0M Problem浜?jiǎn)銆?br />
褰撶劧涔熸湁浜鴻錛?a target="_blank" bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Threads are expensive are no longer valid.鍦ㄤ笉涔呯殑灝嗘潵鍙兘鍙堜細(xì)鍙戠敓涓嶅悓鐨勫彉鍖栵紝鎴栬呰繖涓彉鍖栨鍦ㄣ佸凡緇忓彂鐢熺潃錛熸病鏈夊仛榪囨瘮杈冧粩緇嗙殑嫻嬭瘯錛屽洜鑰屼笉鏁㈤殢渚挎柇璦浠涔堬紝鐒惰屾湰浜鴻鐐癸紝鍗充嬌綰跨▼鍙樼殑褰卞搷騫舵病鏈変互鍓嶉偅涔堝ぇ錛屼嬌鐢≧eactor妯″紡錛岀敋鑷蟲椂SEDA妯″紡鏉ュ噺灝戠嚎紼嬬殑浣跨敤錛屽啀鍔犱笂鍏朵粬瑙h︺佹ā鍧楀寲銆佹彁鍗囧鐢ㄦх瓑浼樼偣錛岃繕鏄煎緱浣跨敤鐨勩?br />

Reactor妯″紡鐨勭己鐐?/h2>Reactor妯″紡鐨勭己鐐硅矊浼間篃鏄樉鑰屾槗瑙佺殑錛?br />1. 鐩告瘮浼犵粺鐨勭畝鍗曟ā鍨嬶紝Reactor澧炲姞浜?jiǎn)涓瀹氱殑澶嶆潅鎬э紝鍥犺屾湁涓瀹氱殑闂ㄦ錛屽茍涓斾笉鏄撲簬璋冭瘯銆?br />2. Reactor妯″紡闇瑕佸簳灞傜殑Synchronous Event Demultiplexer鏀寔錛屾瘮濡侸ava涓殑Selector鏀寔錛屾搷浣滅郴緇熺殑select緋葷粺璋冪敤鏀寔錛屽鏋滆鑷繁瀹炵幇Synchronous Event Demultiplexer鍙兘涓嶄細(xì)鏈夐偅涔堥珮鏁堛?br />3. Reactor妯″紡鍦↖O璇誨啓鏁版嵁鏃惰繕鏄湪鍚屼竴涓嚎紼嬩腑瀹炵幇鐨勶紝鍗充嬌浣跨敤澶氫釜Reactor鏈哄埗鐨勬儏鍐典笅錛岄偅浜涘叡浜竴涓猂eactor鐨凜hannel濡傛灉鍑虹幇涓涓暱鏃墮棿鐨勬暟鎹鍐欙紝浼?xì)濯?jiǎng)鍝嶈繖涓猂eactor涓叾浠朇hannel鐨勭浉搴旀椂闂達(dá)紝姣斿鍦ㄥぇ鏂囦歡浼犺緭鏃訛紝IO鎿嶄綔灝變細(xì)褰卞搷鍏朵粬Client鐨勭浉搴旀椂闂達(dá)紝鍥犺屽榪欑鎿嶄綔錛屼嬌鐢ㄤ紶緇熺殑Thread-Per-Connection鎴栬鏄竴涓洿濂界殑閫夋嫨錛屾垨鍒欐鏃朵嬌鐢≒roactor妯″紡銆?br />

鍙傝?/h2>Reactor Pattern WikiPedia
Reactor An Object Behavioral Pattern for Demultiplexing and Dispatching Handles for Synchronous Events
Scalable IO In Java
C10K Problem WikiPedia



paulwong 2015-09-08 12:28 鍙戣〃璇勮
]]>
Netty3鏋舵瀯瑙f瀽http://m.tkk7.com/paulwong/archive/2015/09/08/427186.htmlpaulwongpaulwongTue, 08 Sep 2015 03:11:00 GMThttp://m.tkk7.com/paulwong/archive/2015/09/08/427186.htmlhttp://m.tkk7.com/paulwong/comments/427186.htmlhttp://m.tkk7.com/paulwong/archive/2015/09/08/427186.html#Feedback0http://m.tkk7.com/paulwong/comments/commentRss/427186.htmlhttp://m.tkk7.com/paulwong/services/trackbacks/427186.html

鍓嶈

寰堟棭浠ュ墠灝辨湁璇籒etty婧愮爜鐨勬墦綆椾簡(jiǎn)錛岀劧鑰岀涓嬈″皾璇曠殑鏃跺欎粠Netty4寮濮嬶紝涓鐩存姄涓嶅埌鏍稿績(jī)鐨勬鏋舵祦紼嬶紝鍚庢潵鍥犱負(fù)鍏朵粬浜嬫儏蹇欑潃灝辨斁涓嬩簡(jiǎn)銆傝繖嬈¤秮鐫浼戝亣閲嶆柊鎹¤搗榪欎釜紜澶達(dá)紝鍥犱負(fù)Netty3鐜板湪榪樺湪琚緢澶氶」鐩嬌鐢紝鍥犺岃繖嬈″喅瀹氬厛浠嶯etty3鍏ユ墜錛岀灛闂村彂鐜癗etty3鐨勪唬鐮佹瘮Netty4涓涓煩鐨勫錛屽緢澶氭蹇靛湪浠g爜鏈韓涓兘鏈夋竻鏅扮殑琛ㄨ揪錛屾墍浠ュ崐澶╁氨鎶婃暣涓鏋剁殑楠ㄦ灦鎼炴竻妤氫簡(jiǎn)銆傚啀璇?/span>Netty4瀵筃etty3鐨勬敼榪涙葷粨錛屽洖鍘昏Netty4鐨勬簮鐮侊紝鍙嶈岃寰楄交鏉句簡(jiǎn)錛屼竴縐嶈眮鐒跺紑鏈楃殑鎰熻銆?/span>

璁板緱鍘誨勾璇籎etty婧愮爜鐨勬椂鍊欙紝鍥犱負(fù)浠g爜澶簽澶э紝騫朵笖鑷繁鐨凥TTP Server鐨勪簡(jiǎn)瑙eお灝戯紝鍥犺屽彧鑳借嚜搴曞悜涓婄殑涓涓竴涓ā鍧楃殑鍙犲姞錛岀洿鍒版渶鍚庢妸鎵浠ョ殑妯″潡榪炴帴鍦ㄤ竴璧瘋(gè)岀湅娓呭畠鐨勭湡姝f牳蹇?jī)楠ㄦ灦銆傜幇鍦ㄨ婧愮爜錛屽紑濮嬩範(fàn)鎯厛鎶婇鏋剁悊娓咃紝鐒跺悗寤朵幾鍒頒笉鍚岀殑鍣ㄥ畼銆佽鑲夎岀湅娓呮暣涓漢浣撱?/span>

鏈枃浠嶳eactor妯″紡鍦∟etty3涓殑搴旂敤錛屽紩鍑篘etty3鐨勬暣浣撴灦鏋勪互鍙?qiáng)鎺у埗娴伣E嬶紱鐒惰岄櫎浜?jiǎn)Reactor妯″紡錛孨etty3榪樺湪ChannelPipeline涓嬌鐢ㄤ簡(jiǎn)Intercepting Filter妯″紡錛岃繖涓ā寮忎篃鍦⊿ervlet鐨凢ilter涓垚鍔熶嬌鐢紝鍥犺屾湰鏂囪繕浼?xì)浠嶪ntercepting Filter妯″紡鍑哄彂璇︾粏浠嬬粛ChannelPipeline鐨勮璁$悊蹇點(diǎn)傛湰鏂囧亣璁捐鑰呭凡緇忓Netty鏈変竴瀹氱殑浜?jiǎn)瑙eQ屽洜鑰屼笉浼?xì)鍖呭惈杩囧鍏ラ棬浠嬀l嶏紝浠ュ強(qiáng)甯甆etty鍋氬浼犵殑鏂囧瓧銆?/span>

Netty3涓殑Reactor妯″紡

Reactor妯″紡鍦∟etty涓簲鐢ㄩ潪甯告垚鍔燂紝鍥犺屽畠涔熸槸鍦∟etty涓彈澶ц倖瀹d紶鐨勬ā寮忥紝鍏充簬Reactor妯″紡鍙互璇︾粏鍙傝冩湰浜虹殑鍙︿竴綃囨枃绔?/span>銆奟eactor妯″紡璇﹁В銆?/a>錛屽Reactor妯″紡鐨勫疄鐜版槸Netty3鐨勫熀鏈鏋訛紝鍥犺屾湰灝忚妭浼?xì)璇l嗕粙緇峈eactor妯″紡濡備綍搴旂敤Netty3涓?/span>

濡傛灉璇匯奟eactor妯″紡璇﹁В銆嬶紝鎴戜滑鐭ラ亾Reactor妯″紡鐢盚andle銆丼ynchronous Event Demultiplexer銆両nitiation Dispatcher銆丒vent Handler銆丆oncrete Event Handler鏋勬垚錛屽湪Java鐨勫疄鐜扮増鏈腑錛孋hannel瀵瑰簲Handle錛孲elector瀵瑰簲Synchronous Event Demultiplexer錛屽茍涓擭etty3榪樹嬌鐢ㄤ簡(jiǎn)涓ゅ眰Reactor錛歁ain Reactor鐢ㄤ簬澶勭悊Client鐨勮繛鎺ヨ姹傦紝Sub Reactor鐢ㄤ簬澶勭悊鍜孋lient榪炴帴鍚庣殑璇誨啓璇鋒眰錛堝叧浜庤繖涓蹇佃繕鍙互鍙傝僁oug Lea鐨勮繖綃嘝PT錛?/span>
Scalable IO In Java錛夈傛墍浠ユ垜浠厛瑕佽В鍐砃etty3涓嬌鐢ㄤ粈涔堢被瀹炵幇鎵鏈夌殑涓婅堪妯″潡騫舵妸浠栦滑鑱旂郴鍦ㄤ竴璧風(fēng)殑錛屼互NIO瀹炵幇鏂瑰紡涓轟緥錛?/span>

妯″紡鏄竴縐嶆娊璞★紝浣嗘槸鍦ㄥ疄鐜頒腑錛岀粡甯鎬細(xì)鍥犱負(fù)璇█鐗規(guī)с佹鏋跺拰鎬ц兘闇瑕佽屽仛涓浜涙敼鍙橈紝鍥犺孨etty3瀵筊eactor妯″紡鐨勫疄鐜版湁涓濂楄嚜宸辯殑璁捐錛?br />
1. ChannelEvent錛?/strong>Reactor鏄熀浜庝簨浠剁紪紼嬬殑錛屽洜鑰屽湪Netty3涓嬌鐢–hannelEvent鎶借薄鐨勮〃杈綨etty3鍐呴儴鍙互浜х敓鐨勫悇縐嶄簨浠訛紝鎵鏈夎繖浜涗簨浠跺璞″湪Channels甯姪綾諱腑浜х敓錛屽茍涓旂敱瀹冨皢浜嬩歡鎺ㄥ叆鍒癈hannelPipeline涓紝ChannelPipeline鏋勫緩ChannelHandler綆¢亾錛孋hannelEvent嫻佺粡榪欎釜綆¢亾瀹炵幇鎵鏈夌殑涓氬姟閫昏緫澶勭悊銆侰hannelEvent瀵瑰簲鐨勪簨浠舵湁錛欳hannelStateEvent琛ㄧずChannel鐘舵佺殑鍙樺寲浜嬩歡錛岃屽鏋滃綋鍓岰hannel瀛樺湪Parent Channel錛屽垯璇ヤ簨浠惰繕浼?xì)浼犻掑埌Parent Channel鐨凜hannelPipeline涓紝濡侽PEN銆丅OUND銆丆ONNECTED銆両NTEREST_OPS絳夛紝璇ヤ簨浠跺彲浠ュ湪鍚勭涓嶅悓瀹炵幇鐨凜hannel銆丆hannelSink涓駭鐢燂紱MessageEvent琛ㄧず浠嶴ocket涓鍙栨暟鎹畬鎴愩侀渶瑕佸悜Socket鍐欐暟鎹垨ChannelHandler瀵瑰綋鍓峂essage瑙f瀽(濡侱ecoder銆丒ncoder)鍚庤Е鍙戠殑浜嬩歡錛屽畠鐢盢ioWorker銆侀渶瑕佸Message鍋氳繘涓姝ュ鐞嗙殑ChannelHandler浜х敓錛沇riteCompletionEvent琛ㄧず鍐欏畬鎴愯岃Е鍙戠殑浜嬩歡錛屽畠鐢盢ioWorker浜х敓錛汦xceptionEvent琛ㄧず鍦ㄥ鐞嗚繃紼嬩腑鍑虹幇鐨凟xception錛屽畠鍙互鍙戠敓鍦ㄥ悇涓瀯浠朵腑錛屽Channel銆丆hannelSink銆丯ioWorker銆丆hannelHandler涓紱IdleStateEvent鐢盜dleStateHandler瑙﹀彂錛岃繖涔熸槸涓涓狢hannelEvent鍙互鏃犵紳鎵╁睍鐨勪緥瀛愩傛敞錛氬湪Netty4鍚庯紝宸茬粡娌℃湁ChannelEvent綾伙紝鎵鏈変笉鍚屼簨浠墮兘鐢ㄥ搴旀柟娉曡〃杈撅紝榪欎篃鎰忓懗榪機(jī)hannelEvent涓嶅彲鎵╁睍錛孨etty4閲囩敤鍦–hannelInboundHandler涓姞鍏serEventTriggered()鏂規(guī)硶鏉ュ疄鐜拌繖縐嶆墿灞曪紝鍏蜂綋鍙互鍙傝?/span>榪欓噷銆?br />
2. ChannelHandler錛?/strong>鍦∟etty3涓紝ChannelHandler鐢ㄤ簬琛ㄧずReactor妯″紡涓殑EventHandler銆侰hannelHandler鍙槸涓涓爣璁版帴鍙o紝瀹冩湁涓や釜瀛愭帴鍙o細(xì)ChannelDownstreamHandler鍜孋hannelUpstreamHandler錛屽叾涓瑿hannelDownstreamHandler琛ㄧず浠庣敤鎴峰簲鐢ㄧ▼搴忔祦鍚慛etty3鍐呴儴鐩村埌鍚慡ocket鍐欐暟鎹殑綆¢亾錛屽湪Netty4涓敼鍚嶄負(fù)ChannelOutboundHandler錛汣hannelUpstreamHandler琛ㄧず鏁版嵁浠嶴ocket榪涘叆Netty3鍐呴儴鍚戠敤鎴峰簲鐢ㄧ▼搴忓仛鏁版嵁澶勭悊鐨勭閬擄紝鍦∟etty4涓敼鍚嶄負(fù)ChannelInboundHandler銆?br />
3. ChannelPipeline錛?/strong>鐢ㄤ簬綆$悊ChannelHandler鐨勭閬擄紝姣忎釜Channel涓涓狢hannelPipeline瀹炰緥錛屽彲浠ヨ繍琛岃繃紼嬩腑鍔ㄦ佺殑鍚戣繖涓閬撲腑娣誨姞銆佸垹闄hannelHandler錛堢敱浜庡疄鐜扮殑闄愬埗錛屽湪鏈鏈鐨凜hannelHandler鍚戝悗娣誨姞鎴栧垹闄hannelHandler涓嶄竴瀹氬湪褰撳墠鎵ц嫻佺▼涓搗鏁堬紝鍙傝?/span>榪欓噷錛夈侰hannelPipeline鍐呴儴緇存姢涓涓狢hannelHandler鐨勫弻鍚戦摼琛紝瀹冧互Upstream(Inbound)鏂瑰悜涓烘鍚戯紝Downstream(Outbound)鏂瑰悜涓烘柟鍚戙侰hannelPipeline閲囩敤Intercepting Filter妯″紡瀹炵幇錛屽叿浣撳彲浠ュ弬鑰?/span>榪欓噷錛岃繖涓ā寮忕殑瀹炵幇鍦ㄥ悗涓鑺備腑榪樻槸璇︾粏浠嬬粛銆?br />
4. NioSelector錛?/strong>Netty3浣跨敤NioSelector鏉ュ瓨鏀維elector錛圫ynchronous Event Demultiplexer錛夛紝姣忎釜鏂頒駭鐢熺殑NIO Channel閮藉悜榪欎釜Selector娉ㄥ唽鑷繁浠ヨ榪欎釜Selector鐩戝惉榪欎釜NIO Channel涓彂鐢熺殑浜嬩歡錛屽綋浜嬩歡鍙戠敓鏃訛紝璋冪敤甯姪綾籆hannels涓殑鏂規(guī)硶鐢熸垚ChannelEvent瀹炰緥錛屽皢璇ヤ簨浠跺彂閫佸埌榪欎釜Netty Channel瀵瑰簲鐨凜hannelPipeline涓紝鑰屼氦緇欏悇綰hannelHandler澶勭悊銆傚叾涓湪鍚慡elector娉ㄥ唽NIO Channel鏃訛紝Netty Channel瀹炰緥浠ttachment鐨勫艦寮忎紶鍏ワ紝璇etty Channel鍦ㄥ叾鍐呴儴鐨凬IO Channel浜嬩歡鍙戠敓鏃訛紝浼?xì)浠ttachment鐨勫艦寮忓瓨鍦ㄤ簬SelectionKey涓紝鍥犺屾瘡涓簨浠跺彲浠ョ洿鎺ヤ粠榪欎釜Attachment涓幏鍙栫浉鍏抽摼鐨凬etty Channel錛屽茍浠嶯etty Channel涓幏鍙栦笌涔嬬浉鍏寵仈鐨凜hannelPipeline錛岃繖涓疄鐜板拰Doug Lea鐨?/span>Scalable IO In Java涓妯′竴鏍楓傚彟澶朜etty3榪橀噰鐢ㄤ簡(jiǎn)Scalable IO In Java涓浉鍚岀殑Main Reactor鍜孲ub Reactor璁捐錛屽叾涓璑ioSelector鐨勪袱涓疄鐜幫細(xì)Boss鍗充負(fù)Main Reactor錛孨ioWorker涓篠ub Reactor銆侭oss鐢ㄦ潵澶勭悊鏂拌繛鎺ュ姞鍏ョ殑浜嬩歡錛孨ioWorker鐢ㄦ潵澶勭悊鍚勪釜榪炴帴瀵筍ocket鐨勮鍐欎簨浠訛紝鍏朵腑Boss閫氳繃NioWorkerPool鑾峰彇NioWorker瀹炰緥錛孨etty3妯″紡浣跨敤RoundRobin鏂瑰紡鏀懼洖NioWorker瀹炰緥銆傛洿褰㈣薄涓鐐圭殑錛屽彲浠ラ氳繃Scalable IO In Java鐨勮繖寮犲浘琛ㄨ揪錛?br />

鑻ヤ笌Ractor妯″紡瀵瑰簲錛孨ioSelector涓寘鍚簡(jiǎn)Synchronous Event Demultiplexer錛岃孋hannelPipeline涓鐞嗙潃鎵鏈塃ventHandler錛屽洜鑰孨ioSelector鍜孋hannelPipeline鍏卞悓鏋勬垚浜?jiǎn)Initiation Dispatcher銆?br />
5. ChannelSink錛?/strong>鍦–hannelHandler澶勭悊瀹屾垚鎵鏈夐昏緫闇瑕佸悜瀹㈡埛绔啓鍝嶅簲鏁版嵁鏃訛紝涓鑸細(xì)璋冪敤Netty Channel涓殑write鏂規(guī)硶錛岀劧鑰屽湪榪欎釜write鏂規(guī)硶瀹炵幇涓紝瀹冧笉鏄洿鎺ュ悜鍏跺唴閮ㄧ殑Socket鍐欐暟鎹紝鑰屾槸浜ょ粰C(jī)hannels甯姪綾伙紝鍐呴儴鍒涘緩DownstreamMessageEvent錛屽弽鍚戜粠ChannelPipeline鐨勭閬撲腑嫻佽繃鍘伙紝鐩村埌絎竴涓狢hannelHandler澶勭悊瀹屾瘯錛屾渶鍚庝氦緇機(jī)hannelSink澶勭悊錛屼互閬垮厤闃誨鍐欒屽獎(jiǎng)鍝嶇▼搴忕殑鍚炲悙閲忋侰hannelSink灝嗚繖涓狹essageEvent鎻愪氦緇橬etty Channel涓殑writeBufferQueue錛屾渶鍚嶯ioWorker浼?xì)绛夊埌杩欎釜NIO Channel宸茬粡鍙互澶勭悊鍐欎簨浠舵椂鏃犻樆濉炵殑鍚戣繖涓狽IO Channel鍐欐暟鎹傝繖灝辨槸涓婂浘鐨剆end鏄粠SubReactor鐩存帴鍑哄彂鐨勫師鍥犮?br />
6. Channel錛?/strong>Netty鏈夎嚜宸辯殑Channel鎶借薄錛屽畠鏄竴涓祫婧愮殑瀹瑰櫒錛屽寘鍚簡(jiǎn)鎵鏈変竴涓繛鎺ユ秹鍙?qiáng)鍒扮殑鎵鏈夎祫婧愮殑楗敤錛屽灝佽NIO Channel銆丆hannelPipeline銆丅oss銆丯ioWorkerPool絳夈傚彟澶栧畠榪樻彁渚涗簡(jiǎn)鍚戝唴閮∟IO Channel鍐欏搷搴旀暟鎹殑鎺ュ彛write銆佽繛鎺?緇戝畾鍒版煇涓湴鍧鐨刢onnect/bind鎺ュ彛絳夛紝涓漢鎰熻铏界劧瀵笴hannel鏈韓鏉ヨ錛屽洜涓哄畠?yōu)畞瑁呬簡(jiǎn)NIO Channel錛屽洜鑰岃繖浜涙帴鍙e畾涔夊湪榪欓噷鏄悎鐞嗙殑錛屼絾鏄鏋滆冭檻鍒癗etty鐨勬灦鏋勶紝瀹冪殑Channel鍙槸涓涓祫婧愬鍣紝鏈夎繖涓狢hannel瀹炰緥灝卞彲浠ュ緱鍒板拰瀹冪浉鍏崇殑鍩烘湰鎵鏈夎祫婧愶紝鍥犺岃繖縐峸rite銆乧onnect銆乥ind鍔ㄤ綔涓嶅簲璇ュ啀鐢卞畠璐熻矗錛岃屾槸搴旇鐢卞叾浠栫被鏉ヨ礋璐o紝姣斿鍦∟etty4涓氨鍦–hannelHandlerContext娣誨姞浜?jiǎn)write鏂規(guī)硶錛岃櫧鐒秐etty4騫舵病鏈夊垹闄hannel涓殑write鎺ュ彛銆?/span>

Netty3涓殑Intercepting Filter妯″紡

濡傛灉璇碦eactor妯″紡鏄疦etty3鐨勯鏋訛紝閭d箞Intercepting Filter妯″紡鍒欐槸Netty鐨勪腑鏋€俁eactor妯″紡涓昏搴旂敤鍦∟etty3鐨勫唴閮ㄥ疄鐜幫紝瀹冩槸Netty3鍏鋒湁鑹ソ鎬ц兘鐨勫熀紜錛岃孖ntercepting Filter妯″紡鍒欐槸ChannelHandler緇勫悎瀹炵幇涓涓簲鐢ㄧ▼搴忛昏緫鐨勫熀紜錛屽彧鏈夊緢濂界殑鐞嗚В浜?jiǎn)杩欎釜妯″紡鎵嶈兘鋴社敤濂絅etty錛岀敋鑷寵兘寰楀績(jī)搴旀墜銆?/span>

鍏充簬Intercepting Filter妯″紡鐨勮緇嗕粙緇嶅彲浠ュ弬鑰?/span>榪欓噷錛屾湰鑺備富瑕佷粙緇峃etty3涓Intercepting Filter妯″紡鐨勫疄鐜幫紝鍏跺疄灝辨槸DefaultChannelPipeline瀵笽ntercepting Filter妯″紡鐨勫疄鐜般傚湪涓婃枃鏈夋彁鍒癗etty3鐨凜hannelPipeline鏄疌hannelHandler鐨勫鍣紝鐢ㄤ簬瀛樺偍涓庣鐞咰hannelHandler錛屽悓鏃跺畠鍦∟etty3涓篃璧峰埌妗ユ鐨勪綔鐢紝鍗沖畠鏄繛鎺etty3鍐呴儴鍒版墍鏈塁hannelHandler鐨勬ˉ姊併備綔涓篊hannelPipeline鐨勫疄鐜拌匘efaultChannelPipeline錛屽畠浣跨敤涓涓狢hannelHandler鐨勫弻鍚戦摼琛ㄦ潵瀛樺偍錛屼互DefaultChannelPipelineContext浣滀負(fù)鑺傜偣錛?br />
public interface ChannelHandlerContext {
    Channel getChannel();
    ChannelPipeline getPipeline();
    String getName();
    ChannelHandler getHandler();
    boolean canHandleUpstream();
    boolean canHandleDownstream();
    void sendUpstream(ChannelEvent e);
    void sendDownstream(ChannelEvent e);
    Object getAttachment();
    void setAttachment(Object attachment);
}

private final class DefaultChannelHandlerContext implements ChannelHandlerContext {
    volatile DefaultChannelHandlerContext next;
    volatile DefaultChannelHandlerContext prev;
    private final String name;
    private final ChannelHandler handler;
    private final boolean canHandleUpstream;
    private final boolean canHandleDownstream;
    private volatile Object attachment;
..
}

鍦―efaultChannelPipeline涓紝瀹冨瓨鍌ㄤ簡(jiǎn)鍜屽綋鍓岰hannelPipeline鐩稿叧鑱旂殑Channel銆丆hannelSink浠ュ強(qiáng)ChannelHandler閾捐〃鐨刪ead銆乼ail錛屾墍鏈塁hannelEvent閫氳繃sendUpstream銆乻endDownstream涓哄叆鍙f祦緇忔暣涓摼琛細(xì)

public class DefaultChannelPipeline implements ChannelPipeline {
    private volatile Channel channel;
    private volatile ChannelSink sink;
    private volatile DefaultChannelHandlerContext head;
    private volatile DefaultChannelHandlerContext tail;

    public void sendUpstream(ChannelEvent e) {
        DefaultChannelHandlerContext head = getActualUpstreamContext(this.head);
        if (head == null) {
            return;
        }
        sendUpstream(head, e);
    }

    void sendUpstream(DefaultChannelHandlerContext ctx, ChannelEvent e) {
        try {
            ((ChannelUpstreamHandler) ctx.getHandler()).handleUpstream(ctx, e);
        } catch (Throwable t) {
            notifyHandlerException(e, t);
        }
    }

    public void sendDownstream(ChannelEvent e) {
        DefaultChannelHandlerContext tail = getActualDownstreamContext(this.tail);
        if (tail == null) {
            try {
                getSink().eventSunk(this, e);
                return;
            } catch (Throwable t) {
                notifyHandlerException(e, t);
                return;
            }
        }
        sendDownstream(tail, e);
    }

    void sendDownstream(DefaultChannelHandlerContext ctx, ChannelEvent e) {
        if (e instanceof UpstreamMessageEvent) {
            throw new IllegalArgumentException("cannot send an upstream event to downstream");
        }
        try {
            ((ChannelDownstreamHandler) ctx.getHandler()).handleDownstream(ctx, e);
        } catch (Throwable t) {
            e.getFuture().setFailure(t);
            notifyHandlerException(e, t);
        }
    }

瀵筓pstream浜嬩歡錛屽悜鍚庢壘鍒版墍鏈夊疄鐜頒簡(jiǎn)ChannelUpstreamHandler鎺ュ彛鐨凜hannelHandler緇勬垚閾撅紙
getActualUpstreamContext()錛?/span>錛岃屽Downstream浜嬩歡錛屽悜鍓嶆壘鍒版墍鏈夊疄鐜頒簡(jiǎn)ChannelDownstreamHandler鎺ュ彛鐨凜hannelHandler緇勬垚閾撅紙getActualDownstreamContext()錛夛細(xì)

    private DefaultChannelHandlerContext getActualUpstreamContext(DefaultChannelHandlerContext ctx) {
        if (ctx == null) {
            return null;
        }
        DefaultChannelHandlerContext realCtx = ctx;
        while (!realCtx.canHandleUpstream()) {
            realCtx = realCtx.next;
            if (realCtx == null) {
                return null;
            }
        }
        return realCtx;
    }
    private DefaultChannelHandlerContext getActualDownstreamContext(DefaultChannelHandlerContext ctx) {
        if (ctx == null) {
            return null;
        }
        DefaultChannelHandlerContext realCtx = ctx;
        while (!realCtx.canHandleDownstream()) {
            realCtx = realCtx.prev;
            if (realCtx == null) {
                return null;
            }
        }
        return realCtx;
    }

鍦ㄥ疄闄呭疄鐜癈hannelUpstreamHandler鎴朇hannelDownstreamHandler鏃訛紝璋冪敤 ChannelHandlerContext涓殑sendUpstream鎴杝endDownstream鏂規(guī)硶灝嗘帶鍒舵祦紼嬩氦緇欎笅涓涓?ChannelUpstreamHandler鎴栦笅涓涓狢hannelDownstreamHandler錛屾垨璋冪敤Channel涓殑write鏂規(guī)硶鍙戦?鍝嶅簲娑堟伅銆?br />
public class MyChannelUpstreamHandler implements ChannelUpstreamHandler {
    public void handleUpstream(ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
        // handle current logic, use Channel to write response if needed.
        
// ctx.getChannel().write(message);
        ctx.sendUpstream(e);
    }
}

public class MyChannelDownstreamHandler implements ChannelDownstreamHandler {
    public void handleDownstream(
            ChannelHandlerContext ctx, ChannelEvent e) throws Exception {
        // handle current logic
        ctx.sendDownstream(e);
    }
}

褰揅hannelHandler鍚慍hannelPipelineContext鍙戦佷簨浠舵椂錛屽叾鍐呴儴浠庡綋鍓岰hannelPipelineContext鑺傜偣鍑哄彂鎵懼埌涓嬩竴涓狢hannelUpstreamHandler鎴朇hannelDownstreamHandler瀹炰緥錛屽茍鍚戝叾鍙戦丆hannelEvent錛屽浜嶥ownstream閾撅紝濡傛灉鍒拌揪閾懼熬錛屽垯灝咰hannelEvent鍙戦佺粰C(jī)hannelSink錛?br />
public void sendDownstream(ChannelEvent e) {
    DefaultChannelHandlerContext prev = getActualDownstreamContext(this.prev);
    if (prev == null) {
        try {
            getSink().eventSunk(DefaultChannelPipeline.this, e);
        } catch (Throwable t) {
            notifyHandlerException(e, t);
        }
    } else {
        DefaultChannelPipeline.this.sendDownstream(prev, e);
    }
}

public void sendUpstream(ChannelEvent e) {
    DefaultChannelHandlerContext next = getActualUpstreamContext(this.next);
    if (next != null) {
        DefaultChannelPipeline.this.sendUpstream(next, e);
    }
}

姝f槸鍥犱負(fù)榪欎釜瀹炵幇錛屽鏋滃湪涓涓湯灝劇殑ChannelUpstreamHandler涓厛縐婚櫎鑷繁錛屽湪鍚戞湯灝炬坊鍔犱竴涓柊鐨凜hannelUpstreamHandler錛屽畠鏄棤鏁堢殑錛屽洜涓哄畠鐨刵ext宸茬粡鍦ㄨ皟鐢ㄥ墠灝卞浐瀹氳緗負(fù)null浜?jiǎn)銆?/span>

ChannelPipeline浣滀負(fù)ChannelHandler鐨勫鍣紝瀹冭繕鎻愪緵浜?jiǎn)鍚効U嶅銆佸垹銆佹敼ChannelHandler閾捐〃涓殑鏂規(guī)硶錛岃屼笖濡傛灉鏌愪釜ChannelHandler榪樺疄鐜頒簡(jiǎn)LifeCycleAwareChannelHandler錛屽垯璇hannelHandler鍦ㄨ娣誨姞榪汣hannelPipeline鎴栦粠涓垹闄ゆ椂閮戒細(xì)寰楀埌鍚屽織錛?br />
public interface LifeCycleAwareChannelHandler extends ChannelHandler {
    void beforeAdd(ChannelHandlerContext ctx) throws Exception;
    void afterAdd(ChannelHandlerContext ctx) throws Exception;
    void beforeRemove(ChannelHandlerContext ctx) throws Exception;
    void afterRemove(ChannelHandlerContext ctx) throws Exception;
}

public interface ChannelPipeline {
    void addFirst(String name, ChannelHandler handler);
    void addLast(String name, ChannelHandler handler);
    void addBefore(String baseName, String name, ChannelHandler handler);
    void addAfter(String baseName, String name, ChannelHandler handler);
    void remove(ChannelHandler handler);
    ChannelHandler remove(String name);
    <T extends ChannelHandler> T remove(Class<T> handlerType);
    ChannelHandler removeFirst();
    ChannelHandler removeLast();
    void replace(ChannelHandler oldHandler, String newName, ChannelHandler newHandler);
    ChannelHandler replace(String oldName, String newName, ChannelHandler newHandler);
    <T extends ChannelHandler> T replace(Class<T> oldHandlerType, String newName, ChannelHandler newHandler);
    ChannelHandler getFirst();
    ChannelHandler getLast();
    ChannelHandler get(String name);
    <T extends ChannelHandler> T get(Class<T> handlerType);
    ChannelHandlerContext getContext(ChannelHandler handler);
    ChannelHandlerContext getContext(String name);
    ChannelHandlerContext getContext(Class<? extends ChannelHandler> handlerType);
    void sendUpstream(ChannelEvent e);
    void sendDownstream(ChannelEvent e);
    ChannelFuture execute(Runnable task);
    Channel getChannel();
    ChannelSink getSink();
    void attach(Channel channel, ChannelSink sink);
    boolean isAttached();
    List<String> getNames();
    Map<String, ChannelHandler> toMap();
}

鍦―efaultChannelPipeline鐨凜hannelHandler閾炬潯鐨勫鐞嗘祦紼嬩負(fù)錛?/span>


http://m.tkk7.com/DLevin/archive/2015/09/04/427031.html


鍙傝冿細(xì)

銆奛etty涓婚〉銆?/a>
銆奛etty婧愮爜瑙h錛堝洓錛塏etty涓嶳eactor妯″紡銆?/a>
銆奛etty浠g爜鍒嗘瀽銆?/a>
Scalable IO In Java
Intercepting Filter Pattern

paulwong 2015-09-08 11:11 鍙戣〃璇勮
]]>
100涓囧茍鍙戣繛鎺ユ湇鍔″櫒絎旇涔婮ava Netty澶勭悊1M榪炴帴浼?xì)鎬庝箞鏍?/title><link>http://m.tkk7.com/paulwong/archive/2015/07/13/426202.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 13 Jul 2015 10:26:00 GMT</pubDate><guid>http://m.tkk7.com/paulwong/archive/2015/07/13/426202.html</guid><wfw:comment>http://m.tkk7.com/paulwong/comments/426202.html</wfw:comment><comments>http://m.tkk7.com/paulwong/archive/2015/07/13/426202.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/paulwong/comments/commentRss/426202.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/paulwong/services/trackbacks/426202.html</trackback:ping><description><![CDATA[     鎽樿: 鍓嶈█姣忎竴縐嶈璇█鍦ㄦ煇浜涙瀬闄愭儏鍐典笅鐨勮〃鐜頒竴鑸兘涓嶅お涓鏍鳳紝閭d箞鎴戝父鐢ㄧ殑Java璇█錛屽湪杈懼埌100涓囦釜騫跺彂榪炴帴鎯呭喌涓嬶紝浼?xì)鎬庝箞鏍峰憿錛屾湁浜涘ソ濂囷紝鏇存湁浜涙湡鐩箋傝繖嬈′嬌鐢ㄧ粡甯鎬嬌鐢ㄧ殑欏烘墜鐨刵etty NIO妗嗘灦錛坣etty-3.6.5.Final錛夛紝灝佽鐨勫緢濂斤紝鎺ュ彛寰堝叏闈紝灝卞儚瀹冪幇鍦ㄧ殑鍩熷悕 netty.io錛屼笓娉ㄤ簬緗戠粶IO銆傛暣涓繃紼嬫病鏈変粈涔堟妧鏈惈閲忥紝嫻呮樉鍒嗘瀽榪囧氨鏇存樉寰楁湁浜涙灟鐕ユ棤鑱婏紝鍑嗗濂斤紝紜潃澶?..  <a href='http://m.tkk7.com/paulwong/archive/2015/07/13/426202.html'>闃呰鍏ㄦ枃</a><img src ="http://m.tkk7.com/paulwong/aggbug/426202.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/paulwong/" target="_blank">paulwong</a> 2015-07-13 18:26 <a href="http://m.tkk7.com/paulwong/archive/2015/07/13/426202.html#Feedback" target="_blank" style="text-decoration:none;">鍙戣〃璇勮</a></div>]]></description></item><item><title>杞婚噺綰с侀珮鎬ц兘NIO緗戠粶閫氳妗嗘灦錛坅round 60K錛?zbushttp://m.tkk7.com/paulwong/archive/2015/04/22/424600.htmlpaulwongpaulwongWed, 22 Apr 2015 07:53:00 GMThttp://m.tkk7.com/paulwong/archive/2015/04/22/424600.htmlhttp://m.tkk7.com/paulwong/comments/424600.htmlhttp://m.tkk7.com/paulwong/archive/2015/04/22/424600.html#Feedback0http://m.tkk7.com/paulwong/comments/commentRss/424600.htmlhttp://m.tkk7.com/paulwong/services/trackbacks/424600.htmlhttp://git.oschina.net/rushmore/zbus

涓轟粈涔堟病鏈夐夋嫨netty鎴栬卪ina錛?br />涓漢瑙傜偣錛歯etty涓巑ina榪囦簬搴炲ぇ錛岄渶瑕佸涔?fàn)鐨勬垚鏈瘮杈冮珮锛宒ebug涓殑chain榪囬暱錛岃嚜宸變笉鏂逛究鏀瑰啓

paulwong 2015-04-22 15:53 鍙戣〃璇勮
]]>
commonrpc 0.1 鍙戝竷錛岄珮鎬ц兘鍒嗗竷寮?RPC 妗嗘灦http://m.tkk7.com/paulwong/archive/2015/03/12/423414.htmlpaulwongpaulwongThu, 12 Mar 2015 11:02:00 GMThttp://m.tkk7.com/paulwong/archive/2015/03/12/423414.htmlhttp://m.tkk7.com/paulwong/comments/423414.htmlhttp://m.tkk7.com/paulwong/archive/2015/03/12/423414.html#Feedback0http://m.tkk7.com/paulwong/comments/commentRss/423414.htmlhttp://m.tkk7.com/paulwong/services/trackbacks/423414.html榪樺湪緹℃厱BAT錛屼含涓滅瓑鍏徃鐨勫ぇ嫻侀噺鐨勬灦鏋勫悧錛熻浣犵殑java緋葷粺寮曠敤瑙h︼紝浜掔浉鐙珛,commonrpc 灝卞彲浠ュ姙鍒般俢ommonrpc 鏄竴涓互netty涓哄熀紜錛宻pring 鑷畾涔塻hcema涓哄熀紜鏍囩鐨剅pc妗嗘灦,涓嶄鏡鍏ヤ換浣曚笟鍔′唬鐮侊紝涓涓珮鎬ц兘鍒嗗竷寮弐pc妗嗘灦錛屾敮鎸乼cp鍗忚,http鍗忚,鍚屾椂HTTP鍗忚鏀寔restful 鏂瑰紡璁塊棶.

paulwong 2015-03-12 19:02 鍙戣〃璇勮
]]>
NETTY璧勬簮http://m.tkk7.com/paulwong/archive/2015/02/26/423039.htmlpaulwongpaulwongThu, 26 Feb 2015 01:49:00 GMThttp://m.tkk7.com/paulwong/archive/2015/02/26/423039.htmlhttp://m.tkk7.com/paulwong/comments/423039.htmlhttp://m.tkk7.com/paulwong/archive/2015/02/26/423039.html#Feedback0http://m.tkk7.com/paulwong/comments/commentRss/423039.htmlhttp://m.tkk7.com/paulwong/services/trackbacks/423039.htmlNetty4.0瀛︿範(fàn)絎旇緋誨垪涔嬩竴錛歋erver涓嶤lient鐨勯氳

Netty4.0瀛︿範(fàn)絎旇緋誨垪涔嬩簩錛欻andler鐨勬墽琛岄『搴?/a>


Netty4.0瀛︿範(fàn)絎旇緋誨垪涔嬩笁錛氭瀯寤虹畝鍗曠殑http鏈嶅姟


Netty4.0瀛︿範(fàn)絎旇緋誨垪涔嬪洓錛氭販鍚堜嬌鐢╟oder鍜宧andler


Netty4.0瀛︿範(fàn)絎旇緋誨垪涔嬩簲錛氳嚜瀹氫箟閫氳鍗忚

Netty4.0瀛︿範(fàn)絎旇緋誨垪涔嬪叚錛氬縐嶉氳鍗忚鏀寔


NETTY HTTP JAX-RS鏈嶅姟鍣?/span>
https://github.com/continuuity/netty-http

netty鍜宼omcat鐨刪ello world鎬ц兘姣旇緝
http://my.oschina.net/u/2302546/blog/368685

nginx+tomcat涓巒etty浼樼己鐐?/a>


NETTY瀹樻柟EXAMPLE
https://github.com/netty/netty/tree/4.0/example/src/main/java/io/netty/example




paulwong 2015-02-26 09:49 鍙戣〃璇勮
]]>
主站蜘蛛池模板: 久久精品亚洲精品国产色婷| 亚洲成网777777国产精品| 亚洲伊人色欲综合网| 德国女人一级毛片免费| 国产jizzjizz视频全部免费| 最新亚洲春色Av无码专区| 综合在线免费视频| 亚洲人成www在线播放| 成熟女人特级毛片www免费| 亚洲人成自拍网站在线观看| 中文字字幕在线高清免费电影| 噼里啪啦免费观看高清动漫4| 亚洲日韩精品无码专区网站| 人碰人碰人成人免费视频| 亚洲日韩国产成网在线观看| 国产一级在线免费观看| 久久精品国产亚洲AV麻豆~| 久久精品一本到99热免费| 亚洲人精品亚洲人成在线| 美女视频黄的免费视频网页| 亚洲视频在线观看网站| 毛片免费在线观看网站| 国产成人精品亚洲一区| 伊人婷婷综合缴情亚洲五月| 在线免费观看伊人三级电影| mm1313亚洲精品国产| 两个人的视频www免费| 亚洲高清无在码在线无弹窗| 在线a人片天堂免费观看高清| 亚洲精品成人久久| 成人黄网站片免费视频| 精品国产香蕉伊思人在线在线亚洲一区二区 | 免费可以在线看A∨网站| 激情婷婷成人亚洲综合| 成年在线网站免费观看无广告| 亚洲最大的视频网站| 国产三级免费电影| 性无码免费一区二区三区在线| 亚洲色欲一区二区三区在线观看| 黄床大片30分钟免费看| 亚洲邪恶天堂影院在线观看|