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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ÖÊÁ¿±£ÕÏÐÂÊֶΣ¬Ð¯³Ì»Ø¹é²âÊÔÆ½Ì¨Êµ¼ù
 
×÷ÕߣºSedro
  4133  次浏览      28
 2021-2-5 
 
±à¼­ÍƼö:
±¾ÎÄϵͳµÄ½éÉÜÁËCtripPaymentRepeaterµÄÄ¿±êÒÔ¼°ÊµÏÖÔ­ÀíÒÔ¼°Á÷Á¿¸´ÖÆ¡¢Á÷Á¿»Ø·ÅµÄ¼¼Êõ·½°¸£¬Ï£Íû¸øÒòƵ·±½øÐлعé²âÊÔ¶øÀ§ÈŵÄÅóÓÑһЩ°ïÖúºÍ½è¼ø¡£
±¾ÎÄÀ´×ÔÓÚ΢ÐÅЯ³Ì¼¼Êõ£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼­¡¢ÍƼö¡£

Ò»¡¢ÏµÍ³»Ø¹éÎÊÌâ

»Ø¹é²âÊÔÊÇÈí¼þÉúÃüÖÜÆÚÒ»¸öÊ®·ÖÖØÒªµÄ»·½Ú£¬µ«ÏîÄ¿ÔÚËæ×Ű汾µÄÖð²½µü´ú£¬¹¦ÄÜÈÕÒæÔö¶à£¬ÏµÍ³Óú¼Ó¸´ÔÓ£¬ÔÚ²âÊÔ¹ý³ÌÖвâÊÔÈËÔ±³£³£ÐèÒª»Ø¹éÎȶ¨°æ±¾µÄ¹¦ÄÜÒÔ±£Ö¤²»±»´ý·¢²¼°æ±¾ÐèÇóËùÓ°Ïì¡£ÈôÒª¶Ôϵͳ½øÐÐÈ«·½Î»»Ø¹é£¬Õâ¸ö²âÊԵŤ×÷Á¿½«»á·Ç³£ÅӴ󣬶øÇÒ¿ÉÄܼ¸°ÙÉÏǧÓÃÀýÖвŻᷢÏÖÒ»¸öÉõÖÁÊÇ 0 ¸öÎÊÌ⣬²âÊÔͶÈë²ú³ö²»³É±ÈÀý¡£

¶ø CPR ÔòΪÉÏÊöÎÊÌâÌṩÁ˽ϺõĽâ¾ö·½°¸¡£Ëüͨ¹ý»ùÓÚÎȶ¨°æ±¾µÄÊä³ö£¬¶Ô´ý·¢²¼°æ±¾µÄÊä³ö½øÐбȽϣ¬Í¬Ê±»¹½«Ð£ÑéÁ½¸ö°æ±¾¶ÔÏÂÓÎÇëÇóµÄ²îÒì¡£¸ù¾Ý±È¶Ô½á¹ûÆÀÅдý·¢²¼°æ±¾ÊÇ·ñÕýÈ·£¬¿ÉÒÔ´ó´ó½µµÍ»Ø¹éµÄ¹¤×÷Á¿¡£

¶þ¡¢CPR Ä¿±ê

´óÁ¿ÕæÊµÁ÷Á¿È·±£¸²¸ÇÂʽ«Â¼ÖƵÄÁ÷Á¿×÷ΪÓÃÀý¹ÜÀíÆðÀ´½øÐÐ×Ô¶¯»¯»Ø¹éÁ÷Á¿»Ø·ÅÖ§³Ö×Óµ÷ÓÃ×Ô¶¯»¯ mock£¬±ÜÃâ»Ø·Å²úÉúÔàÊý¾ÝÁ÷Á¿»Ø·ÅÖ§³Ö×Óµ÷Óýá¹ûµÄÑéÖ¤¼õÉÙÈËÁ¦×ÊÔ´

Èý¡¢Ä¿±êʵÏÖ»ù±¾¹ý³Ì

1£©Ê×ÏȽ«²¿ÊðÁËÎȶ¨´úÂëµÄ·þÎñÆ÷×÷ΪÁ÷Á¿²É¼¯Ô´¡£²âÊÔÈËÔ±ÔÚ½øÐй¦ÄÜ¡¢½Ó¿Ú²âÊÔʱ£¬ÊµÏÖ²âÊÔÖ´Ðйý³ÌÖÐÖ÷µ÷ÓÃÒÔ¼°×Óµ÷ÓõÄÈë²ÎºÍ·µ»ØÖµµÄÂ¼ÖÆ¡£Í¨¹ý¹¦ÄܺͽӿڲâÊÔʵÏÖ¶ÔÓ¦Óù¦ÄܵÄÈ«Á¿¸²¸Ç£¬Ê¹µÃÓ¦ÓÃÖÐÇëÇóÁ÷Á¿¶¼»á±»Â¼ÖƵ½¡£

2£©½«Â¼ÖƵ½µÄÇëÇóÁ÷Á¿¸´ÖƵ½ console ƽ̨£¬ÓɲâÊÔÈËÔ±·ÖÎöÓÐЧµÄÁ÷Á¿¹éÄÉΪÓÃÀý¡£ºóÐø¼´¿É²ÉÓÃÕâЩÓÐЧÓÃÀýÀ´¶Ô´ý·¢²¼°æ±¾½øÐлطźͲîÒì±È¶Ô¡£

3£©»Ø·ÅÍê³É¸æÖªµ½²âÊÔÈËÔ±£¬ÓɲâÊÔÈËÔ±¶Ô»Ø·ÅµÄ²îÒì½á¹û½øÐÐÈ·ÈÏ£¬¿ìËÙ·¢ÏÖ±»²âϵͳ bug ²¢½â¾ö¡£

ËÄ¡¢CPR Ô­Àí¼°ÊµÏÖ

4.1. CPR Â¼ÖÆµÄÊý¾Ýץȡµã

ÈçÉÏͼËùʾ£¬CPR ²É¼¯µÄÊý¾ÝÖ÷ҪΪÁ½·½Ã棺´ý²âÓ¦ÓýÓÊÕµ½µÄ¿Í»§¶ËÇëÇó¼°ÏìÓ¦£»´ý²âÓ¦ÓýÓÊÕÇëÇóºóÏòÍⲿ·þÎñµÄ×Óµ÷ÓÃÇëÇó¼°ÏìÓ¦¡£CPR Ŀǰ֧³ÖµÄÇëÇóÀàÐÍÈçÉÏͼ³ÈÉ«¿òÖÐËùʾ£»µ« CPR ±¾ÉíÉè¼ÆÊ±¶Ô¸÷ÀàÇëÇó²ÉÓòå¼þʽÉè¼Æ£¬Ê¹Æä¾ßÓнϺõÄÀ©Õ¹ÐÔ£¬¶ÔÓÚºóÐøÆäËûÐèÒª²¶»ñµÄÀàÐÍÄܺܺõĽøÐÐÖ§³Ö¡£µ±Ç° CPR ϵͳ֧³ÖµÄ±¨ÎÄЭÒéΪ JSON ºÍ PB(ProtoBuf)¡£

4.2. CPR ½á¹¹¼ò½é

CPR ·ÖΪÁ½´ó×é¼þ£º

1£©CPR (CtripPaymentRepeater) ×é¼þ£¬¸Ã×é¼þ»ùÓÚ¿ªÔ´µÄ jvm-sandbox ¿ª·¢£¬ÓÃÓÚÂ¼ÖÆºÍ»Ø·ÅÁ÷Á¿¡£´Ë×é¼þºËÐÄΪÁ½²¿·Ö£º

CPRRecord£ºÄ¿±êÊÇÔÚÎȶ¨´úÂë»·¾³ÖÐÂ¼ÖÆÇëÇóµ÷ÓõÄÈë²ÎºÍ·µ»ØÖµ£¬²¢ÉÏË͵½´æ´¢·þÎñ¡£Ê¹µÃ CPR Replay ¾ß±¸»Ø·ÅÁ÷Á¿µÄÊý¾Ý¡£

CPRReplay£º¹¦ÄÜΪ½ÓÊջطŷþÎñÌṩµÄ»Ø·ÅÁ÷Á¿£¬ÔÚ´ý²â´úÂë»·¾³ÖнøÐлطţ¬²¢½«»Ø·Å½á¹ûÉÏËÍÖÁ¶Ô±È·þÎñ£¬ÈÃÆäʵÏÖÕý³£ÏµÍ³ºÍ´ý²âϵͳ·µ»Ø½á¹û±È¶Ô²îÒìµÄÄÜÁ¦¡£

2£©CPRConsole ×é¼þ£¬¸Ã×é¼þÖ÷ÒªÂ¼ÖÆ/»Ø·ÅµÄÅäÖùÜÀí£»Êý¾Ý´æ´¢/Êý¾Ý¶Ô±ÈµÈ¾ß±¸¶àÖÖÄÜÁ¦¡£Ö÷Òª°üº¬Èý²¿·Ö£º

´æ´¢·þÎñ£º¶Ô½ÓÊÕµ½µÄÂ¼ÖÆÁ÷Á¿Êý¾Ý£¬½«Æä³Ö¾Ã»¯±£´æ£¬´ýºóÐøÓû§É¸Ñ¡ÓÐЧÁ÷Á¿¡£

»Ø·Å·þÎñ£º¹¦ÄÜΪ½«Â¼ÖÆÁ÷Á¿½øÐл¹Ô­£¬È»ºó¶ÔÈë¿Úµ÷ÓÃ×öÒ»´ÎÁ÷Á¿µÄ·¢Æð,ʹµÃ CPR Replay¡£

¶Ô±È·þÎñ£º¶Ô½ÓÊÕµ½µÄ»Ø·ÅÊý¾ÝÓëÂ¼ÖÆÊý¾Ý½øÐвîÒì±È¶Ô¡£

4.3 CPR ´¦ÀíÁ÷³Ì

ÈçÉÏͼËùʾ£¬Í¨¹ýÕâÁ½´ó×é¼þµÄЭͬ¹¤×÷½«Îȶ¨´úÂëµÄÁ÷Á¿×Ô¶¯²¶»ñ²¢³Ö¾Ã»¯´æ´¢£¬È»ºóÓɲâÊÔÈËÔ±·ÖÎöÁ÷Á¿ÊÕ²ØÎªÓÐЧÓÃÀý£¬¶ÔÓÚºóÐø´ýÕýʽ·¢²¼µÄ´úÂ룬¿ÉÒÔÓÃÓÐЧÓÃÀýÀ´½øÐлطźͲîÒì±È¶Ô£¬¸ù¾Ý²îÒì±È¶Ô½á¹û·¢ÏÖ´ý²âϵͳ´æÔÚµÄÎÊÌâ¡£

¸ÃϵͳÔÚ´¦Àí±È¶ÔʱÓÐÁ½¸öÓëÆäËû·½°¸½Ï´ó²»Í¬µÄÌØÐÔ£º

1£©¶Ô×Óµ÷Óà MOCK ´¦Àí£º±¾·½°¸²ÉÓõÄÊǼǼÏÂԭʼ×Óµ÷ÓÃÄÚÈݼ°×Óµ÷Ó÷µ»ØÄÚÈÝ£»ÔÚϵͳÄÚ²¿Íê³É¶Ô×Óµ÷Ó÷µ»ØµÄ´¦Àí£¬²»ÔÙÐèҪʵ¼ÊµÄ×Óϵͳ»ò mock ϵͳ½øÐвâÊÔÖ§³Å¡£ÒԴ˼õСÁË»·¾³¡¢Êý¾Ý²âÊÔ´¦ÀíµÄÄѶȺÍ׼ȷÐÔ¡£

2£©×Óµ÷ÓñȶÔÊý¾ÝµÄ´¦Àí£º±¾·½°¸²ÉÓõÄÊDZȶÔ×Óµ÷ÓÃÇëÇó¡£ÀýÈçÒ»¸ö DB ²Ù×÷£¬ÈôÇëÇóÄÚÈÝÊÇÎÞÎóµÄ£¬ÔòÈ϶¨ÇëÇóÕý³££»²»ÔÙÈ¥±È¶Ô¾ßÌåµÄÊý¾Ý¿â´æ´¢Öµ¡£ÕâÑùµÄ´¦Àí·½Ê½Í¬Ñù¼ò»¯Á˲âÊÔ»·¾³´î½¨¡¢²âÊÔÊý¾Ý×¼±¸£¬Í¬Ê±»¹½â¾öÁ˲âÊÔ»·¾³ÖÐÊý¾Ý¹²Ïí±ä¸ü¿ÉÄÜ´øÀ´µÄÊý¾Ý²îÒìÎÊÌâ¡£

4.4 Á÷Á¿¸´ÖÆÊµÏÖ

ÔÚÕû¸öÂ¼ÖÆ¹ý³ÌÖУ¬CPR ½øÐÐÂ¼ÖÆµÄ´¦ÀíÁ÷³ÌÖ÷ÒªÊÇÔÚ DefaultEventListener ÀàÖÐʵÏÖ¡£

1£©DefaultEventListener Àà

DefaultEventListener ÊÇÓÃÀ´´¦Àí´¥·¢Ê¼þµÄÀà¡£²»Í¬µÄ²å¼þ (soa,mysql,http,redis µÈ) ¿ÉÒÔ×Ô¶¨Òå×Ô¼ºµÄ EventListener À´½øÐи÷×ÔÌØÊâµÄʼþ´¦Àí¡£Ä¿Ç°²å¼þĬÈÏʹÓà DefaultEventListener¡£

ÔÚ DefaultEventListener ÖУ¬³Ð½ÓµÄÊÇËùÓÐʼþµÄ´¦Àí£¬Ò²¾ÍÊÇËµÂ¼ÖÆ/»Ø·Å²Ù×÷¶¼ÊǼ¯ÖÐÔÚÕâ¸öÀàÖÐʵÏֵģ¬Ö»ÊǸù¾Ý²»Í¬µÄÌõ¼þÀ´Çø·ÖÊÇÂ¼ÖÆÁ÷Á¿»¹ÊǻطÅÁ÷Á¿£¬´Ó¶øÅжϸÃÖ´ÐÐÂ¼ÖÆ»¹ÊǸÃÖ´Ðлطš£

µ±Ê¼þµÚÒ»´Î¹ýÂËʱ£¬»á½øÐÐÒ»´Î³õʼ»¯¸ú×ÙÆ÷¡£

ÆäÖÐ traceId ʵ¼ÊÉÏÊÇÕâ¸ö¸ú×ÙÆ÷µÄ¶ÀÁ¢±êʶ¡£ËùÒÔÎÞÂÛÊÇÂ¼ÖÆºÍ»Ø·Å¶¼»áÓÐÆä¶ÀÁ¢µÄ traceId¡£

2£©Before ʼþ´¦Àí

¶ÔÓ¦µÄ·½·¨ÊÇ DefaultEventListener.doBefore¡£

¸ù¾Ý traceID Åжϵ±Ç°Á÷Á¿ÊÇ·ñΪ»Ø·ÅÁ÷Á¿£¬ÈôΪ»Ø·ÅÁ÷Á¿Ôòµ÷Óà processor.doMock ·½·¨Ö´ÐÐ Mock£¬Ö´ÐÐÍê³ÉºóÖ±½Ó·µ»Ø£¬²»ÔÙÖ´ÐкóÐø²Ù×÷¡£

Èôµ±Ç°Á÷Á¿ÎªÂ¼ÖÆÁ÷Á¿£¬Ôò»ùÓÚµ±Ç°»ñÈ¡µ½µÄÐÅÏ¢³õʼ»¯ Invocation ʵÀý£¬ÆäÖлáµ÷Óòå¼þÖÐ processor#assembleIdentity¡¢processor#assembleRequest¡¢processor#assembleResponse¡¢processor#assembleThrowable Ëĸö·½·¨£¬·Ö±ð´¦Àíµ÷Óñêʶ¡¢ÇëÇó²ÎÊý¡¢·µ»Ø½á¹û¡¢Å׳öÒì³£¡£×îºó½«µ±Ç°Ê¼þµÄ Invocation ÐÅÏ¢´æ·Åµ½Â¼ÖÆ»º´æÖС£

3£©Return ʼþ´¦Àí/ Throw ʼþ´¦Àí

Return/ Throw ʼþµÄ´¦ÀíÂß¼­»ù±¾Ò»Ö¡£

Åжϵ±Ç°Á÷Á¿ÊÇ·ñΪ»Ø·ÅÁ÷Á¿£¬ÈôΪ»Ø·ÅÁ÷Á¿ÔòÖ±½Ó·µ»Ø£¬²»Ö´ÐкóÐø²Ù×÷¡£

ÈôÂ¼ÖÆÁ÷Á¿Ôò´ÓÂ¼ÖÆ»º´æÖлñÈ¡¶ÔÓ¦µÄ Invocation ʵÀý£¬µ÷Óòå¼þµ÷Óô¦ÀíÆ÷µÄ assembleResponse/assembleThrowable ·½·¨£¬²¢½« reponst/throwable ½á¹ûÉèÖõ½ Invocation ʵÀýÖС£

»Øµ÷µ÷ÓüàÌýÆ÷ InvocationListener#onInvocation ·½·¨£¬ÅÐ¶Ï Invocation ÊÇÈë¿Úµ÷Óû¹ÊÇ×Óµ÷Óã¬Èç¹ûÊÇ×Óµ÷ÓÃÔò±£´æµ½Â¼ÖÆ»º´æÖУ¬Èç¹û²»ÊÇÔòµ÷ÓÃÏûϢͶµÝÆ÷µÄ broadcastRecord ·½·¨½«Â¼ÖƼǼÐòÁл¯ºóÉÏ´«¸ø cpr-console¡£

4.5 Á÷Á¿»Ø·ÅʵÏÖ

»Ø·ÅÁ÷³Ì£¬ÊÇÓɲâÊÔÈËԱѡÔñÓÐЧÓÃÀý£¬ÔÚ´ý²âϵͳÖÐÖ´Ðлطš£

»Ø·Å·þÎñ½ÓÊܵ½»Ø·Å¼Ç¼£¬¶Ô¼Ç¼½øÐз´ÐòÁл¯£¬»¹Ô­µ½Ô­À´Â¼ÖƵĶÔÏ󣬱£Ö¤ classloader ÓëÂ¼ÖÆÊ±ºòÒ»Ö¡£CPR ÔÚÖ´ÐлطÅÈÎÎñµÄ¹ý³ÌÖУ¬Ê×ÏÈ»á¸ù¾ÝÂ¼ÖÆ¼Ç¼µÄÐÅÏ¢£¬¹¹ÔìÏàͬµÄÇëÇ󣬶Ա»¹ÒÔØµÄÈÎÎñ½øÐÐÇëÇ󣬲¢¸ú×ٻطÅÇëÇóµÄ´¦ÀíÁ÷³Ì£¬ÒÔ±ã¼Ç¼»Ø·Å½á¹ûÒÔ¼°Ö´ÐÐ mock ¶¯×÷¡£Õû¸ö»Ø·Å¹ý³Ì±È½Ï¸´ÔÓ£¬Ö÷Òª°üÀ¨ÒÔϼ¸¸ö¸öÁ÷³Ì£º

1£©»Ø·ÅÇëÇóµÄ´¦Àí

ÕâÀïÒÔ http »Ø·ÅÈë¿ÚΪÀý£¬RepeaterModule#repeat ·½·¨ÊǻطÅÇëÇó×î³õ´¦ÀíÈë¿Ú¡£Ìí¼Ó @Command ×¢½â£¬Ê¹µÃÍⲿ¿ÉÒÔʹÓà http ЭÒ鷽ʽµ÷ÓÃÈë¿Ú¡£

¸Ã·½·¨ÔÚ½ÓÊÕÍⲿµÄ»Ø·ÅÇëÇóºó£¬¶ÔÇëÇó²ÎÊý½øÐÐУÑ飬УÑéͨ¹ýºó»á½«²ÎÊýʵÀý»¯£¬ÐγÉÒ»¸ö»Ø·Åʼþ RepeatEvent£¬·¢²¼µ½ EventBusInner Öб» RepeatSubscribeSupporter#onSubscribe ·½·¨½øÐд¦Àí¡£

´¦Àí¹ý³ÌΪÊ×ÏȻὫ RepeatEvent µÄ²ÎÊý½øÐз´ÐòÁл¯£¬»ñÈ¡»Ø·ÅÏà¹ØµÄÂ¼ÖÆ¼Ç¼µÄÐÅÏ¢£¬È»ºóͨ¹ýÕâЩÐÅÏ¢´Ó prepeater-console À­È¡¶ÔÓ¦µÄÂ¼ÖÆ¼Ç¼ÏêÇ飨RecordModel£©£¬×îºóÓÃĬÈÏÁ÷Á¿·Ö·¢Æ÷ DefaultFlowDispatcher ½øÐзַ¢¡£

2£©»Ø·ÅÈÎÎñµÄ·Ö·¢

»Ø·ÅÈÎÎñµÄ·Ö·¢ÓÉ DefaultFlowDispatcher#dispatch ·½·¨ÊµÏÖ¡£

Ö÷ÒªÊÇÕë¶Ô»Ø·ÅÈÎÎñµÄÐÅÏ¢½øÐÐУÑ飬УÑéʧ°Ü»áÅ׳ö´íÎóµ½Éϲ㡣ͨ¹ýУÑéµÄ»Ø·ÅÈÎÎñ£¬Ôò»á³õʼ»¯»Ø·ÅÉÏÏÂÎÄÐÅÏ¢£¬²¢´æ·Åµ½»Ø·Å»º´æÖС£¸ù¾Ý»Ø·ÅÈÎÎñµÄÈë¿Ú²å¼þÀàÐÍ£¬»ñÈ¡¶ÔÓ¦²å¼þµÄ repeater ½øÐлطŴ¦Àí¡£

3£©»Ø·Å½á¹ûÖ´ÐÐÓë¼Ç¼

»Ø·ÅÈÎÎñÖ´ÐС¢»Ø·Å½á¹û¼Ç¼µÄʵÏÖÂß¼­ÔÚ AbstractRepeater#repeat ÖÐʵÏÖ¡£

ͨ¹ý executeRepeat ·½·¨½»Óɸ÷¸ö²å¼þµÄ»Ø·ÅÆ÷ʵÀýÀ´µ÷Óᣵ±²å¼þ¿ªÊ¼Ö´ÐлطÅÈÎÎñʱ£¬»á¸ù¾Ý»Ø·ÅÉÏÏÂÎÄÒÔ¼°µ±Ç° repeater µÄÓ¦ÓÃÐÅÏ¢³õʼ»¯»Ø·Å½á¹û¼Ç¼ RepeaterModel µÄʵÀý¡£

³õʼ»¯»Ø·Å½á¹û¼Ç¼ºó£¬³õʼ»¯»Ø·ÅÏ̸߳ú×Ù²¢´¥·¢»Ø·ÅÇëÇó²¢»ñÈ¡»Ø·ÅÇëÇ󷵻صĽá¹û¡£

»ñÈ¡»Ø·ÅÇëÇ󷵻صĽá¹ûºó£¬Í£Ö¹Ï̸߳ú×Ù£¬½«»Ø·Å½á¹ûÒÔ¼°µ±Ç°µÄһЩ״̬ÐÅÏ¢±£´æµ½»Ø·Å½á¹û¼Ç¼µÄʵÀýÖС£

×îºóͨ¹ýµ÷ÓÃÏûϢͶµÝÆ÷µÄ AbstractBroadcaster#broadcastRepeat ·½·¨½«»Ø·Å½á¹û¼Ç¼ÐòÁл¯ºóÉÏ´«µ½ crp-console ±£´æ¡£

4£©»Ø·Å¹ý³ÌÖÐµÄ Mock ´¦Àí

ÔڻطŹý³ÌÖУ¬Ö±½ÓÔÚ DefaultEventListner#Before ʼþ´¦ÀíÖÐÖ´ÐС£

processor#doMock ·½·¨£¬½»¸ø²å¼þµ÷Óô¦ÀíÆ÷Ö´ÐÐ mock£¬²¢ÇÒÖ»¶Ô×Óµ÷ÓÃʼþÖ´ÐÐ mock¡£


public void doMock (BeforeEvent event, Boolean entrance, InvokeType type) throws ProcessControlException {
/*
* »ñÈ¡»Ø·ÅÉÏÏÂÎÄ
*/
RepeatContext context = RepeatCache.getRepeatContext(Tracer.getTraceId());
/*
* mockÖ´ÐÐÌõ¼þ
*/
if (!skipMock(event, entrance, context) && context != null && context.getMeta().isMock()) {
try {
/*
* ¹¹½¨mockÇëÇó
*/
final MockRequest request = MockRequest.builder()
.argumentArray(this.assembleRequest(event))
.event(event)
.identity(this.assembleIdentity(event))
.meta(context.getMeta())
.recordModel(context.getRecordModel())
.traceId(context.getTraceId())
.repeatId(context.getMeta().getRepeatId())
.index (SequenceGenerator.generate (context.getTraceId()))
.type(type)
.build();
/*
* Ö´ÐÐmock¶¯×÷
*/

final MockResponse mr = StrategyProvider.instance().provide (context.getMeta().getStrategyType()).execute(request);
/*
* ´¦Àí²ßÂÔÍÆ¼ö½á¹û
*/
switch (mr.action) {
case SKIP_IMMEDIATELY:
break;
case THROWS_IMMEDIATELY:
ProcessControlException .throwThrowsImmediately (mr.throwable);
break;
case RETURN_IMMEDIATELY:
// if (!type.equals(InvokeType.MYSQL) &&! type.equals(InvokeType.MYBATIS)){
ProcessControlException.throwReturnImmediately (assembleMockResponse(event, mr.invocation));
// }
break;
default:
ProcessControlException .throwThrowsImmediately (new RepeatException("invalid action"));
break;
}

} catch (ProcessControlException pce) {
throw pce;
} catch (Throwable throwable) {
ProcessControlException .throwThrowsImmediately (new RepeatException("unexpected code snippet here.", throwable));
}
}
}


AbstractInvocationProcessor#doMock ·½·¨µÄʵÏÖ£¬Óë AbstractRepeater#repeat ÏàËÆ£¬Êµ¼Êµ÷ÓÃʱÊÇͨ¹ý²å¼þÖи÷×﵀ Processor µÄʵÀý½øÐе÷Óõġ£

µ±¿ªÊ¼Ö´ÐлطŠmock ʱ£¬»áÏÈ»ñÈ¡»Ø·ÅÉÏÏÂÎĵÄÐÅÏ¢¡£¸ù¾Ý»Ø·ÅÉÏÏÂÎĵÄÐÅÏ¢£¬ÅжÏÊÇ·ñÌø¹ý mock µÄÖ´ÐС£µ±ÐèÒªÖ´ÐÐ mock ʱ£¬»á¸ù¾Ý»Ø·ÅÉÏÏÂÎÄÖеÄÐÅÏ¢³õʼ»¯ MockRequest ʵÀý£¬Í¨¹ý mock ²ßÂÔ¼ÆËã»ñÈ¡ MockResponse¡£

¸ù¾Ý MockResponse ·µ»Ø×´Ì¬½øÐв»Í¬µÄ²Ù×÷£º

µ± MockResponse Ö´Ðнá¹ûÊÇ·µ»ØÕý³£ÄÚÈÝʱ£¬¾Í»áÅ׳öÒ»¸öÖÕÖ¹µ±Ç°µ÷ÓòÙ×÷²¢·µ»Øµ±Ç°µÄ·µ»Ø½á¹û£¬Óà ProcessControlException Òì³£À´×èµ²ÐèÒª mock µÄ·½·¨µÄʵ¼Êµ÷Óá£

µ± MockResponse Ö´Ðнá¹ûÊÇ·µ»ØÒ»¸öÒ쳣ʱ£¬¾Í»áÅ׳öÒ»¸öÖÕÖ¹µ±Ç°µ÷ÓòÙ×÷²¢Å׳ö ProcessControlException Òì³££¬´ËʱÐèÒª mock µÄ·½·¨²»»á±»ÕæÊµµ÷Óá£

Ö»Óе± MockResponse ·µ»Ø×´Ì¬ÊÇ skip ʱ£¬Ôò²»¶ÔÕâ¸öµ÷ÓÃʼþ×öÈκδ¦Àí£¬µ÷ÓûáÕæÊµ·¢Éú£¬ÆäËûÈκÎ״̬¶¼»áͨ¹ýÅ׳ö ProcessControlException Òì³£À´×èµ²Õâ¸öʼþµÄʵ¼Êµ÷Óá£

4.6. ȱÏÝÅж¨¼òÎö

1£©¶ÔÓÚ¶Á²Ù×÷£¬ÎÒÃÇÖ÷Òª¹Ø×¢ÔÚÏàͬÇëÇóÏÂÕý³£ÏµÍ³ºÍ´ý²âϵͳµÄ·µ»Ø½á¹ûµÄ²îÒ죬¶Á½Ó¿ÚÒ²Ìᳫ¶ÔËùÓжÔÍâÇëÇó½øÐÐ mock£¬ÕâÑù»Ø·ÅʱÄܱ£³Öµ±Ê±µÄÒ»¸öÏÖ³¡»·¾³£¬±£Ö¤ÑéÖ¤µÄ׼ȷÐÔ¡£

2£©¶ÔÓÚд²Ù×÷£¬Ö»ÑéÖ¤½Ó¿Ú·µ»Ø½á¹ûÊDz»¹»µÄ£¬ÐèÒªÑéÖ¤Ëü¾ßÌåдÈëµÄÊý¾ÝÊÇ·ñÕýÈ·¡£ÀýÈç´´½¨Ö§¸¶¶©µ¥»áµ÷Óà PPI µÄд¶©µ¥ PPI.Bill.CreatePaymentBill ½Ó¿Ú£¬ÄÇôÎÒÃÇÐèÒªÑéÖ¤»Ø·Åʱµ÷Óà PPI µÄ²ÎÊýºÍÂ¼ÖÆÊ±µ÷Óà PPI µÄ²ÎÊýÊÇ·ñÒ»Ö¡£

3£©¶Ô±ÈĬÈÏÊÇÈ«¶ÔÏó×Ö¶ÎÖðÒ»¶Ô±È¡£ÓÉÓÚÂ¼ÖÆ»·¾³ºÍ»Ø·Å»·¾³Ëù´¦»·¾³²»Í¬£¬ÓÐһЩ±ØÈ»²»Ò»ÖµÄÐÅÏ¢£¬ÀýÈçËæ»úÊý¡¢Ê±¼ä£¬ÒÔ¼°ÏµÍ³ ip µÈµÈ£¬ÕâЩÄÚÈÝϵͳ×öÁËĬÈϲ»±È¶Ô´¦Àí¡£ÏµÍ³¶ÔÓÚ×Óµ÷ÓÃÊÇĬÈ϶ԱÈËùÓÐ×Óµ÷Óã¬Ò²¿ÉÒÔͨ¹ýƽ̨ÅäÖÃÅųýһЩ²»¹ØÐĵÄ×Óµ÷ÓõĶԱȡ£

4.7 Êý¾Ý°²È«±£»¤

ÏµÍ³Â¼ÖÆÓë»Ø·Å¹ý³ÌÖлùÓÚ¶ÔͨѶ¡¢Êý¾ÝµÄ°²È«±£»¤ÒªÇó£¬ÏµÍ³ÊµÏÖÁ˶Թ«Ë¾Éñ¶Ü°²È«ÏµÍ³µÄ½ÓÈ룬ʹµÃ´«Êä¹ý³Ì¡¢Â䵨Êý¾Ý¼°ÈÕÖ¾µÈÉæ¼°°²È«ÒªÇóµÄÊý¾ÝÄÚÈݶ¼·ûºÏÁËÐÅÏ¢°²È«ÒªÇó¡£Ò²È·±£ÁËʹÓÃÕß²»»á½Ó´¥µ½Ãô¸ÐÊý¾ÝµÈÏÞÖÆÐÔÄÚÈÝ¡£

Î塢С½á

ÔÚϵͳ³ÉÊìµÄǰÌáÏ£¬¿ÉÒÔÀ©Õ¹±¾Æ½Ì¨½øÐÐÉú²úÊý¾ÝµÄ²É¼¯±È¶Ô¡£µ±ÕâÒ»²½ÊµÏֺ󣬿ÉÒÔÏë¼û»Ø¹é½«ÕæÕý²»ÔÙÊÇÒ»¼þÄÑÊ£¬ÓÈÆäÊÇÉú²ú»Ø¹éÐèÒªÃæ¶ÔµÄÊý¾ÝÎÛȾµÈÎÊÌâ¶¼½«²»ÔÙÊÇÎÊÌ⡣ͬʱ¸Ãƽ̨»¹¿ÉÑÝ»¯Îª MOCK ƽ̨£¬ÕâÑùµÄ MOCK ½«²»ÔÙÒÀÀµÈκÎϵͳ£¬Ö»ÐèÔÚ´ý²âÓ¦ÓõķþÎñÆ÷ÉÏÔö¼ÓÒ»¸ö Agent ¼´¿ÉÍê³É¡£

 

 
   
4133 ´Îä¯ÀÀ       28
Ïà¹ØÎÄÕÂ

΢·þÎñ²âÊÔÖ®µ¥Ôª²âÊÔ
һƪͼÎÄ´øÄãÁ˽â°×ºÐ²âÊÔÓÃÀýÉè¼Æ·½·¨
È«ÃæµÄÖÊÁ¿±£ÕÏÌåϵ֮»Ø¹é²âÊÔ²ßÂÔ
È˹¤ÖÇÄÜ×Ô¶¯»¯²âÊÔ̽Ë÷
Ïà¹ØÎĵµ

×Ô¶¯»¯½Ó¿Ú²âÊÔʵ¼ù֮·
jenkins³ÖÐø¼¯³É²âÊÔ
ÐÔÄܲâÊÔÕï¶Ï·ÖÎöÓëÓÅ»¯
ÐÔÄܲâÊÔʵÀý
Ïà¹Ø¿Î³Ì

³ÖÐø¼¯³É²âÊÔ×î¼Ñʵ¼ù
×Ô¶¯»¯²âÊÔÌåϵ½¨ÉèÓë×î¼Ñʵ¼ù
²âÊԼܹ¹µÄ¹¹½¨ÓëÓ¦ÓÃʵ¼ù
DevOpsʱ´úµÄ²âÊÔ¼¼ÊõÓë×î¼Ñʵ¼ù
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
´óÊý¾Ýƽ̨²âÊÔ
΢·þÎñ¼Ü¹¹ÏµIJâÊÔÖ®µÀ
´ÓÁã¿ªÊ¼ÕÆÎÕ΢·þÎñÈí¼þ²âÊÔ
ÈçºÎ½øÐвâÊÔÐèÇó·ÖÎö£º´Ó½ÓÊÕÐèÇóµ½ÓÃÀýÉè¼Æ
python_selenium×Ô¶¯»¯²âÊÔ¿ò¼Ü
×îпγÌ
²âÊÔÐèÇó·ÖÎöÓë²âÊÔÓÃÀýÉè¼Æ
ÐÔÄܲâÊÔ·½·¨Óë¼¼Êõ
×Ô¶¯»¯²âÊÔ¿ò¼ÜÉè¼Æ¸ß¼¶Êµ¼ù
½Ó¿Ú×Ô¶¯»¯²âÊÔ·½·¨Ó빤¾ß
Èí¼þ²âÊÔ·½·¨Óëʵ¼ù(¹á´©°¸Àý)
³É¹¦°¸Àý
ij֧¸¶ÆóÒµ µ¥Ôª²âÊÔÓëÖØ¹¹Åàѵ
±±¾© Óû§ÌåÑé¡¢¿ÉÓÃÐÔ²âÊÔÓëÆÀ¹À
ij¾ü¹¤Ñо¿µ¥Î» ×Ô¶¯»¯²âÊÔ·½·¨¡¢°¸ÀýÓ빤¾ß
ÖªÃûÏû·Ñ½ðÈÚ¹«Ë¾ ̽Ë÷ÐÔ²âÊÔÓë²âÊÔ·ÖÎö
±±¾© º½Ìì¿Æ¹¤Ä³×Ó¹«Ë¾ Èí¼þ²âÊԼܹ¹Ê¦