±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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 µÄÈ۶Ͻµ¼¶
|