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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
RPC ¿ò¼ÜµÄ¿É¿¿ÐÔÉè¼Æ
 
  3233  次浏览      27
 2019-2-15
 
±à¼­ÍƼö:

±¾ÎÄÀ´×ÔÓÚinfoq£¬ÎÄÕ·ÖÏíÁË Í¨ÐŲãµÄ¿É¿¿ÐÔÉè¼Æ¡¢Òì²½»¯Ô­ÀíÒÔ¼°RPC µ÷ÓòãµÄ¿É¿¿ÐÔÉè¼ÆµÈÄÚÈÝ¡£

1. ±³¾°

1.1 ·Ö²¼Ê½µ÷ÓÃÒýÈëµÄ¹ÊÕÏ

ÔÚ´«Í³µÄµ¥Ìå¼Ü¹¹ÖУ¬ÒµÎñ·þÎñµ÷Óö¼ÊDZ¾µØ·½·¨µ÷Ó㬲»»áÉæ¼°µ½ÍøÂçͨÐÅ¡¢Ð­ÒéÕ»¡¢ÏûÏ¢ÐòÁл¯ºÍ·´ÐòÁл¯µÈ£¬µ±Ê¹Óà RPC ¿ò¼Ü½«ÒµÎñÓɵ¥Ìå¼Ü¹¹¸ÄÔì³É·Ö²¼Ê½ÏµÍ³Ö®ºó£¬±¾µØ·½·¨µ÷Óý«Ñݱä³É¿ç½ø³ÌµÄÔ¶³Ìµ÷Ó㬻áÒýÈëһЩеĹÊÕϵ㣬ÈçÏÂËùʾ£º

ͼ 1 RPC µ÷ÓÃÒýÈëµÄDZÔÚ¹ÊÕϵã

ÐÂÒýÈëµÄDZÔÚ¹ÊÕϵã°üÀ¨£º

1£®ÏûÏ¢µÄÐòÁл¯ºÍ·´ÐòÁл¯¹ÊÕÏ£¬ÀýÈ磬²»Ö§³ÖµÄÊý¾ÝÀàÐÍ¡£

2£®Â·ÓɹÊÕÏ£º°üÀ¨·þÎñµÄ¶©ÔÄ¡¢·¢²¼¹ÊÕÏ£¬·þÎñʵÀý¹ÊÕÏÖ®ºóûÓм°Ê±Ë¢Ð·ÓÉ±í£¬µ¼Ö RPC µ÷ÓÃÈÔȻ·Óɵ½¹ÊÕϽڵ㡣

3£®ÍøÂçͨÐŹÊÕÏ£¬°üÀ¨ÍøÂçÉÁ¶Ï¡¢ÍøÂ絥ͨ¡¢¶ª°ü¡¢¿Í»§¶ËÀËÓ¿½ÓÈëµÈ¡£

1.2 µÚÈý·½·þÎñÒÀÀµ

RPC ·þÎñͨ³£»áÒÀÀµµÚÈý·½·þÎñ£¬°üÀ¨Êý¾Ý¿â·þÎñ¡¢Îļþ´æ´¢·þÎñ¡¢»º´æ·þÎñ¡¢ÏûÏ¢¶ÓÁзþÎñµÈ£¬ÕâÖÖµÚÈý·½ÒÀÀµÍ¬Ê±Ò²ÒýÈëÁËDZÔڵĹÊÕÏ£º

1£®ÍøÂçͨÐÅÀà¹ÊÕÏ, Èç¹û²ÉÓà BIO µ÷ÓõÚÈý·½·þÎñ£¬ºÜÓпÉÄܱ»×èÈû¡£

2£®¡°Ñ©±ÀЧÓá±µ¼Öµļ¶Áª¹ÊÕÏ£¬ÀýÈç·þÎñ¶Ë´¦ÀíÂýµ¼Ö¿ͻ§¶ËÏ̱߳»×èÈû¡£

3£®µÚÈý·½²»¿ÉÓõ¼Ö RPC µ÷ÓÃʧ°Ü¡£

µäÐ͵ĵÚÈý·½ÒÀÀµÊ¾ÀýÈçÏ£º

ͼ 2 RPC ·þÎñ¶ËµÄµÚÈý·½ÒÀÀµ

2. ͨÐŲãµÄ¿É¿¿ÐÔÉè¼Æ

2.1 Á´Â·ÓÐЧÐÔ¼ì²â

µ±ÍøÂç·¢Éúµ¥Í¨¡¢Á¬½Ó±»·À»ðǽ Hang ס¡¢³¤Ê±¼ä GC »òÕßͨÐÅÏ̷߳¢Éú·ÇÔ¤ÆÚÒ쳣ʱ£¬»áµ¼ÖÂÁ´Â·²»¿ÉÓÃÇÒ²»Ò×±»¼°Ê±·¢ÏÖ¡£ÌرðÊÇÒì³£·¢ÉúÔÚÁ賿ҵÎñµÍ¹ÈÆÚ¼ä£¬µ±Ô糿ҵÎñ¸ß·åÆÚµ½À´Ê±£¬ÓÉÓÚÁ´Â·²»¿ÉÓûᵼÖÂ˲¼äµÄ´óÅúÁ¿ÒµÎñʧ°Ü»òÕß³¬Ê±£¬Õ⽫¶ÔϵͳµÄ¿É¿¿ÐÔ²úÉúÖØ´óµÄÍþв¡£

´Ó¼¼Êõ²ãÃæ¿´£¬Òª½â¾öÁ´Â·µÄ¿É¿¿ÐÔÎÊÌ⣬±ØÐëÖÜÆÚÐԵĶÔÁ´Â·½øÐÐÓÐЧÐÔ¼ì²â¡£Ä¿Ç°×îÁ÷ÐкÍͨÓõÄ×ö·¨¾ÍÊÇÐÄÌø¼ì²â¡£

ÐÄÌø¼ì²â»úÖÆ·ÖΪÈý¸ö²ãÃæ£º

1.TCP ²ãÃæµÄÐÄÌø¼ì²â£¬¼´ TCP µÄ Keep-Alive »úÖÆ£¬ËüµÄ×÷ÓÃÓòÊÇÕû¸ö TCP ЭÒéÕ»¡£

2. ЭÒé²ãµÄÐÄÌø¼ì²â£¬Ö÷Òª´æÔÚÓÚ³¤Á¬½ÓЭÒéÖС£ÀýÈç MQTT ЭÒé¡£

3. Ó¦ÓòãµÄÐÄÌø¼ì²â£¬ËüÖ÷ÒªÓɸ÷ÒµÎñ²úƷͨ¹ýÔ¼¶¨·½Ê½¶¨Ê±¸ø¶Ô·½·¢ËÍÐÄÌøÏûϢʵÏÖ¡£

ÐÄÌø¼ì²âµÄÄ¿µÄ¾ÍÊÇÈ·Èϵ±Ç°Á´Â·¿ÉÓ㬶Է½»î×Ų¢ÇÒÄܹ»Õý³£½ÓÊպͷ¢ËÍÏûÏ¢¡£×öΪ¸ß¿É¿¿µÄ NIO ¿ò¼Ü£¬Netty Ò²ÌṩÁËÐÄÌø¼ì²â»úÖÆ£¬ÏÂÃæÎÒÃÇÒ»ÆðÊìϤÏÂÐÄÌøµÄ¼ì²âÔ­Àí¡£

ÐÄÌø¼ì²âµÄÔ­ÀíʾÒâͼÈçÏ£º

ͼ 3 Á´Â·ÐÄÌø¼ì²â

²»Í¬µÄЭÒ飬ÐÄÌø¼ì²â»úÖÆÒ²´æÔÚ²îÒ죬¹éÄÉÆðÀ´Ö÷Òª·ÖΪÁ½Àࣺ

1£®Ping-Pong ÐÍÐÄÌø£ºÓÉͨÐÅÒ»·½¶¨Ê±·¢ËÍ Ping ÏûÏ¢£¬¶Ô·½½ÓÊÕµ½ Ping ÏûÏ¢Ö®ºó£¬Á¢¼´·µ»Ø Pong Ó¦´ðÏûÏ¢¸ø¶Ô·½£¬ÊôÓÚÇëÇó - ÏìÓ¦ÐÍÐÄÌø¡£

2£®Ping-Ping ÐÍÐÄÌø£º²»Çø·ÖÐÄÌøÇëÇóºÍÓ¦´ð£¬ÓÉͨÐÅË«·½°´ÕÕÔ¼¶¨¶¨Ê±Ïò¶Ô·½·¢ËÍÐÄÌø Ping ÏûÏ¢£¬ËüÊôÓÚË«ÏòÐÄÌø¡£

ÐÄÌø¼ì²â²ßÂÔÈçÏ£º

1£®Á¬Ðø N ´ÎÐÄÌø¼ì²â¶¼Ã»ÓÐÊÕµ½¶Ô·½µÄ Pong Ó¦´ðÏûÏ¢»òÕß Ping ÇëÇóÏûÏ¢£¬ÔòÈÏΪÁ´Â·ÒѾ­·¢ÉúÂß¼­Ê§Ð§£¬Õâ±»³Æ×÷ÐÄÌø³¬Ê±¡£

2£®¶ÁÈ¡ºÍ·¢ËÍÐÄÌøÏûÏ¢µÄʱºòÈçºÎÖ±½Ó·¢ÉúÁË IO Òì³££¬ËµÃ÷Á´Â·ÒѾ­Ê§Ð§£¬Õâ±»³ÆÎªÐÄÌøÊ§°Ü¡£

ÎÞÂÛ·¢ÉúÐÄÌø³¬Ê±»¹ÊÇÐÄÌøÊ§°Ü£¬¶¼ÐèÒª¹Ø±ÕÁ´Â·£¬Óɿͻ§¶Ë·¢ÆðÖØÁ¬²Ù×÷£¬±£Ö¤Á´Â·Äܹ»»Ö¸´Õý³£¡£

Netty µÄÐÄÌø¼ì²âʵ¼ÊÉÏÊÇÀûÓÃÁËÁ´Â·¿ÕÏмì²â»úÖÆÊµÏֵģ¬ËüµÄ¿ÕÏмì²â»úÖÆ·ÖΪÈýÖÖ£º

1£®¶Á¿ÕÏУ¬Á´Â·³ÖÐøÊ±¼ä t ûÓжÁÈ¡µ½ÈκÎÏûÏ¢¡£

2£®Ð´¿ÕÏУ¬Á´Â·³ÖÐøÊ±¼ä t ûÓз¢ËÍÈκÎÏûÏ¢¡£

3£®¶Áд¿ÕÏУ¬Á´Â·³ÖÐøÊ±¼ä t ûÓнÓÊÕ»òÕß·¢ËÍÈκÎÏûÏ¢¡£

Netty µÄĬÈ϶Áд¿ÕÏлúÖÆÊÇ·¢Éú³¬Ê±Òì³££¬¹Ø±ÕÁ¬½Ó£¬µ«ÊÇ£¬ÎÒÃÇ¿ÉÒÔ¶¨ÖÆËüµÄ³¬Ê±ÊµÏÖ»úÖÆ£¬ÒÔ±ãÖ§³Ö²»Í¬µÄÓû§³¡¾°£¬Á´Â·¿ÕÏнӿڶ¨ÒåÈçÏ£º

protected void channelIdle(ChannelHandlerContext ctx, IdleStateEvent evt) throws Exception {

ctx.fireUserEventTriggered(evt);

}

Á´Â·¿ÕÏеÄʱºò²¢Ã»ÓйرÕÁ´Â·£¬¶øÊÇ´¥·¢ IdleStateEvent ʼþ£¬Óû§¶©ÔÄ IdleStateEvent ʼþ£¬ÓÃÓÚ×Ô¶¨ÒåÂß¼­´¦Àí£¬ÀýÈç¹Ø±ÕÁ´Â·¡¢¿Í»§¶Ë·¢ÆðÖØÐÂÁ¬½Ó¡¢¸æ¾¯ºÍ´òÓ¡ÈÕÖ¾µÈ¡£ÀûÓà Netty ÌṩµÄÁ´Â·¿ÕÏмì²â»úÖÆ£¬¿ÉÒԷdz£Áé»îµÄʵÏÖÁ´Â·¿ÕÏÐʱµÄÓÐЧÐÔ¼ì²â¡£

2.2 ¿Í»§¶Ë¶ÏÁ¬ÖØÁ¬

µ±·¢ÉúÈçÏÂÒ쳣ʱ£¬¿Í»§¶ËÐèÒªÊÍ·Å×ÊÔ´£¬ÖØÐ·¢ÆðÁ¬½Ó£º

1£®·þÎñ¶ËÒòΪijÖÖÔ­Òò£¬Ö÷¶¯¹Ø±ÕÁ¬½Ó£¬¿Í»§¶Ë¼ì²âµ½Á´Â·±»Õý³£¹Ø±Õ¡£

2£®·þÎñ¶ËÒòΪ崻úµÈ¹ÊÕÏ£¬Ç¿ÖƹرÕÁ¬½Ó£¬¿Í»§¶Ë¼ì²âµ½Á´Â·±» Rest µô¡£

3£®ÐÄÌø¼ì²â³¬Ê±£¬¿Í»§¶ËÖ÷¶¯¹Ø±ÕÁ¬½Ó¡£

4£®¿Í»§¶ËÒòΪÆäËüÔ­Òò£¨ÀýÈç½âÂëʧ°Ü£©£¬Ç¿ÖƹرÕÁ¬½Ó¡£

5£®ÍøÂçÀà¹ÊÕÏ£¬ÀýÈçÍøÂ綪°ü¡¢³¬Ê±¡¢µ¥Í¨µÈ£¬µ¼ÖÂÁ´Â·Öжϡ£

¿Í»§¶Ë¼ì²âµ½Á´Â·ÖжϺ󣬵ȴý INTERVAL ʱ¼ä£¬Óɿͻ§¶Ë·¢ÆðÖØÁ¬²Ù×÷£¬Èç¹ûÖØÁ¬Ê§°Ü£¬¼ä¸ôÖÜÆÚ INTERVAL ºóÔٴη¢ÆðÖØÁ¬£¬Ö±µ½ÖØÁ¬³É¹¦¡£

ΪÁ˱£Ö¤·þÎñ¶ËÄܹ»Óгä×ãµÄʱ¼äÊͷžä±ú×ÊÔ´£¬ÔÚÊ״ζÏÁ¬Ê±¿Í»§¶ËÐèÒªµÈ´ý INTERVAL ʱ¼äÖ®ºóÔÙ·¢ÆðÖØÁ¬£¬¶ø²»ÊÇʧ°Üºó¾ÍÁ¢¼´ÖØÁ¬¡£

ΪÁ˱£Ö¤¾ä±ú×ÊÔ´Äܹ»¼°Ê±ÊÍ·Å£¬ÎÞÂÛʲô³¡¾°ÏµÄÖØÁ¬Ê§°Ü£¬¿Í»§¶Ë¶¼±ØÐë±£Ö¤×ÔÉíµÄ×ÊÔ´±»¼°Ê±ÊÍ·Å£¬°üÀ¨µ«²»ÏÞÓÚ SocketChannel¡¢Socket µÈ¡£ÖØÁ¬Ê§°Üºó£¬ÐèÒª´òÓ¡Òì³£¶ÑÕ»ÐÅÏ¢£¬·½±ãºóÐøµÄÎÊÌⶨλ¡£

ÀûÓà Netty Channel ÌṩµÄ CloseFuture£¬¿ÉÒԷdz£·½±ãµÄ¼ì²âÁ´Â·×´Ì¬£¬Ò»µ©Á´Â·¹Ø±Õ£¬Ïà¹ØÊ¼þ¼´±»´¥·¢£¬¿ÉÒÔÖØÐ·¢ÆðÁ¬½Ó²Ù×÷£¬´úÂëʾÀýÈçÏ£º

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

} finally {

// ËùÓÐ×ÊÔ´ÊÍ·ÅÍê³ÉÖ®ºó£¬Çå¿Õ×ÊÔ´£¬Ôٴη¢ÆðÖØÁ¬²Ù×÷

executor.execute(new Runnable() {

public void run() {

try {

TimeUnit.SECONDS.sleep(3);//3 ÃëÖ®ºó·¢ÆðÖØÁ¬£¬µÈ´ý¾ä±úÊÍ·Å

try {

// ·¢ÆðÖØÁ¬²Ù×÷

connect(NettyConstant.PORT, NettyConstant.REMOTEIP); } catch (Exception e) {

...... Òì³£´¦ÀíÏà¹Ø´úÂëÊ¡ÂÔ

}

});

2.3 »º´æÖØ·¢

µ±ÎÒÃǵ÷ÓÃÏûÏ¢·¢ËͽӿڵÄʱºò£¬ÏûÏ¢²¢Ã»ÓÐÕæÕý±»Ð´Èëµ½ Socket ÖУ¬¶øÊÇÏÈ·ÅÈë NIO ͨÐÅ¿ò¼ÜµÄÏûÏ¢·¢ËͶÓÁÐÖУ¬ÓÉ Reactor Ïß³ÌɨÃè´ý·¢Ë͵ÄÏûÏ¢¶ÓÁУ¬Òì²½µÄ·¢Ë͸øÍ¨ÐŶԶˡ£¼ÙÈçºÜ²»ÐÒ£¬ÏûÏ¢¶ÓÁÐÖлýѹÁ˲¿·ÖÏûÏ¢£¬´ËʱÁ´Â·Öжϣ¬Õâ»áµ¼Ö²¿·ÖÏûÏ¢²¢Ã»ÓÐÕæÕý·¢Ë͸øÍ¨ÐŶԶˣ¬Ê¾ÀýÈçÏ£º

ͼ 4 Á´Â·Öжϵ¼Ö»ýѹÏûϢûÓз¢ËÍ

·¢Éú´Ë¹ÊÕÏʱ£¬ÎÒÃÇÏ£Íû NIO ¿ò¼ÜÄܹ»×Ô¶¯ÊµÏÖÏûÏ¢»º´æºÍÖØÐ·¢ËÍ£¬Òź¶µÄÊÇ×÷Ϊ»ù´¡µÄ NIO ͨÐÅ¿ò¼Ü£¬ÎÞÂÛÊÇ Mina »¹ÊÇ Netty£¬¶¼Ã»ÓÐÌṩ¸Ã¹¦ÄÜ£¬ÐèҪͨÐÅ¿ò¼Ü×Ô¼º·âװʵÏÖ£¬»ùÓÚ Netty µÄʵÏÖ²ßÂÔÈçÏ£º

1£®µ÷Óà Netty ChannelHandlerContext µÄ write ·½·¨Ê±£¬·µ»Ø ChannelFuture ¶ÔÏó£¬ÎÒÃÇÔÚ ChannelFuture ÖÐ×¢²á·¢Ëͽá¹û¼àÌý Listener¡£

2£®ÔÚ Listener µÄ operationComplete ·½·¨ÖÐÅжϲÙ×÷½á¹û£¬Èç¹û²Ù×÷²»³É¹¦£¬½«Ö®Ç°·¢Ë͵ÄÏûÏ¢¶ÔÏóÌí¼Óµ½ÖØ·¢¶ÓÁÐÖС£

3£®Á´Â·ÖØÁ¬³É¹¦Ö®ºó£¬¸ù¾Ý²ßÂÔ£¬½«»º´æ¶ÓÁÐÖеÄÏûÏ¢ÖØÐ·¢Ë͸øÍ¨ÐŶԶˡ£

ÐèÒªÖ¸³öµÄÊÇ£¬²¢·ÇËùÓг¡¾°¶¼ÐèҪͨÐÅ¿ò¼Ü×öÖØ·¢£¬ÀýÈç·þÎñ¿ò¼ÜµÄ¿Í»§¶Ë£¬Èç¹ûij¸ö·þÎñÌṩÕß²»¿ÉÓ㬻á×Ô¶¯Çл»µ½ÏÂÒ»¸ö¿ÉÓõķþÎñÌṩÕßÖ®ÉÏ¡£¼Ù¶¨ÊÇÁ´Â·Öжϵ¼ÖµķþÎñÌṩÕß²»¿ÉÓ㬼´±ãÁ´Â·ÖØÐ»ָ´£¬Ò²Ã»ÓбØÒª½«Ö®Ç°»ýѹµÄÏûÏ¢ÖØÐ·¢ËÍ£¬ÒòΪÏûÏ¢ÒѾ­Í¨¹ý FailOver »úÖÆÇл»µ½ÁíÒ»¸ö·þÎñÌṩÕß´¦Àí¡£ËùÒÔ£¬ÏûÏ¢»º´æÖØ·¢Ö»ÊÇÒ»ÖÖ²ßÂÔ£¬Í¨ÐÅ¿ò¼ÜÓ¦¸ÃÖ§³ÖÁ´Â·¼¶ÖØ·¢²ßÂÔ¡£

2.4 ¿Í»§¶Ë³¬Ê±±£»¤

ÔÚ´«Í³µÄͬ²½×èÈû±à³ÌģʽÏ£¬¿Í»§¶Ë Socket ·¢ÆðÍøÂçÁ¬½Ó£¬ÍùÍùÐèÒªÖ¸¶¨Á¬½Ó³¬Ê±Ê±¼ä£¬ÕâÑù×öµÄÄ¿µÄÖ÷ÒªÓÐÁ½¸ö£º

1£®ÔÚͬ²½×èÈû I/O Ä£ÐÍÖУ¬Á¬½Ó²Ù×÷ÊÇͬ²½×èÈûµÄ£¬Èç¹û²»ÉèÖó¬Ê±Ê±¼ä£¬¿Í»§¶Ë I/O Ï߳̿ÉÄܻᱻ³¤Ê±¼ä×èÈû£¬Õâ»áµ¼ÖÂϵͳ¿ÉÓà I/O Ïß³ÌÊýµÄ¼õÉÙ¡£

2£®ÒµÎñ²ãÐèÒª£º´ó¶àÊýϵͳ¶¼»á¶ÔÒµÎñÁ÷³ÌÖ´ÐÐʱ¼äÓÐÏÞÖÆ£¬ÀýÈç WEB ½»»¥ÀàµÄÏìӦʱ¼äҪСÓÚ 3S¡£¿Í»§¶ËÉèÖÃÁ¬½Ó³¬Ê±Ê±¼äÊÇΪÁËʵÏÖÒµÎñ²ãµÄ³¬Ê±¡£

¶ÔÓÚ NIO µÄ SocketChannel£¬ÔÚ·Ç×èÈûģʽÏ£¬Ëü»áÖ±½Ó·µ»ØÁ¬½Ó½á¹û£¬Èç¹ûûÓÐÁ¬½Ó³É¹¦£¬Ò²Ã»Óз¢Éú I/O Òì³££¬ÔòÐèÒª½« SocketChannel ×¢²áµ½ Selector ÉϼàÌýÁ¬½Ó½á¹û¡£ËùÒÔ£¬Òì²½Á¬½ÓµÄ³¬Ê±ÎÞ·¨ÔÚ API ²ãÃæÖ±½ÓÉèÖ㬶øÊÇÐèҪͨ¹ýÓû§×Ô¶¨Ò嶨ʱÆ÷À´Ö÷¶¯¼à²â¡£

Netty ÔÚ´´½¨ NIO ¿Í»§¶Ëʱ£¬Ö§³ÖÉèÖÃÁ¬½Ó³¬Ê±²ÎÊý¡£Netty µÄ¿Í»§¶ËÁ¬½Ó³¬Ê±²ÎÊýÓëÆäËü³£ÓÃµÄ TCP ²ÎÊýÒ»ÆðÅäÖã¬Ê¹ÓÃÆðÀ´·Ç³£·½±ã£¬ÉϲãÓû§²»ÓùØÐĵײãµÄ³¬Ê±ÊµÏÖ»úÖÆ¡£Õâ¼ÈÂú×ãÁËÓû§µÄ¸öÐÔ»¯ÐèÇó£¬ÓÖʵÏÖÁ˹ÊÕϵķֲã¸ôÀë¡£

2.5 Õë¶Ô¿Í»§¶ËµÄ²¢·¢Á¬½ÓÊýÁ÷¿Ø

ÒÔ Netty µÄ HTTPS ·þÎñ¶ËΪÀý£¬Õë¶Ô¿Í»§¶ËµÄ²¢·¢Á¬½ÓÊýÁ÷¿ØÔ­ÀíÈçÏÂËùʾ£º

ͼ 5 ·þÎñ¶Ë HTTS Á¬½ÓÊýÁ÷¿Ø

»ùÓÚ Netty µÄ Pipeline »úÖÆ£¬¿ÉÒÔ¶Ô SSL ÎÕÊֳɹ¦¡¢SSL Á¬½Ó¹Ø±Õ×öÇÐÃæÀ¹½Ø£¨ÀàËÆÓÚ Spring µÄ AOP »úÖÆ£¬µ«ÊÇû²ÉÓ÷´Éä»úÖÆ£¬ÐÔÄܸü¸ß£©£¬Í¨¹ýÁ÷¿ØÇÐÃæ½Ó¿Ú£¬¶Ô HTTPS Á¬½Ó×ö¼ÆÊý£¬¸ù¾Ý¼ÆÊýÆ÷×öÁ÷¿Ø£¬·þÎñ¶ËµÄÁ÷¿ØËã·¨ÈçÏ£º

1£®»ñÈ¡Á÷¿ØãÐÖµ¡£

2£®´ÓÈ«¾ÖÉÏÏÂÎÄÖлñÈ¡µ±Ç°µÄ²¢·¢Á¬½ÓÊý£¬ÓëÁ÷¿ØãÐÖµ¶Ô±È£¬Èç¹ûСÓÚÁ÷¿ØãÐÖµ£¬Ôò¶Ôµ±Ç°µÄ¼ÆÊýÆ÷×öÔ­×Ó×ÔÔö£¬ÔÊÐí¿Í»§¶ËÁ¬½Ó½ÓÈë¡£

3£®Èç¹ûµÈÓÚ»òÕß´óÓÚÁ÷¿ØãÐÖµ£¬ÔòÅ׳öÁ÷¿ØÒì³£¸ø¿Í»§¶Ë¡£

4£®SSL Á¬½Ó¹Ø±Õʱ£¬»ñÈ¡ÉÏÏÂÎÄÖеIJ¢·¢Á¬½ÓÊý£¬×öÔ­×Ó×Ô¼õ¡£

ÔÚʵÏÖ·þÎñ¶ËÁ÷¿ØÊ±£¬ÐèҪעÒâÈçϼ¸µã£º

1£®Á÷¿ØµÄ ChannelHandler ÉùÃ÷Ϊ @ChannelHandler.Sharable£¬ÕâÑùÈ«¾Ö´´½¨Ò»¸öÁ÷¿ØÊµÀý£¬¾Í¿ÉÒÔÔÚËùÓÐµÄ SSL Á¬½ÓÖй²Ïí¡£

2£®Í¨¹ý userEventTriggered ·½·¨À¹½Ø SslHandshakeCompletionEvent ºÍ SslCloseCompletionEvent ʼþ£¬ÔÚ SSL ÎÕÊֳɹ¦ºÍ SSL Á¬½Ó¹Ø±Õʱ¸üÐÂÁ÷¿Ø¼ÆÊýÆ÷¡£

3£®Á÷¿Ø²¢²»Êǵ¥Õë¶Ô ESTABLISHED ״̬µÄ HTTP Á¬½Ó£¬¶øÊÇÕë¶ÔËùÓÐ״̬µÄÁ¬½Ó£¬ÒòΪ¿Í»§¶Ë¹Ø±ÕÁ¬½Ó£¬²¢²»Òâζ×Å·þÎñ¶ËҲͬʱ¹Ø±ÕÁËÁ¬½Ó£¬Ö»ÓÐ SslCloseCompletionEvent ʼþ´¥·¢Ê±£¬·þÎñ¶Ë²ÅÕæÕýµÄ¹Ø±ÕÁË NioSocketChannel£¬GC ²Å»á»ØÊÕÁ¬½Ó¹ØÁªµÄÄÚ´æ¡£

4£®Á÷¿Ø ChannelHandler »á±»¶à¸ö NioEventLoop Ï̵߳÷Óã¬Òò´Ë¶ÔÓÚÏà¹ØµÄ¼ÆÊýÆ÷¸üеȲÙ×÷£¬Òª±£Ö¤²¢·¢°²È«ÐÔ£¬±ÜÃâʹÓÃÈ«¾ÖËø£¬¿ÉÒÔͨ¹ýÔ­×ÓÀàµÈÌáÉýÐÔÄÜ¡£

2.6 ÄÚ´æ±£»¤

NIO ͨÐŵÄÄÚ´æ±£»¤Ö÷Òª¼¯ÖÐÔÚÈçϼ¸µã£º

1. Á´Â·×ÜÊýµÄ¿ØÖÆ£ºÃ¿ÌõÁ´Â·¶¼°üº¬½ÓÊպͷ¢ËÍ»º³åÇø£¬Á´Â·¸öÊýÌ«¶àÈÝÒ×µ¼ÖÂÄÚ´æÒç³ö¡£

2. µ¥¸ö»º³åÇøµÄÉÏÏÞ¿ØÖÆ£º·ÀÖ¹·Ç·¨³¤¶È»òÕßÏûÏ¢¹ý´óµ¼ÖÂÄÚ´æÒç³ö¡£

3. »º³åÇøÄÚ´æÊÍ·Å£º·ÀÖ¹ÒòΪ»º³åÇøÊ¹Óò»µ±µ¼ÖµÄÄÚ´æÐ¹Â¶¡£

4.NIO ÏûÏ¢·¢ËͶÓÁеij¤¶ÈÉÏÏÞ¿ØÖÆ¡£

µ±ÎÒÃǶÔÏûÏ¢½øÐнâÂëµÄʱºò£¬ÐèÒª´´½¨»º³åÇø¡£»º³åÇøµÄ´´½¨·½Ê½Í¨³£ÓÐÁ½ÖÖ£º

1. ÈÝÁ¿Ô¤·ÖÅ䣬ÔÚʵ¼Ê¶Áд¹ý³ÌÖÐÈç¹û²»¹»ÔÙÀ©Õ¹¡£

2. ¸ù¾ÝЭÒéÏûÏ¢³¤¶È´´½¨»º³åÇø¡£

ÔÚʵ¼ÊµÄÉÌÓû·¾³ÖУ¬Èç¹ûÓöµ½»ûÐÎÂëÁ÷¹¥»÷¡¢Ð­ÒéÏûÏ¢±àÂëÒì³£¡¢ÏûÏ¢¶ª°üµÈÎÊÌâʱ£¬¿ÉÄÜ»á½âÎöµ½Ò»¸ö³¬³¤µÄ³¤¶È×ֶΡ£±ÊÕßÔø¾­Óöµ½¹ýÀàËÆÎÊÌ⣬±¨Îij¤¶È×Ö¶ÎÖµ¾¹È»ÊÇ 2G ¶à£¬ÓÉÓÚ´úÂëµÄÒ»¸ö·Ö֧ûÓжԳ¤¶ÈÉÏÏÞ×öÓÐЧ±£»¤£¬½á¹ûµ¼ÖÂÄÚ´æÒç³ö¡£ÏµÍ³ÖØÆôºó¼¸ÃëÄÚÔÙ´ÎÄÚ´æÒç³ö£¬ÐҺü°Ê±¶¨Î»³öÎÊÌâ¸ùÒò£¬ÏÕЩÄð³ÉÑÏÖØµÄʹʡ£

Netty ÌṩÁ˱à½âÂë¿ò¼Ü£¬Òò´Ë¶ÔÓÚ½âÂ뻺³åÇøµÄÉÏÏÞ±£»¤¾ÍÏԵ÷dz£ÖØÒª¡£ÏÂÃæ£¬ÎÒÃÇ¿´Ï Netty ÊÇÈçºÎ¶Ô»º³åÇø½øÐÐÉÏÏÞ±£»¤µÄ£º

Ê×ÏÈ£¬ÔÚÄÚ´æ·ÖÅäµÄʱºòÖ¸¶¨»º³åÇø³¤¶ÈÉÏÏÞ£º


/**

* Allocate a {@link ByteBuf} with the given initial capacity and the given

* maximal capacity. If it is a direct or heap buffer depends on the actual

* implementation.

*/

ByteBuf buffer(int initialCapacity, int maxCapacity);

Æä´Î£¬ÔÚ¶Ô»º³åÇø½øÐÐдÈë²Ù×÷µÄʱºò£¬Èç¹û»º³åÇøÈÝÁ¿²»×ãÐèÒªÀ©Õ¹£¬Ê×ÏȶÔ×î´óÈÝÁ¿½øÐÐÅжϣ¬Èç¹ûÀ©Õ¹ºóµÄÈÝÁ¿³¬¹ýÉÏÏÞ£¬Ôò¾Ü¾øÀ©Õ¹£º

@Override

public ByteBuf capacity(int newCapacity) {

ensureAccessible();

if (newCapacity < 0 || newCapacity > maxCapacity()) {

throw new IllegalArgumentException("newCapacity: " + newCapacity);

}

 

ÔÚÏûÏ¢½âÂëµÄʱºò£¬¶ÔÏûÏ¢³¤¶È½øÐÐÅжϣ¬Èç¹û³¬¹ý×î´óÈÝÁ¿ÉÏÏÞ£¬ÔòÅ׳ö½âÂëÒì³££¬¾Ü¾ø·ÖÅäÄڴ棬ÒÔ LengthFieldBasedFrameDecoder µÄ decode ·½·¨ÎªÀý½øÐÐ˵Ã÷£º

if (frameLength > maxFrameLength) {

long discard = frameLength - in.readableBytes();

tooLongFrameLength = frameLength;

if (discard < 0) {

in.skipBytes((int) frameLength);

} else {

discardingTooLongFrame = true;

bytesToDiscard = discard;

in.skipBytes(in.readableBytes());

}

failIfNecessary(true);

return null;

}

3. RPC µ÷ÓòãµÄ¿É¿¿ÐÔÉè¼Æ

3.1 RPC µ÷ÓÃÒì³£³¡¾°

RPC µ÷Óùý³ÌÖгýÁËͨÐŲãµÄÒì³££¬Í¨³£Ò²»áÓöµ½Èçϼ¸ÖÖ¹ÊÕÏ£º

·þÎñ·ÓÉʧ°Ü¡£

·þÎñ¶Ë³¬Ê±¡£

·þÎñ¶Ëµ÷ÓÃʧ°Ü¡£

RPC ¿ò¼ÜÐèÒªÄܹ»Õë¶ÔÉÏÊö³£¼ûµÄÒì³£×öÈÝ´í´¦Àí£¬ÒÔÌáÉýÒµÎñµ÷ÓõĿɿ¿ÐÔ¡£

3.1.1 ·þÎñ·ÓÉʧ°Ü

RPC ¿Í»§¶Ëͨ³£»á»ùÓÚ¶©ÔÄ / ·¢²¼µÄ»úÖÆ»ñÈ¡·þÎñ¶ËµÄµØÖ·ÁÐ±í£¬²¢½«Æä»º´æµ½±¾µØ£¬RPC µ÷ÓÃʱ£¬¸ù¾Ý¸ºÔؾùºâ²ßÂÔ´Ó±¾µØ»º´æµÄ·ÓɱíÖлñÈ¡µ½Ò»¸öΨһµÄ·þÎñ¶Ë½Úµã·¢Æðµ÷Óã¬Ô­ÀíÈçÏÂËùʾ£º

ͼ 6 »ùÓÚ¶©ÔÄ·¢²¼»úÖÆµÄ RPC µ÷ÓÃ

ͨ¹ý»º´æµÄ»úÖÆÄܹ»ÌáÉý RPC µ÷ÓõÄÐÔÄÜ£¬RPC ¿Í»§¶Ë²»ÐèҪÿ´Îµ÷Óö¼Ïò×¢²áÖÐÐIJéѯĿ±ê·þÎñµÄµØÖ·ÐÅÏ¢£¬µ«ÊÇÒ²¿ÉÄܻᷢÉúÈçÏÂÁ½ÀàDZÔÚ¹ÊÕÏ£º

1£®Ä³¸ö RPC ·þÎñ¶Ë·¢Éú¹ÊÕÏ£¬»òÕßÏÂÏߣ¬¿Í»§¶ËûÓм°Ê±Ë¢Ð±¾µØ»º´æµÄ·þÎñµØÖ·ÁÐ±í£¬¾Í»áµ¼Ö RPC µ÷ÓÃʧ°Ü¡£

2£®RPC ¿Í»§¶ËºÍ·þÎñ¶Ë¶¼¹¤×÷Õý³££¬µ«ÊÇ RPC ¿Í»§¶ËºÍ·þÎñ¶ËµÄÁ¬½Ó»òÕßÍøÂç·¢ÉúÁ˹ÊÕÏ£¬Èç¹ûûÓÐÁ´Â·µÄ¿É¿¿ÐÔ¼ì²â»úÖÆ£¬¾Í»áµ¼Ö RPC µ÷ÓÃʧ°Ü¡£

3.1.2 ·þÎñ¶Ë³¬Ê±

µ±·þÎñ¶ËÎÞ·¨ÔÚÖ¸¶¨µÄʱ¼äÄÚ·µ»ØÓ¦´ð¸ø¿Í»§¶Ë£¬¾Í»á·¢Éú³¬Ê±£¬µ¼Ö³¬Ê±µÄÔ­ÒòÖ÷ÒªÓУº

1£®·þÎñ¶ËµÄ I/O Ïß³ÌûÓм°Ê±´ÓÍøÂçÖжÁÈ¡¿Í»§¶ËÇëÇóÏûÏ¢£¬µ¼Ö¸ÃÎÊÌâµÄÔ­Òòͨ³£ÊÇ I/O Ï̱߳»ÒâÍâ×èÈû»òÕßÖ´Ðг¤ÖÜÆÚ²Ù×÷¡£

2£®·þÎñ¶ËÒµÎñ´¦Àí»ºÂý£¬»òÕß±»³¤Ê±¼ä×èÈû£¬ÀýÈç²éѯÊý¾Ý¿â£¬ÓÉÓÚûÓÐË÷Òýµ¼ÖÂÈ«±í²éѯ£¬ºÄʱ½Ï³¤¡£

3£®·þÎñ¶Ë·¢Éú³¤Ê±¼ä Full GC£¬µ¼ÖÂËùÓÐÒµÎñÏß³ÌÔÝÍ£ÔËÐУ¬ÎÞ·¨¼°Ê±·µ»ØÓ¦´ð¸ø¿Í»§¶Ë¡£

3.1.3 ·þÎñ¶Ëµ÷ÓÃʧ°Ü

ÓÐʱ»á·¢Éú·þÎñ¶Ëµ÷ÓÃʧ°Ü£¬µ¼Ö·þÎñ¶Ëµ÷ÓÃʧ°ÜµÄÔ­ÒòÖ÷ÒªÓÐÈçϼ¸ÖÖ£º

1£®·þÎñ¶Ë½âÂëʧ°Ü£¬»á·µ»ØÏûÏ¢½âÂëʧ°ÜÒì³£¡£

2£®·þÎñ¶Ë·¢Éú¶¯Ì¬Á÷¿Ø£¬·µ»ØÁ÷¿ØÒì³£¡£

3£®·þÎñ¶ËÏûÏ¢¶ÓÁлýѹÂʳ¬¹ý×î´óãÐÖµ£¬·µ»ØÏµÍ³ÓµÈûÒì³£¡£

4£®·ÃÎÊȨÏÞУÑéʧ°Ü£¬·µ»ØÈ¨ÏÞÏà¹ØÒì³£¡£

5£®Î¥·´ SLA ²ßÂÔ£¬·µ»Ø SLA ¿ØÖÆÏà¹ØÒì³£¡£

6£®ÆäËûϵͳÒì³£¡£

ÐèÒªÖ¸³öµÄÊÇ£¬·þÎñµ÷ÓÃÒì³£²»°üÀ¨ÒµÎñ²ãÃæµÄ´¦ÀíÒì³££¬ÀýÈçÊý¾Ý¿â²Ù×÷Òì³£¡¢Óû§¼Ç¼²»´æÔÚÒì³£µÈ¡£

3.2 RPC µ÷Óÿɿ¿ÐÔ·½°¸

3.2.1 ×¢²áÖÐÐÄÓëÁ´Â·¼ì²âË«±£ÏÕ»úÖÆ

ÒòΪע²áÖÐÐÄÓм¯ÈºÄÚËùÓÐ RPC ¿Í»§¶ËºÍ·þÎñ¶ËµÄʵÀýÐÅÏ¢£¬Òò´Ëͨ¹ý×¢²áÖÐÐÄÏòÿ¸ö·þÎñ¶ËºÍ¿Í»§¶Ë·¢ËÍÐÄÌøÏûÏ¢£¬¼ì²â¶Ô·½ÊÇ·ñÔÚÏߣ¬Èç¹ûÁ¬Ðø N ´ÎÐÄÌø³¬Ê±£¬»òÕßÐÄÌø·¢ËÍʧ°Ü£¬ÔòÅж϶Է½ÒѾ­·¢Éú¹ÊÕÏ»òÕßÏÂÏߣ¨ÏÂÏß¿ÉÒÔͨ¹ýÓÅÑÅÍ£»úµÄ·½Ê½Ö÷¶¯¸æÖª×¢²áÖÐÐÄ£¬ÊµÊ±ÐÔ»á¸üºÃ£©¡£×¢²áÖÐÐĽ«¹ÊÕϽڵãµÄ·þÎñʵÀýÐÅϢͨ¹ýÐÄÌøÏûÏ¢·¢Ë͸ø¿Í»§¶Ë£¬Óɿͻ§¶Ë½«¹ÊÕϵķþÎñʵÀýÐÅÏ¢´Ó±¾µØ»º´æµÄ·ÓɱíÖÐɾ³ý£¬ºóÐøÏûÏ¢µ÷Óò»ÔÙ·Óɵ½¸Ã½Úµã¡£

ÔÚÒ»Ð©ÌØÊⳡ¾°Ï£¬¾¡¹Ü×¢²áÖÐÐÄÓë·þÎñ¶Ë¡¢¿Í»§¶ËµÄÁ¬½Ó¶¼Ã»ÓÐÎÊÌ⣬µ«ÊÇ·þÎñ¶ËºÍ¿Í»§¶ËÖ®¼äµÄÁ´Â··¢ÉúÁËÒì³££¬ÓÉÓÚ·¢ÉúÁ´Â·Òì³£µÄ·þÎñ¶ËÈÔÈ»ÔÚ»º´æ±íÖУ¬Òò´ËÏûÏ¢»¹»á¼ÌÐøµ÷¶Èµ½¹ÊÕϽڵãÉÏ£¬ËùÒÔ£¬ÀûÓà RPC ¿Í»§¶ËºÍ·þÎñ¶ËÖ®¼äµÄË«ÏòÐÄÌø¼ì²â£¬¿ÉÒÔ¼°Ê±·¢ÏÖË«·½Ö®¼äµÄÁ´Â·ÎÊÌ⣬ÀûÓÃÖØÁ¬µÈ»úÖÆ¿ÉÒÔ¿ìËٵĻָ´Á¬½Ó£¬Èç¹ûÖØÁ¬ N ´Î¶¼Ê§°Ü£¬Ôò·þÎñ·ÓÉʱ²»ÔÙ½«ÏûÏ¢·¢Ë͵½Á¬½Ó¹ÊÕϵķþÎñ½ÚµãÉÏ¡£

ÀûÓÃ×¢²áÖÐÐĶԷþÎñ¶ËµÄÐÄÌø¼ì²âºÍ֪ͨ»úÖÆ¡¢ÒÔ¼°·þÎñ¶ËºÍ¿Í»§¶ËÕë¶ÔÁ´Â·²ãµÄË«ÏòÐÄÌø¼ì²â»úÖÆ£¬¿ÉÒÔÓÐЧ¼ì²â³ö¹ÊÕϽڵ㣬ÌáÉý RPC µ÷ÓõĿɿ¿ÐÔ£¬ËüµÄÔ­ÀíÈçÏÂËùʾ£º

ͼ 7 ×¢²áÖÐÐÄÓëÁ´Â·Ë«ÏòÐÄÌø¼ì²â»úÖÆÔ­Àí

3.2.2 ¼¯ÈºÈÝ´í²ßÂÔ

³£Óõļ¯ÈºÈÝ´í²ßÂÔ°üÀ¨£º

1£®Ê§°Ü×Ô¶¯Çл» (Failover)¡£

2£®Ê§°Ü֪ͨ£¨Failback£©¡£

3£®Ê§°Ü»º´æ£¨Failcache£©¡£

4£®¿ìËÙʧ°Ü£¨Failfast£©¡£

ʧ°Ü×Ô¶¯Çл»²ßÂÔ£º·þÎñµ÷ÓÃʧ°Ü×Ô¶¯Çл»²ßÂÔÖ¸µÄÊǵ±·¢Éú RPC µ÷ÓÃÒ쳣ʱ£¬ÖØÐÂѡ·£¬²éÕÒÏÂÒ»¸ö¿ÉÓõķþÎñÌṩÕß¡£

·þÎñ·¢²¼µÄʱºò£¬¿ÉÒÔÖ¸¶¨·þÎñµÄ¼¯ÈºÈÝ´í²ßÂÔ¡£Ïû·ÑÕß¿ÉÒÔ¸²¸Ç·þÎñÌṩÕßµÄͨÓÃÅäÖã¬ÊµÏÖ¸öÐÔ»¯µÄÈÝ´í²ßÂÔ¡£

Failover ²ßÂÔµÄÉè¼ÆË¼Â·ÈçÏ£ºÏû·ÑÕß·ÓɲÙ×÷Íê³ÉÖ®ºó£¬»ñµÃÄ¿±êµØÖ·£¬µ÷ÓÃͨÐÅ¿ò¼ÜµÄÏûÏ¢·¢Ëͽӿڷ¢ËÍÇëÇ󣬼àÌý·þÎñ¶ËÓ¦´ð¡£Èç¹û·µ»ØµÄ½á¹ûÊÇ RPC µ÷ÓÃÒì³££¨³¬Ê±¡¢Á÷¿Ø¡¢½âÂëʧ°ÜµÈϵͳÒì³££©£¬¸ù¾ÝÏû·ÑÕß¼¯ÈºÈÝ´íµÄ²ßÂÔ½øÐÐÈÝ´í·ÓÉ£¬Èç¹ûÊÇ Failover£¬ÔòÖØÐ·µ»Øµ½Â·ÓÉ Handler µÄÈë¿Ú£¬´Ó·Óɽڵã¼ÌÐøÖ´ÐС£Ñ¡Â·Íê³ÉÖ®ºó£¬¶ÔÄ¿±êµØÖ·½øÐбȶԣ¬·ÀÖ¹ÖØÐ·Óɵ½¹ÊÕÏ·þÎñ½Úµã£¬¹ýÂ˵ôÉϴεĹÊÕÏ·þÎñÌṩÕßÖ®ºó£¬µ÷ÓÃͨÐÅ¿ò¼ÜµÄÏûÏ¢·¢Ëͽӿڷ¢ËÍÇëÇóÏûÏ¢¡£

RPC ¿ò¼ÜÌṩ Failover ÈÝ´í²ßÂÔ£¬µ«ÊÇÓû§ÔÚʹÓÃʱÐèÒª×Ô¼º±£Ö¤ÓöԵط½£¬ÏÂÃæ¶Ô Failover ²ßÂÔµÄÓ¦Óó¡¾°½øÐÐ×ܽ᣺

1£®¶Á²Ù×÷£¬ÒòΪͨ³£ËüÊÇÃݵȵġ£

2£®ÃݵÈÐÔ·þÎñ£¬±£Ö¤µ÷Óà 1 ´ÎÓë N ´ÎЧ¹ûÏàͬ¡£

ÐèÒªÌØ±ðÖ¸³öµÄÊÇ£¬Ê§°ÜÖØÊÔ»áÔö¼Ó·þÎñµ÷ÓÃʱÑÓ£¬Òò´Ë¿ò¼Ü±ØÐë¶Ôʧ°ÜÖØÊÔµÄ×î´ó´ÎÊý×öÏÞÖÆ£¬Í¨³£Ä¬ÈÏΪ 3£¬·ÀÖ¹ÎÞÏÞÖÆÖØÊÔµ¼Ö·þÎñµ÷ÓÃʱÑÓ²»¿É¿Ø¡£

ʧ°Ü֪ͨ£¨Failback£©£ºÔںܶàÒµÎñ³¡¾°ÖУ¬¿Í»§¶ËÐèÒªÄܹ»»ñÈ¡µ½·þÎñµ÷ÓÃʧ°ÜµÄ¾ßÌåÐÅÏ¢£¬Í¨¹ý¶Ôʧ°Ü´íÎóÂëµÈÒì³£ÐÅÏ¢µÄÅжϣ¬¾ö¶¨ºóÐøµÄÖ´ÐвßÂÔ£¬ÀýÈç·ÇÃݵÈÐԵķþÎñµ÷Óá£

Failback µÄÉè¼Æ·½°¸ÈçÏ£ºRPC ¿ò¼Ü»ñÈ¡µ½·þÎñÌṩÕß·µ»ØµÄ RPC Òì³£ÏìÓ¦Ö®ºó£¬¸ù¾Ý²ßÂÔ½øÐÐÈÝ´í¡£Èç¹ûÊÇ Failback ģʽ£¬Ôò²»ÔÙÖØÊÔÆäËü·þÎñÌṩÕߣ¬¶øÊǽ« RPC Ò쳣֪ͨ¸ø¿Í»§¶Ë£¬Óɿͻ§¶Ë²¶»ñÒì³£½øÐкóÐø´¦Àí¡£

ʧ°Ü»º´æ£¨Failcache£©£ºFailcache ²ßÂÔÊÇʧ°Ü×Ô¶¯»Ö¸´µÄÒ»ÖÖ£¬ÔÚʵ¼ÊÏîÄ¿ÖÐËüµÄÓ¦Óó¡¾°ÈçÏ£º

1£®·þÎñÓÐ״̬·ÓÉ£¬±ØÐ붨µã·¢Ë͵½Ö¸¶¨µÄ·þÎñÌṩÕß¡£µ±·¢ÉúÁ´Â·Öжϡ¢Á÷¿ØµÈ·þÎñÔÝʱ²»¿ÉÓÃʱ£¬RPC ¿ò¼Ü½«ÏûÏ¢ÁÙʱ»º´æÆðÀ´£¬µÈ´ýÖÜÆÚ T£¬ÖØÐ·¢ËÍ£¬Ö±µ½·þÎñÌṩÕßÄܹ»Õý³£´¦Àí¸ÃÏûÏ¢¡£

2£®¶ÔʱÑÓÒªÇó²»Ãô¸ÐµÄ·þÎñ¡£ÏµÍ³·þÎñµ÷ÓÃʧ°Ü£¬Í¨³£ÊÇÁ´Â·ÔÝʱ²»¿ÉÓᢷþÎñÁ÷¿Ø¡¢GC ¹Òס·þÎñÌṩÕß½ø³ÌµÈ£¬ÕâÖÖʧ°Ü²»ÊÇÓÀ¾ÃÐÔµÄʧ°Ü£¬ËüµÄ»Ö¸´ÊÇ¿ÉÔ¤ÆÚµÄ¡£Èç¹û¿Í»§¶Ë¶Ô·þÎñµ÷ÓÃʱÑÓ²»Ãô¸Ð£¬¿ÉÒÔ¿¼ÂDzÉÓÃ×Ô¶¯»Ö¸´Ä£Ê½£¬¼´ÏÈ»º´æ£¬Ôٵȴý£¬×îºóÖØÊÔ¡£

3£®Í¨ÖªÀà·þÎñ¡£ÀýÈç֪ͨ·ÛË¿»ý·ÖÔö³¤¡¢¼Ç¼½Ó¿ÚÈÕÖ¾µÈ£¬¶Ô·þÎñµ÷ÓõÄʵʱÐÔÒªÇ󲻸ߣ¬¿ÉÒÔÈÝÈÌ×Ô¶¯»Ö¸´´øÀ´µÄʱÑÓÔö¼Ó¡£

ΪÁ˱£Ö¤¿É¿¿ÐÔ£¬Failcache ²ßÂÔÔÚÉè¼ÆµÄʱºòÐèÒª¿¼ÂÇÈçϼ¸¸öÒªËØ£º

1£®»º´æÊ±¼ä¡¢»º´æ¶ÔÏóÉÏÏÞÊýµÈÐèÒª×ö³öÏÞÖÆ£¬·ÀÖ¹ÄÚ´æÒç³ö¡£

2£®»º´æÌÔÌ­Ëã·¨µÄÑ¡Ôñ£¬ÊÇ·ñÖ§³ÖÓû§ÅäÖá£

3£®¶¨Ê±ÖØÊÔµÄÖÜÆÚ T¡¢ÖØÊÔµÄ×î´ó´ÎÊýµÈÐèÒª×ö³öÏÞÖÆ²¢Ö§³ÖÓû§Ö¸¶¨¡£

4£®ÖØÊÔ´ïµ½×î´óÉÏÏÞÈÔʧ°Ü£¬ÐèÒª¶ªÆúÏûÏ¢£¬¼Ç¼Òì³£ÈÕÖ¾¡£

¿ìËÙʧ°Ü£¨Failfast£©£ºÔÚÒµÎñ¸ß·åÆÚ£¬¶ÔÓÚһЩ·ÇºËÐĵķþÎñ£¬Ï£ÍûÖ»µ÷ÓÃÒ»´Î£¬Ê§°ÜÒ²²»ÔÙÖØÊÔ£¬ÎªÖØÒªµÄºËÐÄ·þÎñ½ÚÔ¼±¦¹óµÄÔËÐÐ×ÊÔ´¡£´Ëʱ£¬¿ìËÙʧ°ÜÊǸö²»´íµÄÑ¡Ôñ¡£¿ìËÙʧ°Ü²ßÂÔµÄÉè¼Æ±È½Ï¼òµ¥£¬»ñÈ¡µ½·þÎñµ÷ÓÃÒì³£Ö®ºó£¬Ö±½ÓºöÂÔÒì³££¬¼Ç¼Òì³£ÈÕÖ¾¡£

4. µÚÈý·½·þÎñÒÀÀµ¹ÊÕϸôÀë

4.1 ×ÜÌå²ßÂÔ

¾¡¹ÜºÜ¶àµÚÈý·½·þÎñ»áÌṩ SLA£¬µ«ÊÇ RPC ·þÎñ±¾Éí²¢²»ÄÜÍêÈ«ÒÀÀµµÚÈý·½·þÎñ×ÔÉíµÄ¿É¿¿ÐÔÀ´±£ÕÏ×Ô¼ºµÄ¸ß¿É¿¿£¬µÚÈý·½·þÎñÒÀÀµ¸ôÀëµÄ×ÜÌå²ßÂÔÈçÏ£º

1£®µÚÈý·½ÒÀÀµ¸ôÀë¿ÉÒÔ²ÉÓÃÏß³Ì³Ø + ÏìӦʽ±à³Ì£¨ÀýÈç RxJava£©µÄ·½Ê½ÊµÏÖ¡£

2£®¶ÔµÚÈý·½ÒÀÀµ½øÐзÖÀ࣬ÿÖÖÒÀÀµ¶ÔÓ¦Ò»¸ö¶ÀÁ¢µÄÏß³Ì / Ï̳߳ء£

3£®·þÎñ²»Ö±½Óµ÷ÓõÚÈý·½ÒÀÀµµÄ API£¬¶øÊÇʹÓÃÒì²½·â×°Ö®ºóµÄ API ½Ó¿Ú¡£

4£®Òì²½µ÷ÓõÚÈý·½ÒÀÀµ API Ö®ºó£¬»ñÈ¡ Future ¶ÔÏó¡£ÀûÓÃÏìӦʽ±à³Ì¿ò¼Ü£¬

¿ÉÒÔ¶©ÔĺóÐøµÄʼþ£¬½ÓÊÕÏìÓ¦£¬Õë¶ÔÏìÓ¦½øÐбà³Ì¡£

4.2 Òì²½»¯

Èç¹ûµÚÈý·½·þÎñÌṩµÄÊDZê×¼µÄ HTTP/Restful ·þÎñ£¬ÔòÀûÓÃÒì²½ HTTP ¿Í»§¶Ë£¬ÀýÈç Netty¡¢Vert.x¡¢Òì²½ RestTemplate µÈ·¢ÆðÒì²½·þÎñµ÷Óã¬ÕâÑùÎÞÂÛÊÇ·þÎñ¶Ë×ÔÉí´¦ÀíÂý»¹ÊÇÍøÂçÂý£¬¶¼²»»áµ¼Öµ÷Ó÷½±»×èÈû¡£

Èç¹û¶Ô·½ÊÇ˽ÓлòÕß¶¨ÖÆ»¯µÄЭÒ飬SDK ûÓÐÌṩÒì²½½Ó¿Ú£¬ÔòÐèÒª²ÉÓÃÏ̳߳ػòÕßÀûÓÃһЩ¿ªÔ´¿ò¼ÜʵÏÖ¹ÊÕϸôÀë¡£

Òì²½»¯Ê¾ÀýͼÈçÏÂËùʾ£º

ͼ 8 Òì²½»¯Ô­ÀíʾÒâͼ

Òì²½»¯µÄ¼¸¸ö¹Ø¼ü¼¼Êõµã£º

1£®Òì²½¾ßÓÐÒÀÀµºÍ´«µÝÐÔ£¬Èç¹ûÏëÔÚij¸öÒµÎñÁ÷³ÌµÄij¸ö¹ý³ÌÖÐ×öÒì²½»¯£¬ÔòÈë¿Ú´¦¾ÍÐèÒª×öÒì²½¡£ÀýÈçÈç¹ûÏë°Ñ Redis ·þÎñµ÷ÓøÄÔì³ÉÒì²½£¬Ôòµ÷Óà Redis ·þÎñ֮ǰµÄÁ÷³ÌÒ²ÐèҪͬʱ×öÒì²½»¯£¬·ñÔòÒâÒå²»´ó£¨³ý·Çµ÷Ó÷½²»ÐèÒª·µ»ØÖµ£©¡£

2£®Í¨³£¶øÑÔ£¬È«Õ»Òì²½¶ÔÓÚÒµÎñÐÔÄܺͿɿ¿ÐÔÌáÉýµÄÒâÒå¸ü´ó£¬È«Õ»Òì²½»áÉæ¼°µ½ÄÚ²¿·þÎñµ÷ÓᢵÚÈý·½·þÎñµ÷Óá¢Êý¾Ý¿â¡¢»º´æµÈƽ̨Öмä¼þ·þÎñµÄµ÷Óã¬Òì²½»¯¸ÄÔì³É±¾±È½Ï¸ß£¬µ«ÊÇÊÕÒæÒ²±È½ÏÃ÷ÏÔ¡£

3£®²»Í¬¿ò¼Ü¡¢·þÎñµÄÒì²½±à³ÌÄ£Ð;¡Á¿±£³ÖÒ»Ö£¬ÀýÈçͳһ²ÉÈ¡ RxJava ·ç¸ñµÄ½Ó¿Ú¡¢»òÕß JDK8 µÄ CompletableFuture¡£Èç¹û²»Í¬·þÎñ SDK µÄÒì²½ API ½Ó¿Ú·ç¸ñ²îÒì¹ý´ó£¬»áÔö¼ÓÒµÎñµÄ¿ª·¢³É±¾£¬Ò²²»ÀûÓÃÏß³ÌÄ£Ð͵Ĺ鲢ºÍÕûºÏ¡£

4.3. »ùÓÚ Hystrix µÄµÚÈý·½ÒÀÀµ¹ÊÕϸôÀë

¼¯³É Netflix ¿ªÔ´µÄ Hystrix ¿ò¼Ü£¬¿ÉÒԷdz£·½±ãµÄʵÏÖµÚÈý·½·þÎñÒÀÀµ¹ÊÕϸôÀ룬ËüÌṩµÄÖ÷Òª¹¦ÄܰüÀ¨:

1£®ÒÀÀµ¸ôÀë¡£

2£®ÈÛ¶ÏÆ÷¡£

3£®ÓÅÑŽµ¼¶¡£

4£®Reactive ±à³Ì¡£

5£®ÐźÅÁ¿¸ôÀë¡£

½¨ÒéµÄ¼¯³É²ßÂÔÈçÏ£º

1£®µÚÈý·½ÒÀÀµ¸ôÀ룺ʹÓà HystrixCommand ×öÒ»²ãÒì²½·â×°£¬ÊµÏÖÒµÎñµÄ RPC ·þÎñµ÷ÓÃÏ̺߳͵ÚÈý·½ÒÀÀµµÄÏ̸߳ôÀë¡£

2£®ÒÀÀµ·ÖÀà¹ÜÀí£º¶ÔµÚÈý·½ÒÀÀµ½øÐзÖÀà¡¢·Ö×é¹ÜÀí£¬¸ù¾ÝÒÀÀµµÄÌØµãÉèÖÃÈ۶ϲßÂÔ¡¢ÓÅÑŽµ¼¶²ßÂÔ¡¢³¬Ê±²ßÂԵȣ¬ÒÔʵÏÖ²îÒ컯µÄ´¦Àí¡£

×ÜÌ弯³ÉÊÓͼÈçÏÂËùʾ£º

ͼ 9 »ùÓÚ Hystrix µÄµÚÈý·½¹ÊÕϸôÀë¿ò¼Ü

»ùÓÚ Hystrix ¿ÉÒԷdz£·½±ãµÄʵÏÖµÚÈý·½ÒÀÀµ·þÎñµÄÈ۶Ͻµ¼¶£¬ËüµÄ¹¤×÷Ô­ÀíÈçÏ£º

1£®ÈÛ¶ÏÅжϣº·þÎñµ÷ÓÃʱ£¬¶ÔÈÛ¶Ï¿ª¹Ø×´Ì¬½øÐÐÅжϣ¬µ±ÈÛ¶ÏÆ÷¿ª¹Ø¹Ø±Õʱ, ÇëÇó±»ÔÊÐíͨ¹ýÈÛ¶ÏÆ÷¡£

2£®ÈÛ¶ÏÖ´ÐУºµ±ÈÛ¶ÏÆ÷¿ª¹Ø´ò¿ªÊ±£¬·þÎñµ÷ÓÃÇëÇó±»½ûֹͨ¹ý£¬Ö´ÐÐʧ°Ü»Øµ÷½Ó¿Ú¡£

3£®×Ô¶¯»Ö¸´£ºÈÛ¶ÏÖ®ºó£¬ÖÜÆÚ T Ö®ºóÔÊÐíÒ»ÌõÏûϢͨ¹ý£¬Èç¹û³É¹¦£¬ÔòÈ¡ÏûÈÛ¶Ï״̬£¬·ñÔò¼ÌÐø´¦ÓÚÈÛ¶Ï״̬¡£

Á÷³ÌÈçÏÂËùʾ£º

ͼ 10 »ùÓÚ Hystrix µÄÈ۶Ͻµ¼¶

   
3233 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÆóÒµ¼Ü¹¹¡¢TOGAFÓëArchiMate¸ÅÀÀ
¼Ü¹¹Ê¦Ö®Â·-ÈçºÎ×öºÃÒµÎñ½¨Ä££¿
´óÐÍÍøÕ¾µçÉÌÍøÕ¾¼Ü¹¹°¸ÀýºÍ¼¼Êõ¼Ü¹¹µÄʾÀý
ÍêÕûµÄArchimateÊÓµãÖ¸ÄÏ£¨°üÀ¨Ê¾Àý£©
Ïà¹ØÎĵµ

Êý¾ÝÖÐ̨¼¼Êõ¼Ü¹¹·½·¨ÂÛÓëʵ¼ù
ÊÊÓÃArchiMate¡¢EA ºÍ iSpace½øÐÐÆóÒµ¼Ü¹¹½¨Ä£
ZachmanÆóÒµ¼Ü¹¹¿ò¼Ü¼ò½é
ÆóÒµ¼Ü¹¹ÈÃSOAÂ䵨
Ïà¹Ø¿Î³Ì

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù