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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÈÛ¶ÏÆ÷Éè¼ÆÄ£Ê½
 
×÷Õß yangecnuµÄ²©¿Í£¬»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-09-04
  3251  次浏览      27
 

Èç¹û´ó¼ÒÓÐÓ¡ÏóµÄ»°£¬ÓÈÆäÊÇÏÄÌ죬Èç¹û¼ÒÀïÓÃµç¸ºÔØ¹ý´ó£¬±ÈÈ翪Á˺ܶà¼ÒÓõçÆ÷£¬¾Í»á¡±×Ô¶¯ÌøÕ¢¡±£¬´Ëʱµç·¾Í»á¶Ï¿ª¡£ÔÚÒÔǰ¸ü¹ÅÀϵÄÒ»ÖÖ·½Ê½ÊÇ¡±±£ÏÕË¿¡±£¬µ±¸ºÔعý´ó£¬»òÕߵ緷¢Éú¹ÊÕÏ»òÒ쳣ʱ£¬µçÁ÷»á²»¶ÏÉý¸ß£¬Îª·ÀÖ¹Éý¸ßµÄµçÁ÷ÓпÉÄÜË𻵵ç·ÖеÄÄ³Ð©ÖØÒªÆ÷¼þ»ò¹óÖØÆ÷¼þ£¬ÉÕ»Ùµç·ÉõÖÁÔì³É»ðÔÖ¡£±£ÏÕË¿»áÔÚµçÁ÷Òì³£Éý¸ßµ½Ò»¶¨µÄ¸ß¶ÈºÍÈȶȵÄʱºò£¬×ÔÉíÈÛ¶ÏÇжϵçÁ÷£¬´Ó¶øÆðµ½±£»¤µç·°²È«ÔËÐеÄ×÷Óá£

ͬÑù£¬ÔÚ´óÐ͵ÄÈí¼þϵͳÖУ¬Èç¹ûµ÷ÓõÄÔ¶³Ì·þÎñ»òÕß×ÊÔ´ÓÉÓÚijÖÖÔ­ÒòÎÞ·¨Ê¹ÓÃʱ£¬Èç¹ûûÓÐÕâÖÖ¹ýÔØ±£»¤£¬¾Í»áµ¼ÖÂÇëÇóµÄ×ÊÔ´×èÈûÔÚ·þÎñÆ÷Éϵȴý´Ó¶øºÄ¾¡ÏµÍ³»òÕß·þÎñÆ÷×ÊÔ´¡£ºÜ¶àʱºò¸Õ¿ªÊ¼¿ÉÄÜÖ»ÊÇϵͳ³öÏÖÁ˾ֲ¿µÄ¡¢Ð¡¹æÄ£µÄ¹ÊÕÏ£¬È»¶øÓÉÓÚÖÖÖÖÔ­Òò£¬¹ÊÕÏÓ°ÏìµÄ·¶Î§Ô½À´Ô½´ó£¬×îÖÕµ¼ÖÂÁËÈ«¾ÖÐԵĺó¹û¡£Èí¼þϵͳÖеÄÕâÖÖ¹ýÔØ±£»¤¾ÍÊDZ¾ÎĽ«ÒªÌ¸µ½µÄÈÛ¶ÏÆ÷ģʽ(Circuit Breaker)

Ò» ÎÊÌâµÄ²úÉú

ÔÚ´óÐ͵ķֲ¼Ê½ÏµÍ³ÖУ¬Í¨³£ÐèÒªµ÷Óûò²Ù×÷Ô¶³ÌµÄ·þÎñ»òÕß×ÊÔ´£¬ÕâЩԶ³ÌµÄ·þÎñ»òÕß×ÊÔ´ÓÉÓÚµ÷ÓÃÕß²»¿ÉÒԿصÄÔ­Òò±ÈÈçÍøÂçÁ¬½Ó»ºÂý£¬×ÊÔ´±»Õ¼ÓûòÕßÔÝʱ²»¿ÉÓõÈÔ­Òò£¬µ¼Ö¶ÔÕâЩԶ³Ì×ÊÔ´µÄµ÷ÓÃʧ°Ü¡£ÕâЩ´íÎóͨ³£ÔÚÉÔºóµÄÒ»¶Îʱ¼äÄÚ¿ÉÒÔ»Ö¸´Õý³£¡£

µ«ÊÇ£¬ÔÚijЩÇé¿öÏ£¬ÓÉÓÚһЩÎÞ·¨Ô¤ÖªµÄÔ­Òòµ¼Ö½á¹ûºÜÄÑÔ¤ÁÏ£¬Ô¶³ÌµÄ·½·¨»òÕß×ÊÔ´¿ÉÄÜÐèÒªºÜ³¤µÄÒ»¶Îʱ¼ä²ÅÄÜÐÞ¸´¡£ÕâÖÖ´íÎóÑÏÖØµ½ÏµÍ³µÄ²¿·ÖʧȥÏìÓ¦ÉõÖÁµ¼ÖÂÕû¸ö·þÎñµÄÍêÈ«²»¿ÉÓá£ÔÚÕâÖÖÇé¿öÏ£¬²ÉÓò»¶ÏµØÖØÊÔ¿ÉÄܽâ¾ö²»ÁËÎÊÌ⣬Ïà·´£¬Ó¦ÓóÌÐòÔÚÕâ¸öʱºòÓ¦¸ÃÁ¢¼´·µ»Ø²¢ÇÒ±¨¸æ´íÎó¡£

ͨ³££¬Èç¹ûÒ»¸ö·þÎñÆ÷·Ç³£·±Ã¦£¬ÄÇôϵͳÖеIJ¿·Öʧ°Ü¿ÉÄܻᵼÖ ¡°Á¬ËøÊ§Ð§¡±£¨cascading failure£©¡£±ÈÈ磬ij¸ö²Ù×÷¿ÉÄÜ»áµ÷ÓÃÒ»¸öÔ¶³ÌµÄWebService£¬Õâ¸öservice»áÉèÖÃÒ»¸ö³¬Ê±µÄʱ¼ä£¬Èç¹ûÏìӦʱ¼ä³¬¹ýÁ˸Ãʱ¼ä¾Í»áÅ׳öÒ»¸öÒì³£¡£µ«ÊÇÕâÖÖ²ßÂԻᵼÖ²¢·¢µÄÇëÇóµ÷ÓÃͬÑùµÄ²Ù×÷»á×èÈû£¬Ò»Ö±µÈµ½³¬Ê±Ê±¼äµÄµ½ÆÚ¡£ÕâÖÖ¶ÔÇëÇóµÄ×èÈû¿ÉÄÜ»áÕ¼Óñ¦¹óµÄϵͳ×ÊÔ´£¬ÈçÄڴ棬Ị̈߳¬Êý¾Ý¿âÁ¬½ÓµÈµÈ£¬×îºóÕâЩ×ÊÔ´¾Í»áÏûºÄ´ù¾¡£¬Ê¹µÃÆäËûϵͳ²»Ïà¹ØµÄ²¿·ÖËùʹÓõÄ×ÊÔ´Ò²ºÄ¾¡´Ó¶øÍÏÀÛÕû¸öϵͳ¡£ÔÚÕâÖÖÇé¿öÏ£¬²Ù×÷Á¢¼´·µ»Ø´íÎó¶ø²»Êǵȴý³¬Ê±µÄ·¢Éú¿ÉÄÜÊÇÒ»ÖÖ¸üºÃµÄÑ¡Ôñ¡£Ö»Óе±µ÷Ó÷þÎñÓпÉÄܳɹ¦Ê±ÎÒÃÇÔÙÈ¥³¢ÊÔ¡£

¶þ ½â¾ö·½·¨

ÈÛ¶ÏÆ÷ģʽ¿ÉÒÔ·ÀÖ¹Ó¦ÓóÌÐò²»¶ÏµØ³¢ÊÔÖ´ÐпÉÄÜ»áʧ°ÜµÄ²Ù×÷£¬Ê¹µÃÓ¦ÓóÌÐò¼ÌÐøÖ´Ðжø²»ÓõȴýÐÞÕý´íÎ󣬻òÕßÀË·ÑCPUʱ¼äÈ¥µÈµ½³¤Ê±¼äµÄ³¬Ê±²úÉú¡£ÈÛ¶ÏÆ÷ģʽҲ¿ÉÒÔʹӦÓóÌÐòÄܹ»Õï¶Ï´íÎóÊÇ·ñÒѾ­ÐÞÕý£¬Èç¹ûÒѾ­ÐÞÕý£¬Ó¦ÓóÌÐò»áÔٴγ¢ÊÔµ÷ÓòÙ×÷¡£

ÈÛ¶ÏÆ÷ģʽ¾ÍÏñÊÇÄÇЩÈÝÒ×µ¼Ö´íÎóµÄ²Ù×÷µÄÒ»ÖÖ´úÀí¡£ÕâÖÖ´úÀíÄܹ»¼Ç¼×î½üµ÷Ó÷¢Éú´íÎóµÄ´ÎÊý£¬È»ºó¾ö¶¨Ê¹ÓÃÔÊÐí²Ù×÷¼ÌÐø£¬»òÕßÁ¢¼´·µ»Ø´íÎó¡£

ÈÛ¶ÏÆ÷¿ÉÒÔʹÓÃ״̬»úÀ´ÊµÏÖ£¬ÄÚ²¿Ä£ÄâÒÔϼ¸ÖÖ״̬¡£

1.±ÕºÏ£¨closed£©×´Ì¬£º ¶ÔÓ¦ÓóÌÐòµÄÇëÇóÄܹ»Ö±½ÓÒýÆð·½·¨µÄµ÷ÓᣴúÀíÀàά»¤ÁË×î½üµ÷ÓÃʧ°ÜµÄ´ÎÊý£¬Èç¹ûij´Îµ÷ÓÃʧ°Ü£¬Ôòʹʧ°Ü´ÎÊý¼Ó1¡£Èç¹û×î½üʧ°Ü´ÎÊý³¬¹ýÁËÔÚ¸ø¶¨Ê±¼äÄÚÔÊÐíʧ°ÜµÄãÐÖµ£¬Ôò´úÀíÀàÇл»µ½¶Ï¿ª(Open)״̬¡£´Ëʱ´úÀí¿ªÆôÁËÒ»¸ö³¬Ê±Ê±ÖÓ£¬µ±¸ÃʱÖÓ³¬¹ýÁ˸Ãʱ¼ä£¬ÔòÇл»µ½°ë¶Ï¿ª£¨Half-Open£©×´Ì¬¡£¸Ã³¬Ê±Ê±¼äµÄÉ趨ÊǸøÁËϵͳһ´Î»ú»áÀ´ÐÞÕýµ¼Öµ÷ÓÃʧ°ÜµÄ´íÎó¡£

2.¶Ï¿ª(Open)״̬£ºÔÚ¸Ã״̬Ï£¬¶ÔÓ¦ÓóÌÐòµÄÇëÇó»áÁ¢¼´·µ»Ø´íÎóÏìÓ¦¡£

3.°ë¶Ï¿ª£¨Half-Open£©×´Ì¬£ºÔÊÐí¶ÔÓ¦ÓóÌÐòµÄÒ»¶¨ÊýÁ¿µÄÇëÇó¿ÉÒÔÈ¥µ÷Ó÷þÎñ¡£Èç¹ûÕâЩÇëÇó¶Ô·þÎñµÄµ÷Óóɹ¦£¬ÄÇô¿ÉÒÔÈÏΪ֮ǰµ¼Öµ÷ÓÃʧ°ÜµÄ´íÎóÒѾ­ÐÞÕý£¬´ËʱÈÛ¶ÏÆ÷Çл»µ½±ÕºÏ״̬(²¢ÇÒ½«´íÎó¼ÆÊýÆ÷ÖØÖÃ)£»Èç¹ûÕâÒ»¶¨ÊýÁ¿µÄÇëÇóÓе÷ÓÃʧ°ÜµÄÇé¿ö£¬ÔòÈÏΪµ¼ÖÂ֮ǰµ÷ÓÃʧ°ÜµÄÎÊÌâÈÔÈ»´æÔÚ£¬ÈÛ¶ÏÆ÷Çлص½¶Ï¿ª·½Ê½£¬È»ºó¿ªÊ¼ÖØÖüÆÊ±Æ÷À´¸øÏµÍ³Ò»¶¨µÄʱ¼äÀ´ÐÞÕý´íÎó¡£°ë¶Ï¿ª×´Ì¬Äܹ»ÓÐЧ·ÀÖ¹ÕýÔÚ»Ö¸´ÖеķþÎñ±»Í»È»¶øÀ´µÄ´óÁ¿ÇëÇóÔÙ´ÎÍϿ塣

¸÷¸ö״̬֮¼äµÄת»»ÈçÏÂͼ£º

ÔÚClose״̬Ï£¬´íÎó¼ÆÊýÆ÷ÊÇ»ùÓÚʱ¼äµÄ¡£ÔÚÌØ¶¨µÄʱ¼ä¼ä¸ôÄÚ»á×Ô¶¯ÖØÖá£ÕâÄܹ»·ÀÖ¹ÓÉÓÚij´ÎµÄżȻ´íÎóµ¼ÖÂÈÛ¶ÏÆ÷½øÈë¶Ï¿ª×´Ì¬¡£´¥·¢ÈÛ¶ÏÆ÷½øÈë¶Ï¿ª×´Ì¬µÄʧ°ÜãÐÖµÖ»ÓÐÔÚÌØ¶¨µÄʱ¼ä¼ä¸ôÄÚ£¬´íÎó´ÎÊý´ïµ½Ö¸¶¨´íÎó´ÎÊýµÄãÐÖµ²Å»á²úÉú¡£ÔÚHalf-Open״̬ÖÐʹÓõÄÁ¬Ðø³É¹¦´ÎÊý¼ÆÊýÆ÷¼Ç¼µ÷Óõijɹ¦´ÎÊý¡£µ±Á¬Ðøµ÷Óóɹ¦´ÎÊý´ïµ½Ä³¸öÖ¸¶¨ÖµÊ±£¬Çл»µ½±ÕºÏ״̬£¬Èç¹ûij´Îµ÷ÓÃʧ°Ü£¬Á¢¼´Çл»µ½¶Ï¿ª×´Ì¬£¬Á¬Ðø³É¹¦µ÷ÓôÎÊý¼ÆÊ±Æ÷ÔÚÏ´νøÈë°ë¶Ï¿ª×´Ì¬Ê±¹éÁã¡£

ʵÏÖÈÛ¶ÏÆ÷ģʽʹµÃϵͳ¸ü¼ÓÎȶ¨ºÍÓе¯ÐÔ£¬ÔÚϵͳ´Ó´íÎóÖлָ´µÄʱºòÌṩÎȶ¨ÐÔ£¬²¢ÇÒ¼õÉÙÁË´íÎó¶ÔϵͳÐÔÄܵÄÓ°Ïì¡£Ëüͨ¹ý¿ìËٵľܾøÄÇЩÊÔͼÓпÉÄܵ÷ÓûᵼÖ´íÎóµÄ·þÎñ£¬¶ø²»»áÈ¥µÈ´ý²Ù×÷³¬Ê±»òÕßÓÀÔ¶²»»á²»·µ»Ø½á¹ûÀ´Ìá¸ßϵͳµÄÏìӦʼþ¡£Èç¹ûÈÛ¶ÏÆ÷Éè¼ÆÄ£Ê½ÔÚÿ´Î״̬Çл»µÄʱºò»á·¢³öÒ»¸öʼþ£¬ÕâÖÖÐÅÏ¢¿ÉÒÔÓÃÀ´¼à¿Ø·þÎñµÄÔËÐÐ״̬£¬Äܹ»Í¨Öª¹ÜÀíÔ±ÔÚÈÛ¶ÏÆ÷Çл»µ½¶Ï¿ª×´Ì¬Ê±½øÐд¦Àí¡£

¿ÉÒÔ¶ÔÈÛ¶ÏÆ÷ģʽ½øÐж¨ÖÆÒÔÊÊӦһЩ¿ÉÄܻᵼÖÂÔ¶³Ì·þÎñʧ°ÜµÄÌØ¶¨³¡¾°¡£±ÈÈ磬¿ÉÒÔÔÚÈÛ¶ÏÆ÷ÖжԳ¬Ê±Ê±¼äʹÓò»¶ÏÔö³¤µÄ²ßÂÔ¡£ÔÚÈÛ¶ÏÆ÷¿ªÊ¼½øÈë¶Ï¿ª×´Ì¬µÄʱºò£¬¿ÉÒÔÉèÖó¬Ê±Ê±¼äΪ¼¸ÃëÖÓ£¬È»ºóÈç¹û´íÎóûÓб»½â¾ö£¬È»ºó½«¸Ã³¬Ê±Ê±¼äÉèÖÃΪ¼¸·ÖÖÓ£¬ÒÀ´ÎÀàÍÆ¡£ÔÚһЩÇé¿öÏ£¬ÔÚ¶Ï¿ª×´Ì¬ÏÂÎÒÃÇ¿ÉÒÔ·µ»ØÒ»Ð©´íÎóµÄĬÈÏÖµ£¬¶ø²»ÊÇÅ׳öÒì³£¡£

Èý Òª¿¼ÂǵÄÒòËØ

ÔÚʵÏÖÈÛ¶ÏÆ÷ģʽµÄʱºò£¬ÒÔÏÂÕâЩÒòËØÐè¿ÉÄÜÐèÒª¿¼ÂÇ£º

1.Òì³£´¦Àí£ºµ÷ÓÃÊÜÈÛ¶ÏÆ÷±£»¤µÄ·þÎñµÄʱºò£¬ÎÒÃDZØÐëÒª´¦Àíµ±·þÎñ²»¿ÉÓÃʱµÄÒì³£Çé¿ö¡£ÕâЩÒì³£´¦Àíͨ³£ÐèÒªÊÓ¾ßÌåµÄÒµÎñÇé¿ö¶ø¶¨¡£±ÈÈ磬Èç¹ûÓ¦ÓóÌÐòÖ»ÊÇÔÝʱµÄ¹¦Äܽµ¼¶£¬¿ÉÄÜÐèÒªÇл»µ½ÆäËüµÄ¿ÉÌæ»»µÄ·þÎñÉÏÀ´Ö´ÐÐÏàͬµÄÈÎÎñ»òÕß»ñÈ¡ÏàͬµÄÊý¾Ý£¬»òÕ߸øÓû§±¨¸æ´íÎóÈ»ºóÌáʾËûÃÇÉÔºóÖØÊÔ¡£

2.Òì³£µÄÀàÐÍ£ºÇëÇóʧ°ÜµÄÔ­Òò¿ÉÄÜÓкܶàÖÖ¡£Ò»Ð©Ô­Òò¿ÉÄÜ»á±ÈÆäËüÔ­Òò¸üÑÏÖØ¡£±ÈÈ磬ÇëÇó»áʧ°Ü¿ÉÄÜÊÇÓÉÓÚÔ¶³ÌµÄ·þÎñ±ÀÀ££¬Õâ¿ÉÄÜÐèÒª»¨·ÑÊý·ÖÖÓÀ´»Ö¸´£»Ò²¿ÉÄÜÊÇÓÉÓÚ·þÎñÆ÷ÔÝʱ¸ºÔعýÖØµ¼Ö³¬Ê±¡£ÈÛ¶ÏÆ÷Ó¦¸ÃÄܹ»¼ì²é´íÎóµÄÀàÐÍ£¬´Ó¶ø¸ù¾Ý¾ßÌåµÄ´íÎóÇé¿öÀ´µ÷Õû²ßÂÔ¡£±ÈÈ磬¿ÉÄÜÐèÒªºÜ¶à´Î³¬Ê±Òì³£²Å¿ÉÒԶ϶¨ÐèÒªÇл»µ½¶Ï¿ª×´Ì¬£¬¶øÖ»ÐèÒª¼¸´Î´íÎóÌáʾ¾Í¿ÉÒÔÅжϷþÎñ²»¿ÉÓöø¿ìËÙÇл»µ½¶Ï¿ª×´Ì¬¡£

3.ÈÕÖ¾£ºÈÛ¶ÏÆ÷Ó¦¸ÃÄܹ»¼Ç¼ËùÓÐʧ°ÜµÄÇëÇó£¬ÒÔ¼°Ò»Ð©¿ÉÄ᳢ܻÊԳɹ¦µÄÇëÇó£¬Ê¹µÃµÄ¹ÜÀíÔ±Äܹ»¼à¿ØÊ¹ÓÃÈÛ¶ÏÆ÷±£»¤µÄ·þÎñµÄÖ´ÐÐÇé¿ö¡£

4.²âÊÔ·þÎñÊÇ·ñ¿ÉÓãºÔÚ¶Ï¿ª×´Ì¬Ï£¬ÈÛ¶ÏÆ÷¿ÉÒÔ²ÉÓö¨ÆÚµÄpingÔ¶³ÌµÄ·þÎñ»òÕß×ÊÔ´£¬À´ÅжÏÊÇ·ñ·þÎñÊÇ·ñ»Ö¸´£¬¶ø²»ÊÇʹÓüÆÊ±Æ÷À´×Ô¶¯Çл»µ½°ë¶Ï¿ª×´Ì¬¡£ÕâÖÖping²Ù×÷¿ÉÒÔÄ£Äâ֮ǰÄÇЩʧ°ÜµÄÇëÇ󣬻òÕß¿ÉÒÔʹÓÃͨ¹ýµ÷ÓÃÔ¶³Ì·þÎñÌṩµÄ¼ì²é·þÎñÊÇ·ñ¿ÉÓõķ½·¨À´Åжϡ£

5.ÊÖ¶¯ÖØÖãºÔÚϵͳÖжÔÓÚʧ°Ü²Ù×÷µÄ»Ö¸´Ê±¼äÊǺÜÄÑÈ·¶¨µÄ£¬Ìṩһ¸öÊÖ¶¯ÖØÖù¦ÄÜÄܹ»Ê¹µÃ¹ÜÀíÔ±¿ÉÒÔÊÖ¶¯µÄÇ¿ÖÆ½«ÈÛ¶ÏÆ÷Çл»µ½±ÕºÏ״̬¡£Í¬ÑùµÄ£¬Èç¹ûÊÜÈÛ¶ÏÆ÷±£»¤µÄ·þÎñÔÝʱ²»¿ÉÓõϰ£¬¹ÜÀíÔ±Äܹ»Ç¿ÖƵĽ«ÈÛ¶ÏÆ÷ÉèÖÃΪ¶Ï¿ª×´Ì¬¡£

6.²¢·¢ÎÊÌ⣺ÏàͬµÄÈÛ¶ÏÆ÷ÓпÉÄܱ»´óÁ¿²¢·¢ÇëÇóͬʱ·ÃÎÊ¡£ÈÛ¶ÏÆ÷µÄʵÏÖ²»Ó¦¸Ã×èÈû²¢·¢µÄÇëÇó»òÕßÔö¼Óÿ´ÎÇëÇóµ÷Óõĸºµ£¡£

7.×ÊÔ´µÄ²îÒìÐÔ£ºÊ¹Óõ¥¸öÈÛ¶ÏÆ÷ʱ£¬Ò»¸ö×ÊÔ´Èç¹û??Óзֲ¼ÔÚ¶à¸öµØ·½¾ÍÐèҪСÐÄ¡£±ÈÈ磬һ¸öÊý¾Ý¿ÉÄÜ´æ´¢ÔÚ¶à¸ö´ÅÅÌ·ÖÇøÉÏ(shard)£¬Ä³¸ö·ÖÇø¿ÉÒÔÕý³£·ÃÎÊ£¬¶øÁíÒ»¸ö¿ÉÄÜ´æÔÚÔÝʱÐÔµÄÎÊÌâ¡£ÔÚÕâÖÖÇé¿öÏ£¬²»Í¬µÄ´íÎóÏìÓ¦Èç¹û»ìΪһ̸£¬ÄÇôӦÓóÌÐò·ÃÎʵÄÕâЩ´æÔÚÎÊÌâµÄ·ÖÇøµÄʧ°ÜµÄ¿ÉÄÜÐԾͻá¸ß£¬¶øÄÇЩ±»ÈÏΪÊÇÕý³£µÄ·ÖÇø£¬¾ÍÓпÉÄܱ»×èÈû¡£

8.¼Ó¿ìÈÛ¶ÏÆ÷µÄÈ۶ϲÙ×÷:ÓÐʱºò£¬·þÎñ·µ»ØµÄ´íÎóÐÅÏ¢×ã¹»ÈÃÈÛ¶ÏÆ÷Á¢¼´Ö´ÐÐÈ۶ϲÙ×÷²¢ÇÒ±£³ÖÒ»¶Îʱ¼ä¡£±ÈÈ磬Èç¹û´ÓÒ»¸ö·Ö²¼Ê½×ÊÔ´·µ»ØµÄÏìÓ¦Ìáʾ¸ºÔس¬ÖØ£¬ÄÇô¿ÉÒԶ϶¨³ö²»½¨ÒéÁ¢¼´ÖØÊÔ£¬¶øÊÇÓ¦¸ÃµÈ´ý¼¸·ÖÖÓºóÔÙÖØÊÔ¡££¨HTTPЭÒ鶨ÒåÁË¡±HTTP 503 Service Unavailable¡±À´±íʾÇëÇóµÄ·þÎñµ±Ç°²»¿ÉÓã¬Ëû¿ÉÒÔ°üº¬ÆäËûÐÅÏ¢±ÈÈ磬³¬Ê±µÈ£©

9.ÖØ¸´Ê§°ÜÇëÇ󣺵±ÈÛ¶ÏÆ÷ÔÚ¶Ï¿ª×´Ì¬µÄʱºò£¬ÈÛ¶ÏÆ÷¿ÉÒԼǼÿһ´ÎÇëÇóµÄϸ½Ú£¬¶ø²»Êǽö½ö·µ»ØÊ§°ÜÐÅÏ¢£¬ÕâÑùµ±Ô¶³Ì·þÎñ»Ö¸´µÄʱºò£¬¿ÉÒÔ½«ÕâЩʧ°ÜµÄÇëÇóÔÙÖØÐÂÇëÇóÒ»´Î¡£

ËÄ Ê¹Óó¡¾°

Ó¦¸ÃʹÓøÃģʽÀ´£º

·ÀÖ¹Ó¦ÓóÌÐòÖ±½Óµ÷ÓÃÄÇЩºÜ¿ÉÄÜ»áµ÷ÓÃʧ°ÜµÄÔ¶³Ì·þÎñ»ò¹²Ïí×ÊÔ´¡£

²»Êʺϵij¡¾°£º

¶ÔÓÚÓ¦ÓóÌÐòÖеÄÖ±½Ó·ÃÎʱ¾µØË½ÓÐ×ÊÔ´£¬±ÈÈçÄÚ´æÖеÄÊý¾Ý½á¹¹£¬Èç¹ûʹÓÃÈÛ¶ÏÆ÷ģʽֻ»áÔö¼Óϵͳ¶îÍ⿪Ïú¡£

²»ÊʺÏ×÷ΪӦÓóÌÐòÖÐÒµÎñÂß¼­µÄÒì³£´¦ÀíÌæ´úÆ·

Îå ʵÏÖ

¸ù¾ÝÉÏÃæµÄ״̬Çл»Í¼£¬ÎÒÃǺÜÈÝÒ×ʵÏÖÒ»¸ö»ù±¾µÄÈÛ¶ÏÆ÷£¬Ö»ÐèÒªÔÚÄÚ²¿Î¬»¤Ò»¸ö״̬»ú£¬²¢¶¨ÒåºÃ×´Ì¬×ªÒÆµÄ¹æÔò£¬¿ÉÒÔʹÓÃStateģʽÀ´ÊµÏÖ¡£Ê×ÏÈ£¬ÎÒÃǶ¨ÒåÒ»¸ö±íÊ¾×´Ì¬×ªÒÆ²Ù×÷µÄ³éÏóÀàCircuitBreakerState£º

public abstract class CircuitBreakerState
{
protected CircuitBreakerState(CircuitBreaker circuitBreaker)
{
this.circuitBreaker = circuitBreaker;
}

/// <summary>
/// µ÷ÓÃÊܱ£»¤·½·¨Ö®Ç°´¦ÀíµÄ²Ù×÷
/// </summary>
public virtual void ProtectedCodeIsAboutToBeCalled() {
//Èç¹ûÊǶϿª×´Ì¬£¬Ö±½Ó·µ»Ø
//È»ºó×øµÈ³¬Ê±×ª»»µ½°ë¶Ï¿ª×´Ì¬
if (circuitBreaker.IsOpen)
{
throw new OpenCircuitException();
}
}

/// <summary>
/// ÊÜÈÛ¶ÏÆ÷±£»¤µÄ·½·¨µ÷Óóɹ¦Ö®ºóµÄ²Ù×÷
/// </summary>
public virtual void ProtectedCodeHasBeenCalled()
{
circuitBreaker.IncreaseSuccessCount();
}

/// <summary>
///ÊÜÈÛ¶ÏÆ÷±£»¤µÄ·½·¨µ÷Ó÷¢ÉúÒì³£²Ù×÷ºóµÄ²Ù×÷
/// </summary>
/// <param name="e"></param>
public virtual void ActUponException(Exception e)
{
//Ôö¼Óʧ°Ü´ÎÊý¼ÆÊýÆ÷£¬²¢ÇÒ±£´æ´íÎóÐÅÏ¢
circuitBreaker.IncreaseFailureCount(e);
//ÖØÖÃÁ¬Ðø³É¹¦´ÎÊý
circuitBreaker.ResetConsecutiveSuccessCount();
}

protected readonly CircuitBreaker circuitBreaker;
}

³éÏóÀàÖУ¬×´Ì¬»úCircuitBreakerͨ¹ý¹¹Ô캯Êý×¢È룻µ±·¢Éú´íÎóʱ£¬ÎÒÃÇÔö¼Ó´íÎó¼ÆÊýÆ÷£¬²¢ÇÒÖØÖÃÁ¬Ðø³É¹¦¼ÆÊýÆ÷£¬ÔÚÔö¼Ó´íÎó¼ÆÊýÆ÷²Ù×÷ÖУ¬Í¬Ê±Ò²¼Ç¼Á˳ö´íµÄÒì³£ÐÅÏ¢¡£

È»ºóÔÚ·Ö±ðʵÏÖ±íʾÈÛ¶ÏÆ÷Èý¸ö״̬µÄÀà¡£Ê×ÏÈʵÏÖ±ÕºÏ״̬CloseState£º

public class ClosedState : CircuitBreakerState
{
public ClosedState(CircuitBreaker circuitBreaker)
: base(circuitBreaker)
{
//ÖØÖÃʧ°Ü¼ÆÊýÆ÷
circuitBreaker.ResetFailureCount();
}

public override void ActUponException(Exception e)
{
base.ActUponException(e);
//Èç¹ûʧ°Ü´ÎÊý´ïµ½ãÐÖµ£¬ÔòÇл»µ½¶Ï¿ª×´Ì¬
if (circuitBreaker.FailureThresholdReached())
{
circuitBreaker.MoveToOpenState();
}
}
}

ÔÚ±ÕºÏ״̬Ï£¬Èç¹û·¢Éú´íÎ󣬲¢ÇÒ´íÎó´ÎÊý´ïµ½ãÐÖµ£¬Ôò״̬»úÇл»µ½¶Ï¿ª×´Ì¬¡£¶Ï¿ª×´Ì¬OpenStateµÄʵÏÖÈçÏ£º

public class OpenState : CircuitBreakerState
{
private readonly Timer timer;

public OpenState(CircuitBreaker circuitBreaker)
: base(circuitBreaker)
{
timer = new Timer(circuitBreaker.Timeout.TotalMilliseconds);
timer.Elapsed += TimeoutHasBeenReached;
timer.AutoReset = false;
timer.Start();
}

//¶Ï¿ª³¬¹ýÉ趨µÄãÐÖµ£¬×Ô¶¯Çл»µ½°ë¶Ï¿ª×´Ì¬
private void TimeoutHasBeenReached(object sender, ElapsedEventArgs e)
{
circuitBreaker.MoveToHalfOpenState();
}

public override void ProtectedCodeIsAboutToBeCalled()
{
base.ProtectedCodeIsAboutToBeCalled();
throw new OpenCircuitException();
}
}

¶Ï¿ª×´Ì¬ÄÚ²¿Î¬»¤Ò»¸ö¼ÆÊýÆ÷£¬Èç¹û¶Ï¿ª´ïµ½Ò»¶¨µÄʱ¼ä£¬Ôò×Ô¶¯Çл»µ½°æ¶Ï¿ª×´Ì¬£¬²¢ÇÒ£¬ÔÚ¶Ï¿ª×´Ì¬Ï£¬Èç¹ûÐèÒªÖ´ÐвÙ×÷£¬ÔòÖ±½ÓÅ׳öÒì³£¡£

×îºó°ë¶Ï¿ªHalf-Open״̬ʵÏÖÈçÏ£º

public class HalfOpenState : CircuitBreakerState
{
public HalfOpenState(CircuitBreaker circuitBreaker)
: base(circuitBreaker)
{
//ÖØÖÃÁ¬Ðø³É¹¦¼ÆÊý
circuitBreaker.ResetConsecutiveSuccessCount();
}

public override void ActUponException(Exception e)
{
base.ActUponException(e);
//Ö»ÒªÓÐʧ°Ü£¬Á¢¼´Çл»µ½¶Ï¿ªÄ£Ê½
circuitBreaker.MoveToOpenState();
}

public override void ProtectedCodeHasBeenCalled()
{
base.ProtectedCodeHasBeenCalled();
//Èç¹ûÁ¬Ðø³É¹¦´ÎÊý´ïµ½ãÐÖµ£¬Çл»µ½±ÕºÏ״̬
if (circuitBreaker.ConsecutiveSuccessThresholdReached())
{
circuitBreaker.MoveToClosedState();
}
}
}

Çл»µ½°ë¶Ï¿ª×´Ì¬Ê±£¬½«Á¬Ðø³É¹¦µ÷ÓüÆÊýÖØÖÃΪ0£¬µ±Ö´Ðгɹ¦µÄʱºò£¬×ÔÔö¸Ä×ֶΣ¬µ±´ïµ½Á¬¶Áµ÷Óóɹ¦´ÎÊýµÄãÐֵʱ£¬Çл»µ½±ÕºÏ״̬¡£Èç¹ûµ÷ÓÃʧ°Ü£¬Á¢¼´Çл»µ½¶Ï¿ªÄ£Ê½¡£

ÓÐÁËÒÔÉÏÈýÖÖ״̬Çл»Ö®ºó£¬ÎÒÃÇҪʵÏÖCircuitBreakerÀàÁË:

public class CircuitBreaker
{
private readonly object monitor = new object();
private CircuitBreakerState state;
public int FailureCount { get; private set; }
public int ConsecutiveSuccessCount { get; private set; }
public int FailureThreshold { get; private set; }
public int ConsecutiveSuccessThreshold { get; private set; }
public TimeSpan Timeout { get; private set; }
public Exception LastException { get; private set; }

public bool IsClosed
{
get { return state is ClosedState; }
}

public bool IsOpen
{
get { return state is OpenState; }
}

public bool IsHalfOpen
{
get { return state is HalfOpenState; }
}

internal void MoveToClosedState()
{
state = new ClosedState(this);
}

internal void MoveToOpenState()
{
state = new OpenState(this);
}

internal void MoveToHalfOpenState()
{
state = new HalfOpenState(this);
}

internal void IncreaseFailureCount(Exception ex)
{
LastException = ex;
FailureCount++;
}

internal void ResetFailureCount()
{
FailureCount = 0;
}

internal bool FailureThresholdReached()
{
return FailureCount >= FailureThreshold;
}

internal void IncreaseSuccessCount()
{
ConsecutiveSuccessCount++;
}

internal void ResetConsecutiveSuccessCount()
{
ConsecutiveSuccessCount = 0;
}

internal bool ConsecutiveSuccessThresholdReached()
{
return ConsecutiveSuccessCount >= ConsecutiveSuccessThreshold;
}

}

ÔÚ¸ÃÀàÖÐÊ×ÏÈ£º

1.¶¨ÒåÁËһЩ¼Ç¼״̬µÄ±äÁ¿£¬ÈçFailureCount£¬ConsecutiveSuccessCount ¼Ç¼ʧ°Ü´ÎÊý£¬Á¬Ðø³É¹¦´ÎÊý£¬ÒÔ¼°FailureThreshold£¬ConsecutiveSuccessThreshold¼Ç¼×î´óµ÷ÓÃʧ°Ü´ÎÊý£¬Á¬Ðøµ÷Óóɹ¦´ÎÊý¡£ÕâЩ¶ÔÏó¶ÔÍⲿÀ´ËµÊÇÖ»¶ÁµÄ¡£

2.¶¨ÒåÁËÒ»¸ö CircuitBreakerStateÀàÐ͵Ästate±äÁ¿£¬ÒÔ±íʾµ±Ç°ÏµÍ³µÄ״̬¡£

3.¶¨ÒåÁËһЩÁлñÈ¡µ±Ç°×´Ì¬µÄ·½·¨IsOpen,IsClose,IsHalfOpen,ÒÔ¼°±íÊ¾×´Ì¬×ªÒÆµÄ·½·¨MoveToOpenState£¬MoveToClosedStateµÈ£¬ÕâЩ·½·¨±È½Ï¼òµ¥£¬¸ù¾ÝÃû×Ö¼´¿É¿´³öÓÃÒâ¡£

È»ºó£¬¿ÉÒÔͨ¹ý¹¹Ô캯Êý½«ÔÚClose״̬ÏÂ×î´óʧ°Ü´ÎÊý£¬HalfOpen״̬ÏÂʹÓõÄ×î´óÁ¬Ðø³É¹¦´ÎÊý£¬ÒÔ¼°Open״̬ϵij¬Ê±Ê±¼äͨ¹ý¹¹Ô캯Êý´«½øÀ´£º

public CircuitBreaker(int failedthreshold, int consecutiveSuccessThreshold, TimeSpan timeout)
{
if (failedthreshold < 1 || consecutiveSuccessThreshold < 1)
{
throw new ArgumentOutOfRangeException("threshold", "Threshold should be greater than 0");
}

if (timeout.TotalMilliseconds < 1)
{
throw new ArgumentOutOfRangeException("timeout", "Timeout should be greater than 0");
}

FailureThreshold = failedthreshold;
ConsecutiveSuccessThreshold = consecutiveSuccessThreshold;
Timeout = timeout;
MoveToClosedState();
}

ÔÚ³õʼ״̬Ï£¬ÈÛ¶ÏÆ÷Çл»µ½±ÕºÏ״̬¡£

È»ºó£¬¿ÉÒÔͨ¹ýAttempCallµ÷Ó㬴«ÈëÆÚÍûÖ´ÐеĴúÀí·½·¨£¬¸Ã·½·¨µÄÖ´ÐÐÊÜÈÛ¶ÏÆ÷±£»¤¡£ÕâÀïʹÓÃÁËËøÀ´´¦Àí²¢·¢ÎÊÌâ¡£

public void AttemptCall(Action protectedCode)
{
using (TimedLock.Lock(monitor))
{
state.ProtectedCodeIsAboutToBeCalled();
}

try
{
protectedCode();
}
catch (Exception e)
{
using (TimedLock.Lock(monitor))
{
state.ActUponException(e);
}
throw;
}

using (TimedLock.Lock(monitor))
{
state.ProtectedCodeHasBeenCalled();
}
}

×îºó£¬ÌṩCloseºÍOpenÁ½¸ö·½·¨À´ÊÖ¶¯Çл»µ±Ç°×´Ì¬¡£

public void Close()
{
using (TimedLock.Lock(monitor))
{
MoveToClosedState();
}
}

public void Open()
{
using (TimedLock.Lock(monitor))
{
MoveToOpenState();
}
}

Áù ²âÊÔ

ÒÔÉϵÄÈÛ¶Ïģʽ£¬ÎÒÃÇ¿ÉÒÔ¶ÔÆä½¨Á¢µ¥Ôª²âÊÔ¡£

Ê×ÏÈÎÒÃDZàд¼¸¸ö°ïÖúÀàÒÔÄ£ÄâÁ¬ÐøÖ´ÐдÎÊý£º

private static void CallXAmountOfTimes(Action codeToCall, int timesToCall)
{
for (int i = 0; i < timesToCall; i++)
{
codeToCall();
}
}

ÒÔÏÂÀàÓÃÀ´Å׳öÌØ¶¨Òì³££º

private static void AssertThatExceptionIsThrown<T>(Action code) where T : Exception
{
try
{
code();
}
catch (T)
{
return;
}

Assert.Fail("Expected exception of type {0} was not thrown", typeof(T).FullName);
}

È»ºó£¬Ê¹ÓÃNUnit£¬¿ÉÒÔ½¨Á¢ÈçÏÂCase£º

[Test]
public void ClosesIfProtectedCodeSucceedsInHalfOpenState()
{
var stub = new Stub(10);
//¶¨ÒåÈÛ¶ÏÆ÷£¬Ê§°Ü10´Î½øÈë¶Ï¿ª×´Ì¬
//5Ãëºó½øÈë°ë¶Ï¿ª×´Ì¬
//ÔÚ°ë¶Ï¿ª×´Ì¬Ï£¬Á¬Ðø³É¹¦15´Î£¬½øÈë±ÕºÏ״̬
var circuitBreaker = new CircuitBreaker(10, 15, TimeSpan.FromMilliseconds(5000));
Assert.That(circuitBreaker.IsClosed);
//ʧ°Ü10´Îµ÷ÓÃ
CallXAmountOfTimes(() => AssertThatExceptionIsThrown<ApplicationException>(() => circuitBreaker.AttemptCall(stub.DoStuff)), 10);

Assert.AreEqual(10, circuitBreaker.FailureCount);

Assert.That(circuitBreaker.IsOpen);

//µÈ´ý´ÓOpenתµ½HalfOpen
Thread.Sleep(6000);
Assert.That(circuitBreaker.IsHalfOpen);
//³É¹¦µ÷ÓÃ15´Î
CallXAmountOfTimes(()=>circuitBreaker.AttemptCall(stub.DoStuff), 15);

Assert.AreEqual(15, circuitBreaker.ConsecutiveSuccessCount);
Assert.AreEqual(0, circuitBreaker.FailureCount);
Assert.That(circuitBreaker.IsClosed);
}

Õâ¸öCaseÄ£ÄâÁËÈÛ¶ÏÆ÷ÖÐ״̬µÄת»»¡£Ê×Ïȳõʼ»¯Ê±£¬ÈÛ¶ÏÆ÷´¦ÓÚ±ÕºÏ״̬£¬È»ºóÁ¬Ðø10´Îµ÷ÓÃÅ׳öÒì³££¬ÕâʱÈÛ¶ÏÆ÷½øÈ¥Á˶Ͽª×´Ì¬£¬È»ºóÈÃÏ̵߳ȴý6Ã룬´ËʱÔÚµÚ5ÃëµÄʱºò£¬×´Ì¬Çл»µ½Á˰ë¶Ï¿ª×´Ì¬¡£È»ºóÁ¬Ðø15´Î³É¹¦µ÷Ó㬴Ëʱ״̬ÓÖÇл»µ½Á˱պÏ״̬¡£

Æß ½áÂÛ

ÔÚÓ¦ÓÃϵͳÖУ¬ÎÒÃÇͨ³£»áÈ¥µ÷ÓÃÔ¶³ÌµÄ·þÎñ»òÕß×ÊÔ´(ÕâЩ·þÎñ»ò×ÊԴͨ³£ÊÇÀ´×ÔµÚÈý·½)£¬¶ÔÕâЩԶ³Ì·þÎñ»òÕß×ÊÔ´µÄµ÷ÓÃͨ³£»áµ¼ÖÂʧ°Ü£¬»òÕß¹ÒÆðûÓÐÏìÓ¦£¬Ö±µ½³¬Ê±µÄ²úÉú¡£ÔÚһЩ¼«¶ËÇé¿öÏ£¬´óÁ¿µÄÇëÇó»á×èÈûÔÚ¶ÔÕâЩÒì³£µÄÔ¶³Ì·þÎñµÄµ÷ÓÃÉÏ£¬»áµ¼ÖÂһЩ¹Ø¼üÐÔµÄϵͳ×ÊÔ´ºÄ¾¡£¬´Ó¶øµ¼Ö¼¶ÁªµÄʧ°Ü£¬´Ó¶øÍÏ¿åÕû¸öϵͳ¡£ÈÛ¶ÏÆ÷ģʽÔÚÄÚ²¿²ÉÓÃ״̬»úµÄÐÎʽ£¬Ê¹µÃ¶ÔÕâЩ¿ÉÄܻᵼÖÂÇëÇóʧ°ÜµÄÔ¶³Ì·þÎñ½øÐÐÁ˰ü×°£¬µ±Ô¶³Ì·þÎñ·¢ÉúÒ쳣ʱ£¬¿ÉÒÔÁ¢¼´¶Ô½øÀ´µÄÇëÇ󷵻شíÎóÏìÓ¦£¬²¢¸æÖªÏµÍ³¹ÜÀíÔ±£¬½«´íÎó¿ØÖÆÔÚ¾Ö²¿·¶Î§ÄÚ£¬´Ó¶øÌá¸ßϵͳµÄÎȶ¨ÐԺͿɿ¿ÐÔ¡£

±¾ÎÄÊ×ÏȽéÉÜÁËÈÛ¶ÏÆ÷ģʽʹÓõij¡¾°£¬Äܹ»½â¾öµÄÎÊÌ⣬ÒÔ¼°ÐèÒª¿¼ÂǵÄÒòËØ£¬×îºóʹÓôúÂëչʾÁËÈçºÎʵÏÖÒ»¸ö¼òµ¥µÄÈÛ¶ÏÆ÷£¬²¢ÇÒ¸ø³öÁ˲âÊÔÓÃÀý£¬Ï£ÍûÕâЩ¶ÔÄúÓаïÖú£¬ÓÈÆäÊÇÔÚµ±ÄúµÄϵͳµ÷ÓÃÁËÍⲿµÄÔ¶³Ì·þÎñ»òÕß×ÊÔ´£¬Í¬Ê±·ÃÎÊÁ¿ÓֺܴóµÄÇé¿ö϶ÔÌá¸ßϵͳµÄÎȶ¨ÐԺͿɿ¿ÐÔÓÐËù°ïÖú¡£

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

ΪʲôҪ×ö³ÖÐø²¿Êð£¿
ÆÊÎö¡°³ÖÐø½»¸¶¡±£ºÎå¸öºËÐÄʵ¼ù
¼¯³ÉÓë¹¹½¨Ö¸ÄÏ
³ÖÐø¼¯³É¹¤¾ßµÄÑ¡Ôñ-×°ÔØ
 
Ïà¹ØÎĵµ

³ÖÐø¼¯³É½éÉÜ
ʹÓÃHudson³ÖÐø¼¯³É
³ÖÐø¼¯³ÉÖ®-ÒÀÀµ¹ÜÀí
IPD¼¯³É²úÆ·¿ª·¢¹ÜÀí
Ïà¹Ø¿Î³Ì

ÅäÖùÜÀí¡¢ÈÕ¹¹½¨Óë³ÖÐø¼¯³É
Èí¼þ¼Ü¹¹Éè¼Æ·½·¨¡¢°¸ÀýÓëʵ¼ù
µ¥Ôª²âÊÔ¡¢Öع¹¼°³ÖÐø¼¯³É
»ùÓÚAndroidµÄµ¥Ôª¡¢ÐÔÄܲâÊÔ
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
Visitor Parttern
ÓÉ±í¼°À￴ģʽ
Éè¼ÆÄ£Ê½Ëæ±ÊϵÁÐ
ÉîÈëdz³öÉè¼ÆÄ£Ê½-½éÉÜ
.NETÖеÄÉè¼ÆÄ£Ê½

Ïà¹ØÅàѵ¿Î³Ì

J2EEÉè¼ÆÄ£Ê½ºÍÐÔÄܵ÷ÓÅ
Ó¦ÓÃģʽÉè¼ÆJavaÆóÒµ¼¶Ó¦ÓÃ
Éè¼ÆÄ£Ê½Ô­ÀíÓëÓ¦ÓÃ
J2EEÉè¼ÆÄ£Ê½Ö¸ÄÏ
µ¥Ôª²âÊÔ+ÖØ¹¹+Éè¼ÆÄ£Ê½
Éè¼ÆÄ£Ê½¼°ÆäCSharpʵÏÖ


ijµçÁ¦¹«Ë¾ Éè¼ÆÄ£Ê½Ô­Àí
À¶ÍØÆË Éè¼ÆÄ£Ê½Ô­Àí¼°Ó¦ÓÃ
ÎÀÐǵ¼º½ UML & OOAD
ÌÀɭ·͸Ñз¢ÖÐÐÄ UML& OOAD
Öдïµçͨ Éè¼ÆÄ£Ê½Ô­Àí
Î÷ÃÅ×Ó Ç¶ÈëʽÉè¼ÆÄ£Ê½
 
 
 
¡¡