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

1Ôª 10Ôª 50Ôª





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



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Spring Cloud ÈëÃÅ×ܽá
 
×÷ÕߣºFrancisQ
  1675  次浏览      28
 2021-4-12 
   
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜÁË Ê²Ã´ÊÇSpring cloud¡¢Spring Cloud µÄ°æ±¾¡¢Spring Cloud µÄ·þÎñ·¢ÏÖ¿ò¼Ü¡ª¡ªEureka¡¢¸ºÔؾùºâÖ® Ribbon¡¢Ê²Ã´ÊÇ Open Feign¡¢±Ø²»¿ÉÉÙµÄ Hystrix¡¢Î¢·þÎñÍø¹Ø¡ª¡ªZuul¡¢Spring CloudÅäÖùÜÀí¡ª¡ªConfig¡¢Òý³ö Spring Cloud BusµÈÏà¹ØÄÚÈÝ¡£

±¾ÎÄÀ´×ÔÓÚ¾ò½ð£¬ÓÉ»ðÁú¹ûÈí¼þAnna±à¼­¡¢ÍƼö¡£

Ê×ÏÈÎÒ¸ø´ó¼Ò¿´Ò»ÕÅͼ£¬Èç¹û´ó¼Ò¶ÔÕâÕÅͼÓÐЩµØ·½²»Ì«Àí½âµÄ»°£¬ÎÒÏ£ÍûÄãÃÇ¿´ÍêÎÒÕâÆªÎÄÕ»á»ÐÈ»´óÎò¡£

×ÜÌå¼Ü¹¹

ʲôÊÇSpring cloud

¹¹½¨·Ö²¼Ê½ÏµÍ³²»ÐèÒª¸´ÔÓºÍÈÝÒ׳ö´í¡£Spring Cloud Ϊ×î³£¼ûµÄ·Ö²¼Ê½ÏµÍ³Ä£Ê½ÌṩÁËÒ»ÖÖ¼òµ¥ÇÒÒ×ÓÚ½ÓÊܵıà³ÌÄ£ÐÍ£¬°ïÖú¿ª·¢ÈËÔ±¹¹½¨Óе¯ÐԵġ¢¿É¿¿µÄ¡¢Ð­µ÷µÄÓ¦ÓóÌÐò¡£Spring Cloud ¹¹½¨ÓÚ Spring Boot Ö®ÉÏ£¬Ê¹µÃ¿ª·¢ÕߺÜÈÝÒ×ÈëÊÖ²¢¿ìËÙÓ¦ÓÃÓÚÉú²úÖС£

¹Ù·½¹ûÈ»¹Ù·½£¬½éÉܶ¼ÕâôÓаåÓÐÑ۵ġ£

ÎÒËùÀí½âµÄ Spring Cloud ¾ÍÊÇ΢·þÎñϵͳ¼Ü¹¹µÄһվʽ½â¾ö·½°¸£¬ÔÚÆ½Ê±ÎÒÃǹ¹½¨Î¢·þÎñµÄ¹ý³ÌÖÐÐèÒª×öÈç ·þÎñ·¢ÏÖ×¢²á ¡¢ÅäÖÃÖÐÐÄ ¡¢ÏûÏ¢×ÜÏß ¡¢¸ºÔؾùºâ ¡¢¶Ï·Æ÷ ¡¢Êý¾Ý¼à¿Ø µÈ²Ù×÷£¬¶ø Spring Cloud ΪÎÒÃÇÌṩÁËÒ»Ì×¼òÒ׵ıà³ÌÄ£ÐÍ£¬Ê¹ÎÒÃÇÄÜÔÚ Spring Boot µÄ»ù´¡ÉÏÇáËɵØÊµÏÖ΢·þÎñÏîÄ¿µÄ¹¹½¨¡£

Spring Cloud µÄ°æ±¾

µ±È»Õâ¸öÖ»ÊǸöÌâÍâ»°¡£

Spring Cloud µÄ°æ±¾ºÅ²¢²»ÊÇÎÒÃÇͨ³£¼ûµÄÊý×Ö°æ±¾ºÅ£¬¶øÊÇһЩºÜÆæ¹ÖµÄµ¥´Ê¡£ÕâЩµ¥´Ê¾ùΪӢ¹úÂ׶صØÌúÕ¾µÄÕ¾Ãû¡£Í¬Ê±¸ù¾Ý×Öĸ±íµÄ˳ÐòÀ´¶ÔÓ¦°æ±¾Ê±¼ä˳Ðò£¬±ÈÈ磺×îÔç µÄ Release °æ±¾ Angel£¬µÚ¶þ¸ö Release °æ±¾ Brixton£¨Ó¢¹úµØÃû£©£¬È»ºóÊÇ Camden¡¢ Dalston¡¢Edgware¡¢Finchley¡¢Greenwich¡¢Hoxton¡£

Spring Cloud µÄ·þÎñ·¢ÏÖ¿ò¼Ü¡ª¡ªEureka

EurekaÊÇ»ùÓÚREST£¨´ú±íÐÔ×´Ì¬×ªÒÆ£©µÄ·þÎñ£¬Ö÷ÒªÔÚAWSÔÆÖÐÓÃÓÚ¶¨Î»·þÎñ£¬ÒÔʵÏÖ¸ºÔؾùºâºÍÖмä²ã·þÎñÆ÷µÄ¹ÊÕÏ×ªÒÆ¡£ÎÒÃdzƴ˷þÎñΪEureka·þÎñÆ÷¡£Eureka»¹´øÓÐÒ»¸ö»ùÓÚJavaµÄ¿Í»§¶Ë×é¼þEureka Client£¬ËüʹÓë·þÎñµÄ½»»¥±äµÃ¸ü¼ÓÈÝÒס£¿Í»§¶Ë»¹¾ßÓÐÒ»¸öÄÚÖõĸºÔØÆ½ºâÆ÷£¬¿ÉÒÔÖ´Ðлù±¾µÄÑ­»·¸ºÔØÆ½ºâ¡£ÔÚNetflix£¬¸ü¸´ÔӵĸºÔؾùºâÆ÷½«Eureka°ü×°ÆðÀ´£¬ÒÔ»ùÓÚÁ÷Á¿£¬×ÊԴʹÓ㬴íÎóÌõ¼þµÈ¶àÖÖÒòËØÌṩ¼ÓȨ¸ºÔؾùºâ£¬ÒÔÌṩ³öÉ«µÄµ¯ÐÔ¡£

×ܵÄÀ´Ëµ£¬Eureka ¾ÍÊÇÒ»¸ö·þÎñ·¢ÏÖ¿ò¼Ü¡£ºÎΪ·þÎñ£¬ºÎÓÖΪ·¢ÏÖÄØ£¿

¾ÙÒ»¸öÉú»îÖеÄÀý×Ó£¬¾Í±ÈÈçÎÒÃÇÆ½Ê±×â·¿×ÓÕÒÖнéµÄÊÂÇé¡£

ÔÚûÓÐÖнéµÄʱºòÎÒÃÇÐèÒªÒ»¸öÒ»¸öȥѰÕÒÊÇ·ñÓз¿ÎÝÒª³ö×âµÄ·¿¶«£¬ÕâÏÔÈ»»á·Ç³£µÄ·ÑÁ¦£¬Ò»ÄãÕÒÆ¾Ò»¸öÈ˵ÄÄÜÁ¦ÊÇÕÒ²»µ½ºÜ¶à·¿Ô´¹©ÄãÑ¡Ôñ£¬ÔÙÕßÄãÒ²ÀÁµÃÕâôÕÒÏÂÈ¥(ÕÒÁËÕâô¾Ã£¬Ã»ÓкÏÊʵÄÖ»Äܽ«¾Í)¡£ÕâÀïµÄÎÒÃǾÍÏ൱ÓÚ΢·þÎñÖÐµÄ Consumer £¬¶øÄÇЩ·¿¶«¾ÍÏ൱ÓÚ΢·þÎñÖÐµÄ Provider ¡£Ïû·ÑÕß Consumer ÐèÒªµ÷ÓÃÌṩÕß Provider ÌṩµÄһЩ·þÎñ£¬¾ÍÏñÎÒÃÇÏÖÔÚÐèÒª×âËûÃǵķ¿×ÓÒ»Ñù¡£

µ«ÊÇÈç¹ûÖ»ÊÇ×â¿ÍºÍ·¿¶«Ö®¼ä½øÐÐѰÕҵϰ£¬ËûÃǵÄЧÂÊÊǺܵ͵쬷¿¶«ÕÒ²»µ½×â¿Í׬²»µ½Ç®£¬×â¿ÍÕÒ²»µ½·¿¶«×¡²»ÁË·¿¡£ËùÒÔ£¬ºóÀ´·¿¶«¿Ï¶¨¾ÍÏëµ½Á˹㲥×Ô¼ºµÄ·¿Ô´ÐÅÏ¢(±ÈÈçÔÚ½Ö±ßÌùÌùС¹ã¸æ)£¬ÕâÑù¶ÔÓÚ·¿¶«À´ËµÒѾ­Íê³ÉËûµÄÈÎÎñ(½«·¿Ô´¹«²¼³öÈ¥)£¬µ«ÊÇÓÐÁ½¸öÎÊÌâ¾Í³öÏÖÁË¡£µÚÒ»¡¢ÆäËû²»ÊÇ×â¿ÍµÄ¶¼ÄÜÊÕµ½ÕâÖÖ×â·¿ÏûÏ¢£¬ÕâÔÚÏÖʵÊÀ½çûʲô£¬µ«ÊÇÔÚ¼ÆËã»úµÄÊÀ½çÖоͻá³öÏÖ×ÊÔ´ÏûºÄµÄÎÊÌâÁË¡£µÚ¶þ¡¢×â¿ÍÕâÑù»¹ÊǺÜÄÑÕÒµ½Ä㣬ÊÔÏëÒ»ÏÂÎÒÐèÒª×â·¿£¬ÎÒ»¹ÐèÒª¶«Ò»¸öÎ÷Ò»¸öµØÈ¥ÕÒ½Ö±ßС¹ã¸æ£¬Âé²»Âé·³£¿

ÄÇÔõô°ìÄØ£¿ÎÒÃǵ±È»²»»áÄÇôɵºõºõµÄ£¬µÚһʱ¼ä¾ÍÊÇÈ¥ÕÒ Öнé ѽ£¬ËüΪÎÒÃÇÌṩÁËͳһ·¿Ô´µÄµØ·½£¬ÎÒÃÇÏû·ÑÕßÖ»ÐèÒªÅܵ½ËüÄÇÀïÈ¥ÕÒ¾ÍÐÐÁË¡£¶ø¶ÔÓÚ·¿¶«À´Ëµ£¬ËûÃÇÒ²Ö»ÐèÒª°Ñ·¿Ô´ÔÚÖнéÄÇÀï·¢²¼¾ÍÐÐÁË¡£

ÄÇôÏÖÔÚ£¬ÎÒÃǵÄģʽ¾ÍÊÇÕâÑùµÄÁË¡£

µ«ÊÇ£¬Õâ¸öʱºò»¹»á³öÏÖһЩÎÊÌâ¡£

·¿¶«×¢²áÖ®ºóÈç¹û²»ÏëÂô·¿×ÓÁËÔõô°ì£¿ÎÒÃÇÊDz»ÊÇÐèÒªÈ÷¿¶«¶¨ÆÚÐøÔ¼£¿Èç¹û·¿¶«²»½øÐÐÐøÔ¼ÊDz»ÊÇÒª½«ËûÃÇ´ÓÖнéÄÇÀïµÄ×¢²áÁбíÖÐÒÆ³ý¡£

×â¿ÍÊDz»ÊÇÒ²Òª½øÐÐ×¢²áÄØ£¿²»È»ºÏͬÒÒ·½ÔõôÀ´ÄØ£¿

Öнé¿É²»¿ÉÒÔ×öÁ¬ËøµêÄØ£¿Èç¹ûÕâÒ»¸öµêÒòΪijЩ²»¿É¿¹Á¦ÒòËØ¶øÎÞ·¨Ê¹Óã¬ÄÇôÎÒÃÇÊÇ·ñ¿ÉÒÔ»»Ò»¸öÁ¬ËøµêÄØ£¿

Õë¶ÔÉÏÃæµÄÎÊÌâÎÒÃÇÀ´ÖØÐ¹¹½¨Ò»ÏÂÉÏÃæµÄģʽͼ

ºÃÁË£¬¾ÙÍêÕâ¸ö ÎÒÃǾͿÉÒÔÀ´¿´¹ØÓÚ Eureka µÄһЩ»ù´¡¸ÅÄîÁË£¬Äã»á·¢ÏÖÕâ¶«Î÷Àí½âÆðÀ´ÔõôÕâô¼òµ¥¡£

·þÎñ·¢ÏÖ£ºÆäʵ¾ÍÊÇÒ»¸ö¡°Öн顱£¬Õû¸ö¹ý³ÌÖÐÓÐÈý¸ö½ÇÉ«£º·þÎñÌṩÕß(³ö×â·¿×ÓµÄ)¡¢·þÎñÏû·ÑÕß(×â¿Í)¡¢·þÎñÖнé(·¿ÎÝÖнé)¡£

·þÎñÌṩÕߣº ¾ÍÊÇÌṩһЩ×Ô¼ºÄܹ»Ö´ÐеÄһЩ·þÎñ¸øÍâ½ç¡£

·þÎñÏû·ÑÕߣº ¾ÍÊÇÐèҪʹÓÃһЩ·þÎñµÄ¡°Óû§¡±¡£

·þÎñÖн飺 Æäʵ¾ÍÊÇ·þÎñÌṩÕߺͷþÎñÏû·ÑÕßÖ®¼äµÄ¡°ÇÅÁº¡±£¬·þÎñÌṩÕß¿ÉÒÔ°Ñ×Ô¼º×¢²áµ½·þÎñÖнéÄÇÀ¶ø·þÎñÏû·ÑÕßÈçÐèÒªÏû·ÑһЩ·þÎñ(ʹÓÃһЩ¹¦ÄÜ)¾Í¿ÉÒÔÔÚ·þÎñÖнéÖÐѰÕÒ×¢²áÔÚ·þÎñÖнéµÄ·þÎñÌṩÕß¡£

·þÎñ×¢²á Register£º

¹Ù·½½âÊÍ£ºµ± Eureka ¿Í»§¶ËÏò Eureka Server ×¢²áʱ£¬ËüÌṩ×ÔÉíµÄÔªÊý¾Ý£¬±ÈÈçIPµØÖ·¡¢¶Ë¿Ú£¬ÔËÐÐ×´¿öָʾ·ûURL£¬Ö÷Ò³µÈ¡£

½áºÏÖнéÀí½â£º·¿¶« (ÌṩÕß Eureka Client Provider)ÔÚÖнé (·þÎñÆ÷ Eureka Server) ÄÇÀïµÇ¼Ç·¿ÎݵÄÐÅÏ¢£¬±ÈÈçÃæ»ý£¬¼Û¸ñ£¬µØ¶ÎµÈµÈ(ÔªÊý¾Ý metaData)¡£

·þÎñÐøÔ¼ Renew£º

¹Ù·½½âÊÍ£ºEureka ¿Í»§»áÿ¸ô30Ãë(ĬÈÏÇé¿öÏÂ)·¢ËÍÒ»´ÎÐÄÌøÀ´ÐøÔ¼¡£ ͨ¹ýÐøÔ¼À´¸æÖª Eureka Server ¸Ã Eureka ¿Í»§ÈÔÈ»´æÔÚ£¬Ã»ÓгöÏÖÎÊÌâ¡£ Õý³£Çé¿öÏ£¬Èç¹û Eureka ServerÔÚ90ÃëûÓÐÊÕµ½ Eureka ¿Í»§µÄÐøÔ¼£¬Ëü»á½«ÊµÀý´ÓÆä×¢²á±íÖÐɾ³ý¡£

½áºÏÖнéÀí½â£º·¿¶« (ÌṩÕß Eureka Client Provider) ¶¨ÆÚ¸æËßÖнé (·þÎñÆ÷ Eureka Server) Îҵķ¿×Ó»¹×â(ÐøÔ¼) £¬Öнé (·þÎñÆ÷Eureka Server) ÊÕµ½Ö®ºó¼ÌÐø±£Áô·¿ÎݵÄÐÅÏ¢¡£

»ñȡע²áÁбíÐÅÏ¢ Fetch Registries£º

¹Ù·½½âÊÍ£ºEureka ¿Í»§¶Ë´Ó·þÎñÆ÷»ñȡע²á±íÐÅÏ¢£¬²¢½«Æä»º´æÔÚ±¾µØ¡£¿Í»§¶Ë»áʹÓøÃÐÅÏ¢²éÕÒÆäËû·þÎñ£¬´Ó¶ø½øÐÐÔ¶³Ìµ÷Ó᣸Ã×¢²áÁбíÐÅÏ¢¶¨ÆÚ£¨Ã¿30ÃëÖÓ£©¸üÐÂÒ»´Î¡£Ã¿´Î·µ»Ø×¢²áÁбíÐÅÏ¢¿ÉÄÜÓë Eureka ¿Í»§¶ËµÄ»º´æÐÅÏ¢²»Í¬, Eureka ¿Í»§¶Ë×Ô¶¯´¦Àí¡£Èç¹ûÓÉÓÚijÖÖÔ­Òòµ¼ÖÂ×¢²áÁбíÐÅÏ¢²»Äܼ°Ê±Æ¥Å䣬Eureka ¿Í»§¶ËÔò»áÖØÐ»ñÈ¡Õû¸ö×¢²á±íÐÅÏ¢¡£ Eureka ·þÎñÆ÷»º´æ×¢²áÁбíÐÅÏ¢£¬Õû¸ö×¢²á±íÒÔ¼°Ã¿¸öÓ¦ÓóÌÐòµÄÐÅÏ¢½øÐÐÁËѹËõ£¬Ñ¹ËõÄÚÈݺÍûÓÐѹËõµÄÄÚÈÝÍêÈ«Ïàͬ¡£Eureka ¿Í»§¶ËºÍ Eureka ·þÎñÆ÷¿ÉÒÔʹÓÃJSON / XML¸ñʽ½øÐÐͨѶ¡£ÔÚĬÈϵÄÇé¿öÏ Eureka ¿Í»§¶ËʹÓÃѹËõ JSON ¸ñʽÀ´»ñȡע²áÁбíµÄÐÅÏ¢¡£

½áºÏÖнéÀí½â£º×â¿Í(Ïû·ÑÕß Eureka Client Consumer) È¥Öнé (·þÎñÆ÷ Eureka Server) ÄÇÀï»ñÈ¡ËùÓеķ¿ÎÝÐÅÏ¢Áбí (¿Í»§¶ËÁбí Eureka Client List) £¬¶øÇÒ×â¿ÍΪÁË»ñÈ¡×îеÄÐÅÏ¢»á¶¨ÆÚÏòÖнé (·þÎñÆ÷ Eureka Server) ÄÇÀï»ñÈ¡²¢¸üб¾µØÁÐ±í¡£

·þÎñÏÂÏß Cancel£º

¹Ù·½½âÊÍ£ºEureka¿Í»§¶ËÔÚ³ÌÐò¹Ø±ÕʱÏòEureka·þÎñÆ÷·¢ËÍÈ¡ÏûÇëÇó¡£ ·¢ËÍÇëÇóºó£¬¸Ã¿Í»§¶ËʵÀýÐÅÏ¢½«´Ó·þÎñÆ÷µÄʵÀý×¢²á±íÖÐɾ³ý¡£¸ÃÏÂÏßÇëÇó²»»á×Ô¶¯Íê³É£¬ËüÐèÒªµ÷ÓÃÒÔÏÂÄÚÈÝ£ºDiscoveryManager.getInstance().shutdownComponent();

½áºÏÖнéÀí½â£º·¿¶« (ÌṩÕß Eureka Client Provider) ¸æËßÖнé (·þÎñÆ÷ Eureka Server) Îҵķ¿×Ó²»×âÁË£¬ÖнéÖ®ºó¾Í½«×¢²áµÄ·¿ÎÝÐÅÏ¢´ÓÁбíÖÐÌÞ³ý¡£

·þÎñÌÞ³ý Eviction£º

¹Ù·½½âÊÍ£ºÔÚĬÈϵÄÇé¿öÏ£¬µ±Eureka¿Í»§¶ËÁ¬Ðø90Ãë(3¸öÐøÔ¼ÖÜÆÚ)ûÓÐÏòEureka·þÎñÆ÷·¢ËÍ·þÎñÐøÔ¼£¬¼´ÐÄÌø£¬Eureka·þÎñÆ÷»á½«¸Ã·þÎñʵÀý´Ó·þÎñ×¢²áÁбíɾ³ý£¬¼´·þÎñÌÞ³ý¡£

½áºÏÖнéÀí½â£º·¿¶«(ÌṩÕß Eureka Client Provider) »á¶¨ÆÚÁªÏµ Öнé (·þÎñÆ÷ Eureka Server) ¸æËßËûÎҵķ¿×Ó»¹×â(ÐøÔ¼)£¬Èç¹ûÖнé (·þÎñÆ÷ Eureka Server) ³¤Ê±¼äûÊÕµ½ÌṩÕßµÄÐÅÏ¢£¬ÄÇôÖнé»á½«ËûµÄ·¿ÎÝÐÅÏ¢¸øÏ¼Ü(·þÎñÌÞ³ý)¡£

ÏÂÃæ¾ÍÊÇ Netflix ¹Ù·½¸ø³öµÄ Eureka ¼Ü¹¹Í¼£¬Äã»á·¢ÏÖºÍÎÒÃÇÇ°Ãæ»­µÄÖнéͼ±ðÎÞ¶þÖ¡£

µ±È»£¬¿ÉÒԳ䵱·þÎñ·¢ÏÖµÄ×é¼þÓкࣺܶZookeeper £¬Consul £¬ Eureka µÈ¡£

¸ü¶à¹ØÓÚ Eureka µÄ֪ʶ(×ÔÎÒ±£»¤£¬³õʼע²á²ßÂԵȵÈ)¿ÉÒÔ×Ô¼ºÈ¥¹ÙÍø²é¿´£¬»òÕ߲鿴ÕâÆªÎÄÕ ÉîÈëÀí½â Eureka¡£

¸ºÔؾùºâÖ® Ribbon

ʲôÊÇ RestTemplate?

²»Êǽ² Ribbon ô£¿Ôõô³¶µ½ÁË RestTemplate ÁË£¿ÄãÏȱ𼱣¬ÌýÎÒÂýÂýµÀÀ´¡£

ÎÒ²»ÌýÎÒ²»ÌýÎÒ²»Ìý ¡£

ÎÒ¾Í˵һ¾ä£¡RestTemplateÊÇSpringÌṩµÄÒ»¸ö·ÃÎÊHttp·þÎñµÄ¿Í»§¶ËÀ࣬ÔõÃ´ËµÄØ£¿¾ÍÊÇ΢·þÎñÖ®¼äµÄµ÷ÓÃÊÇʹÓÃµÄ RestTemplate ¡£±ÈÈçÕâ¸öʱºòÎÒÃÇ Ïû·ÑÕßB ÐèÒªµ÷Óà ÌṩÕßA ËùÌṩµÄ·þÎñÎÒÃǾÍÐèÒªÕâôд¡£ÈçÎÒÏÂÃæµÄα´úÂë¡£

@Autowired
private RestTemplate restTemplate;
// ÕâÀïÊÇÌṩÕßAµÄipµØÖ·£¬µ«ÊÇÈç¹ûʹÓÃÁË Eureka ÄÇô¾ÍÓ¦¸ÃÊÇÌṩÕßAµÄÃû³Æ
private static final String SERVICE_PROVIDER_A = "http://localhost:8081";

@PostMapping("/judge")
public boolean judge (@RequestBody Request request) {
String url = SERVICE_PROVIDER_A + "/service1";
return restTemplate.postForObject (url, request, Boolean.class);
}

Èç¹ûÄã¶ÔÔ´Âë¸ÐÐËȤµÄ»°£¬Äã»á·¢ÏÖÉÏÃæÎÒÃÇËù½²µÄ Eureka ¿ò¼ÜÖÐµÄ ×¢²á¡¢ÐøÔ¼ µÈ£¬µ×²ã¶¼ÊÇʹÓÃµÄ RestTemplate ¡£

ΪʲôÐèÒª Ribbon£¿

Ribbon ÊÇ Netflix ¹«Ë¾µÄÒ»¸ö¿ªÔ´µÄ¸ºÔؾùºâ ÏîÄ¿£¬ÊÇÒ»¸ö¿Í»§¶Ë/½ø³ÌÄÚ¸ºÔؾùºâÆ÷£¬ÔËÐÐÔÚÏû·ÑÕß¶Ë¡£

ÎÒÃÇÔپٸö £¬±ÈÈçÎÒÃÇÉè¼ÆÁËÒ»¸öÃëɱϵͳ£¬µ«ÊÇΪÁËÕû¸öϵͳµÄ ¸ß¿ÉÓà £¬ÎÒÃÇÐèÒª½«Õâ¸öϵͳ×öÒ»¸ö¼¯Èº£¬¶øÕâ¸öʱºòÎÒÃÇÏû·ÑÕ߾ͿÉÒÔÓµÓжà¸öÃëɱϵͳµÄµ÷ÓÃ;¾¶ÁË£¬ÈçÏÂͼ¡£

Èç¹ûÕâ¸öʱºòÎÒÃÇûÓнøÐÐһЩ ¾ùºâ²Ù×÷ £¬Èç¹ûÎÒÃÇ¶Ô Ãëɱϵͳ1 ½øÐдóÁ¿µÄµ÷Ó㬶øÁíÍâÁ½¸ö»ù±¾²»ÇëÇ󣬾ͻᵼÖ Ãëɱϵͳ1 ±ÀÀ££¬¶øÁíÍâÁ½¸ö¾Í±ä³ÉÁË¿þÀÜ£¬ÄÇôÎÒÃÇΪʲô»¹Òª×ö¼¯Èº£¬ÎÒÃǸ߿ÉÓÃÌåÏÖµÄÒâÒåÓÖÔÚÄÄÄØ£¿

ËùÒÔ Ribbon ³öÏÖÁË£¬×¢ÒâÎÒÃÇÉÏÃæ¼Ó´ÖµÄ¼¸¸ö×Ö¡ª¡ªÔËÐÐÔÚÏû·ÑÕß¶Ë¡£Ö¸µÄÊÇ£¬Ribbon ÊÇÔËÐÐÔÚÏû·ÑÕ߶˵ĸºÔؾùºâÆ÷£¬ÈçÏÂͼ¡£

Æä¹¤×÷Ô­Àí¾ÍÊÇ Consumer ¶Ë»ñÈ¡µ½ÁËËùÓеķþÎñÁбíÖ®ºó£¬ÔÚÆäÄÚ²¿Ê¹ÓøºÔؾùºâËã·¨£¬½øÐжԶà¸öϵͳµÄµ÷Óá£

Nginx ºÍ Ribbon µÄ¶Ô±È

Ìáµ½ ¸ºÔؾùºâ ¾Í²»µÃ²»Ìáµ½´óÃû¶¦¶¦µÄ Nignx ÁË£¬¶øºÍ Ribbon ²»Í¬µÄÊÇ£¬ËüÊÇÒ»ÖÖ¼¯ÖÐʽµÄ¸ºÔؾùºâÆ÷¡£

ºÎΪ¼¯ÖÐÊ½ÄØ£¿¼òµ¥Àí½â¾ÍÊÇ ½«ËùÓÐÇëÇó¶¼¼¯ÖÐÆðÀ´£¬È»ºóÔÙ½øÐиºÔؾùºâ¡£ÈçÏÂͼ¡£

ÎÒÃÇ¿ÉÒÔ¿´µ½ Nginx ÊǽÓÊÕÁËËùÓеÄÇëÇó½øÐиºÔؾùºâµÄ£¬¶ø¶ÔÓÚ Ribbon À´ËµËüÊÇÔÚÏû·ÑÕ߶˽øÐеĸºÔؾùºâ¡£ÈçÏÂͼ¡£

Çë×¢Òâ Request µÄλÖã¬ÔÚ Nginx ÖÐÇëÇóÊÇÏȽøÈë¸ºÔØ¾ùºâÆ÷£¬¶øÔÚ Ribbon ÖÐÊÇÏÈÔÚ¿Í»§¶Ë½øÐиºÔؾùºâ²Å½øÐÐÇëÇóµÄ¡£

Ribbon µÄ¼¸ÖÖ¸ºÔؾùºâËã·¨

¸ºÔؾùºâ£¬²»¹Ü Nginx »¹ÊÇ Ribbon ¶¼ÐèÒªÆäËã·¨µÄÖ§³Ö£¬Èç¹ûÎÒû¼Ç´íµÄ»° Nginx ʹÓõÄÊÇ ÂÖѯºÍ¼ÓȨÂÖѯËã·¨¡£¶øÔÚ Ribbon ÖÐÓиü¶àµÄ¸ºÔؾùºâµ÷¶ÈËã·¨£¬ÆäĬÈÏÊÇʹÓÃµÄ RoundRobinRule ÂÖѯ²ßÂÔ¡£

RoundRobinRule£ºÂÖѯ²ßÂÔ¡£Ribbon ĬÈϲÉÓõIJßÂÔ¡£Èô¾­¹ýÒ»ÂÖÂÖѯûÓÐÕÒµ½¿ÉÓÃµÄ provider£¬Æä×î¶àÂÖѯ 10 ÂÖ¡£Èô×îÖÕ»¹Ã»ÓÐÕÒµ½£¬Ôò·µ»Ø null¡£

RandomRule: Ëæ»ú²ßÂÔ£¬´ÓËùÓпÉÓÃµÄ provider ÖÐËæ»úÑ¡ÔñÒ»¸ö¡£

RetryRule: ÖØÊÔ²ßÂÔ¡£ÏȰ´ÕÕ RoundRobinRule ²ßÂÔ»ñÈ¡ provider£¬Èô»ñȡʧ°Ü£¬ÔòÔÚÖ¸¶¨µÄʱÏÞÄÚÖØÊÔ¡£Ä¬ÈϵÄʱÏÞΪ 500 ºÁÃë¡£

»¹Óкܶ࣬ÕâÀï²»Ò»Ò»¾Ù ÁË£¬Äã×îÐèÒªÖªµÀµÄÊÇĬÈÏÂÖѯËã·¨£¬²¢ÇÒ¿ÉÒÔ¸ü»»Ä¬ÈϵĸºÔؾùºâËã·¨£¬Ö»ÐèÒªÔÚÅäÖÃÎļþÖÐ×ö³öÐ޸ľÍÐС£

providerName:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

µ±È»£¬ÔÚ Ribbon ÖÐÄ㻹¿ÉÒÔ×Ô¶¨Òå¸ºÔØ¾ùºâËã·¨£¬ÄãÖ»ÐèҪʵÏÖ IRule ½Ó¿Ú£¬È»ºóÐÞ¸ÄÅäÖÃÎļþ»òÕß×Ô¶¨Òå Java Config Àà¡£

ʲôÊÇ Open Feign

ÓÐÁË Eureka£¬RestTemplate£¬Ribbon ÎÒÃǾͿÉÒÔ Óä¿ìµØ½øÐзþÎñ¼äµÄµ÷ÓÃÁË£¬µ«ÊÇʹÓà RestTemplate »¹ÊDz»·½±ã£¬ÎÒÃÇÿ´Î¶¼Òª½øÐÐÕâÑùµÄµ÷Óá£

@Autowired
private RestTemplate restTemplate;
// ÕâÀïÊÇÌṩÕßAµÄipµØÖ·£¬µ«ÊÇÈç¹ûʹÓÃÁË Eureka ÄÇô¾ÍÓ¦¸ÃÊÇÌṩÕßAµÄÃû³Æ
private static final String SERVICE_PROVIDER_A = "http://localhost:8081";

@PostMapping("/judge")
public boolean judge (@RequestBody Request request) {
String url = SERVICE_PROVIDER_A + "/service1";
// ÊDz»ÊÇÌ«Âé·³ÁË£¿£¿£¿Ã¿´Î¶¼Òª url¡¢ÇëÇó¡¢·µ»ØÀàÐ͵Ä
return restTemplate.postForObject (url, request, Boolean.class);
}

ÕâÑùÿ´Î¶¼µ÷Óà RestRemplate µÄ API ÊÇ·ñÌ«Âé·³£¬ÎÒÄܲ»ÄÜÏñµ÷ÓÃÔ­À´´úÂëÒ»Ñù½øÐи÷¸ö·þÎñ¼äµÄµ÷ÓÃÄØ£¿

´ÏÃ÷µÄСÅóÓѿ϶¨Ïëµ½ÁË£¬ÄǾÍÓà ӳÉä ѽ£¬¾ÍÏñÓòÃûºÍIPµØÖ·µÄÓ³Éä¡£ÎÒÃÇ¿ÉÒÔ½«±»µ÷ÓõķþÎñ´úÂëÓ³Éäµ½Ïû·ÑÕß¶Ë£¬ÕâÑùÎÒÃǾͿÉÒÔ ¡°Î޷쿪·¢¡±À²¡£

OpenFeign Ò²ÊÇÔËÐÐÔÚÏû·ÑÕ߶˵ģ¬Ê¹Óà Ribbon ½øÐиºÔؾùºâ£¬ËùÒÔ OpenFeign Ö±½ÓÄÚÖÃÁË Ribbon¡£

ÔÚµ¼ÈëÁË Open Feign Ö®ºóÎÒÃǾͿÉÒÔ½øÐÐÓä¿ì±àд Consumer ¶Ë´úÂëÁË¡£

// ʹÓà @FeignClient ×¢½âÀ´Ö¸¶¨ÌṩÕßµÄÃû×Ö
@FeignClient(value = "eureka-client-provider")
public interface TestClient {
// ÕâÀïÒ»¶¨Òª×¢ÒâÐèҪʹÓõÄÊÇÌṩÕßÄǶ˵ÄÇëÇóÏà¶Ô·¾¶£¬ÕâÀï¾ÍÏ൱ÓÚÓ³ÉäÁË
@RequestMapping(value = "/provider/xxx",
method = RequestMethod.POST)
CommonResponse<List<Plan>> getPlans(@RequestBody planGetRequest request);
}

È»ºóÎÒÃÇÔÚ Controller ¾Í¿ÉÒÔÏñÔ­À´µ÷Óà Service ²ã´úÂëÒ»Ñùµ÷ÓÃËüÁË¡£

@RestController
public class TestController {
// ÕâÀï¾ÍÏ൱ÓÚÔ­À´×Ô¶¯×¢ÈëµÄ Service
@Autowired
private TestClient testClient;
// controller µ÷Óà service ²ã´úÂë
@RequestMapping(value = "/test", method = RequestMethod.POST)
public CommonResponse<List<Plan>> get(@RequestBody planGetRequest request) {
return testClient.getPlans(request);
}
}

±Ø²»¿ÉÉÙµÄ Hystrix

ʲôÊÇ HystrixÖ®È۶Ϻͽµ¼¶

ÔÚ·Ö²¼Ê½»·¾³ÖУ¬²»¿É±ÜÃâµØ»áÓÐÐí¶à·þÎñÒÀÀµÏîÖеÄijЩʧ°Ü¡£HystrixÊÇÒ»¸ö¿â£¬¿Éͨ¹ýÌí¼ÓµÈ´ýʱ¼äÈÝÏÞºÍÈÝ´íÂß¼­À´°ïÖúÄú¿ØÖÆÕâЩ·Ö²¼Ê½·þÎñÖ®¼äµÄ½»»¥¡£Hystrixͨ¹ý¸ôÀë·þÎñÖ®¼äµÄ·ÃÎʵ㣬ֹͣ·þÎñÖ®¼äµÄ¼¶Áª¹ÊÕϲ¢Ìṩºó±¸Ñ¡ÏîÀ´ÊµÏÖ´ËÄ¿µÄ£¬ËùÓÐÕâЩ¶¼¿ÉÒÔÌá¸ßϵͳµÄÕûÌ嵯ÐÔ¡£

×ÜÌåÀ´Ëµ Hystrix ¾ÍÊÇÒ»¸öÄܽøÐÐ ÈÛ¶Ï ºÍ ½µ¼¶ µÄ¿â£¬Í¨¹ýʹÓÃËüÄÜÌá¸ßÕû¸öϵͳµÄµ¯ÐÔ¡£

ÄÇôʲôÊÇ È۶Ϻͽµ¼¶ ÄØ£¿Ôپٸö £¬´ËʱÎÒÃÇÕû¸ö΢·þÎñϵͳÊÇÕâÑùµÄ¡£·þÎñAµ÷ÓÃÁË·þÎñB£¬·þÎñBÔÙµ÷ÓÃÁË·þÎñC£¬µ«ÊÇÒòΪijЩԭÒò£¬·þÎñC¶¥²»×¡ÁË£¬Õâ¸öʱºò´óÁ¿ÇëÇó»áÔÚ·þÎñC×èÈû¡£

·þÎñC×èÈûÁË»¹ºÃ£¬±Ï¾¹Ö»ÊÇÒ»¸öϵͳ±ÀÀ£ÁË¡£µ«ÊÇÇë×¢ÒâÕâ¸öʱºòÒòΪ·þÎñC²»ÄÜ·µ»ØÏìÓ¦£¬ÄÇô·þÎñBµ÷Ó÷þÎñCµÄµÄÇëÇó¾Í»á×èÈû£¬Í¬Àí·þÎñB×èÈûÁË£¬ÄÇô·þÎñAÒ²»á×èÈû±ÀÀ£¡£

Çë×¢Ò⣬Ϊʲô×èÈû»á±ÀÀ£¡£ÒòΪÕâЩÇëÇó»áÏûºÄÕ¼ÓÃϵͳµÄÏ̡߳¢IO µÈ×ÊÔ´£¬ÏûºÄÍêÄãÕâ¸öϵͳ·þÎñÆ÷²»¾Í±ÀÁËô¡£

 

Õâ¾Í½Ð ·þÎñÑ©±À¡£ÂèÒ®£¬ÉÏÃæÁ½¸ö ÈÛ¶Ï ºÍ ½µ¼¶ Ä㶼û¸øÎÒ½âÊÍÇå³þ£¬ÄãÏÖÔÚÓÖ¸øÎÒ³¶Ê²Ã´ ·þÎñÑ©±À £¿

±ð¼±£¬ÌýÎÒÂýÂýµÀÀ´¡£

²»ÌýÎÒÒ²µÃ½²ÏÂÈ¥£¡

Ëùν ÈÛ¶Ï ¾ÍÊÇ·þÎñÑ©±ÀµÄÒ»ÖÖÓÐЧ½â¾ö·½°¸¡£µ±Ö¸¶¨Ê±¼ä´°ÄÚµÄÇëÇóʧ°ÜÂÊ´ïµ½É趨ãÐֵʱ£¬ÏµÍ³½«Í¨¹ý ¶Ï·Æ÷ Ö±½Ó½«´ËÇëÇóÁ´Â·¶Ï¿ª¡£

Ò²¾ÍÊÇÎÒÃÇÉÏÃæ·þÎñBµ÷Ó÷þÎñCÔÚÖ¸¶¨Ê±¼ä´°ÄÚ£¬µ÷ÓõÄʧ°ÜÂʵ½´ïÁËÒ»¶¨µÄÖµ£¬ÄÇô Hystrix Ôò»á×Ô¶¯½« ·þÎñBÓëC Ö®¼äµÄÇëÇó¶¼¶ÏÁË£¬ÒÔÃâµ¼Ö·þÎñÑ©±ÀÏÖÏó¡£

ÆäʵÕâÀïËù½²µÄ ÈÛ¶Ï ¾ÍÊÇÖ¸µÄ Hystrix ÖÐµÄ ¶Ï·Æ÷ģʽ £¬Äã¿ÉÒÔʹÓüòµ¥µÄ @HystrixCommand ×¢½âÀ´±êעij¸ö·½·¨£¬ÕâÑù Hystrix ¾Í»áʹÓà ¶Ï·Æ÷ À´¡°°ü×°¡±Õâ¸ö·½·¨£¬Ã¿µ±µ÷ÓÃʱ¼ä³¬¹ýÖ¸¶¨Ê±¼äʱ(ĬÈÏΪ1000ms)£¬¶Ï·Æ÷½«»áÖж϶ÔÕâ¸ö·½·¨µÄµ÷Óá£

µ±È»Äã¿ÉÒÔ¶ÔÕâ¸ö×¢½âµÄºÜ¶àÊôÐÔ½øÐÐÉèÖ㬱ÈÈçÉèÖó¬Ê±Ê±¼ä£¬ÏñÕâÑù¡£

@HystrixCommand(
commandProperties = {@HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "1200")}
)
public List<Xxx> getXxxx() {
// ...Ê¡ÂÔ´úÂëÂß¼­
}

µ«ÊÇ£¬ÎÒ²éÔÄÁËһЩ²©¿Í£¬·¢ÏÖËûÃǶ¼½« ÈÛ¶Ï ºÍ ½µ¼¶ µÄ¸ÅÄî»ìÏýÁË£¬ÒÔÎÒµÄÀí½â£¬½µ¼¶ÊÇΪÁ˸üºÃµÄÓû§ÌåÑ飬µ±Ò»¸ö·½·¨µ÷ÓÃÒ쳣ʱ£¬Í¨¹ýÖ´ÐÐÁíÒ»ÖÖ´úÂëÂß¼­À´¸øÓû§ÓѺõĻظ´¡£ÕâÒ²¾Í¶ÔÓ¦×Å Hystrix µÄ ºó±¸´¦Àí ģʽ¡£Äã¿ÉÒÔͨ¹ýÉèÖà fallbackMethod À´¸øÒ»¸ö·½·¨ÉèÖñ¸ÓõĴúÂëÂß¼­¡£±ÈÈçÕâ¸öʱºòÓÐÒ»¸öÈȵãÐÂÎųöÏÖÁË£¬ÎÒÃÇ»áÍÆ¼ö¸øÓû§²é¿´ÏêÇ飬ȻºóÓû§»áͨ¹ýidÈ¥²éѯÐÂÎŵÄÏêÇ飬µ«ÊÇÒòΪÕâÌõÐÂÎÅÌ«»ðÁË(±ÈÈç×î½üʲô*Ò×¶Ô°É)£¬´óÁ¿Óû§Í¬Ê±·ÃÎÊ¿ÉÄܻᵼÖÂϵͳ±ÀÀ££¬ÄÇôÎÒÃǾͽøÐÐ ·þÎñ½µ¼¶ £¬Ò»Ð©ÇëÇó»á×öһЩ½µ¼¶´¦Àí±ÈÈ統ǰÈËÊýÌ«¶àÇëÉÔºó²é¿´µÈµÈ¡£

// Ö¸¶¨Á˺󱸷½·¨µ÷ÓÃ
@HystrixCommand(fallbackMethod = "getHystrixNews")
@GetMapping("/get/news")
public News getNews(@PathVariable("id") int id) {
// µ÷ÓÃÐÂÎÅϵͳµÄ»ñÈ¡ÐÂÎÅapi ´úÂëÂß¼­Ê¡ÂÔ
}
//
public News getHystrixNews(@PathVariable("id") int id) {
// ×ö·þÎñ½µ¼¶
// ·µ»Øµ±Ç°ÈËÊýÌ«¶à£¬ÇëÉÔºó²é¿´
}

ʲôÊÇHystrixÖ®ÆäËû

ÎÒÔÚÔĶÁ ¡¶Spring΢·þÎñʵս¡·Õâ±¾ÊéµÄʱºò»¹½Ó´¥µ½ÁËÒ»¸ö²Õ±ÚģʽµÄ¸ÅÄî¡£ÔÚ²»Ê¹ÓòձÚģʽµÄÇé¿öÏ£¬·þÎñAµ÷Ó÷þÎñB£¬ÕâÖÖµ÷ÓÃĬÈϵÄÊÇʹÓÃͬһÅúÏß³ÌÀ´Ö´Ðе쬶øÔÚÒ»¸ö·þÎñ³öÏÖÐÔÄÜÎÊÌâµÄʱºò£¬¾Í»á³öÏÖËùÓÐÏ̱߳»Ë¢±¬²¢µÈ´ý´¦Àí¹¤×÷£¬Í¬Ê±×èÈûÐÂÇëÇó£¬×îÖÕµ¼Ö³ÌÐò±ÀÀ£¡£¶ø²Õ±Úģʽ»á½«Ô¶³Ì×ÊÔ´µ÷ÓøôÀëÔÚËûÃÇ×Ô¼ºµÄÏ̳߳ØÖУ¬ÒÔ±ã¿ÉÒÔ¿ØÖƵ¥¸ö±íÏÖ²»¼ÑµÄ·þÎñ£¬¶ø²»»áʹ¸Ã³ÌÐò±ÀÀ£¡£

¾ßÌåÆäÔ­ÀíÎÒÍÆ¼ö´ó¼Ò×Ô¼ºÈ¥Á˽âһϣ¬±¾ÆªÎÄÕÂÖжԲձÚģʽ²»×ö¹ý¶à½âÊÍ¡£µ±È»»¹ÓÐ Hystrix ÒDZíÅÌ£¬ËüÊÇÓÃÀ´ÊµÊ±¼à¿Ø Hystrix µÄ¸÷ÏîÖ¸±êÐÅÏ¢µÄ£¬ÕâÀïÎÒ½«Õâ¸öÎÊÌâÒ²Å׳öÈ¥£¬Ï£ÍûÓв»Á˽âµÄ¿ÉÒÔ×Ô¼ºÈ¥ËÑË÷һϡ£

΢·þÎñÍø¹Ø¡ª¡ªZuul

ZUUL ÊÇ´ÓÉ豸ºÍ web Õ¾µãµ½ Netflix Á÷Ó¦Óúó¶ËµÄËùÓÐÇëÇóµÄǰÃÅ¡£×÷Ϊ±ß½ç·þÎñÓ¦Óã¬ZUUL ÊÇΪÁËʵÏÖ¶¯Ì¬Â·ÓÉ¡¢¼àÊÓ¡¢µ¯ÐԺͰ²È«ÐÔ¶ø¹¹½¨µÄ¡£Ëü»¹¾ßÓиù¾ÝÇé¿ö½«ÇëÇó·Óɵ½¶à¸ö Amazon Auto Scaling Groups£¨ÑÇÂíÑ·×Ô¶¯Ëõ·Å×飬ÑÇÂíÑ·µÄÒ»ÖÖÔÆ¼ÆË㷽ʽ£© µÄÄÜÁ¦

ÔÚÉÏÃæÎÒÃÇѧϰÁË Eureka Ö®ºóÎÒÃÇÖªµÀÁË ·þÎñÌṩÕß ÊÇ Ïû·ÑÕß Í¨¹ý Eureka Server ½øÐзÃÎʵ쬼´ Eureka Server ÊÇ ·þÎñÌṩÕß µÄͳһÈë¿Ú¡£ÄÇôÕû¸öÓ¦ÓÃÖдæÔÚÄÇô¶à Ïû·ÑÕßÐèÒªÓû§½øÐе÷Óã¬Õâ¸öʱºòÓû§¸ÃÔõÑù·ÃÎÊÕâЩ Ïû·ÑÕß¹¤³Ì ÄØ£¿µ±È»¿ÉÒÔÏñ֮ǰÄÇÑùÖ±½Ó·ÃÎÊÕâЩ¹¤³Ì¡£µ«ÕâÖÖ·½Ê½Ã»ÓÐͳһµÄÏû·ÑÕß¹¤³Ìµ÷ÓÃÈë¿Ú£¬²»±ãÓÚ·ÃÎÊÓë¹ÜÀí£¬¶ø Zuul ¾ÍÊÇÕâÑùµÄÒ»¸ö¶ÔÓÚ Ïû·ÑÕß µÄͳһÈë¿Ú¡£

Èç¹ûѧ¹ýǰ¶ËµÄ¿Ï¶¨¶¼ÖªµÀ Router °É£¬±ÈÈç Flutter ÖеÄ·ÓÉ£¬Vue£¬ReactÖеÄ·ÓÉ£¬ÓÃÁË Zuul Äã»á·¢ÏÖÔÚ·Óɹ¦ÄÜ·½ÃæºÍǰ¶ËÅäÖ÷ÓÉ»ù±¾ÊÇÒ»¸öÀí¡£ ÎÒż¶ûߣߣ Flutter¡£

´ó¼Ò¶ÔÍø¹ØÓ¦¸ÃºÜÊì°É£¬¼òµ¥À´½²Íø¹ØÊÇϵͳΨһ¶ÔÍâµÄÈë¿Ú£¬½éÓÚ¿Í»§¶ËÓë·þÎñÆ÷¶ËÖ®¼ä£¬ÓÃÓÚ¶ÔÇëÇó½øÐмøÈ¨¡¢ÏÞÁ÷¡¢ ·ÓÉ¡¢¼à¿ØµÈ¹¦ÄÜ¡£

û´í£¬Íø¹ØÓеŦÄÜ£¬Zuul »ù±¾¶¼ÓС£¶ø Zuul ÖÐ×î¹Ø¼üµÄ¾ÍÊÇ Â·Óɺ͹ýÂËÆ÷ ÁË£¬ÔÚ¹Ù·½ÎĵµÖÐ Zuul µÄ±êÌâ¾ÍÊÇ

Router and Filter : Zuul

Zuul µÄ·Óɹ¦ÄÜ

¼òµ¥ÅäÖÃ

±¾À´Ïë¸øÄãÃǸ´ÖÆÒ»Ð©´úÂ룬µ«ÊÇÏëÁËÏ룬ÒòΪ¸÷¸ö´úÂëÅäÖñȽÏÁãÉ¢£¬¿´ÆðÀ´Ò²±È½ÏÁãÉ¢£¬ÎÒ¾ö¶¨»¹ÊǸøÄãÃÇ»­¸öͼÀ´½âÊͰɡ£

Çë²»ÒªÒòΪÎÒÕâôºÃ¾Í¸øÎÒµãÔÞ ¡£ ·è¿ñ°µÊ¾¡£

±ÈÈçÕâ¸öʱºòÎÒÃÇÒѾ­Ïò Eureka Server ×¢²áÁËÁ½¸ö Consumer ¡¢Èý¸ö Provicer £¬Õâ¸öʱºòÎÒÃÇÔÙ¼Ó¸ö Zuul Íø¹ØÓ¦¸Ã±ä³ÉÕâÑù×ÓÁË¡£

emmm£¬ÐÅÏ¢Á¿Óеã´ó£¬ÎÒÀ´½âÊÍһϡ£¹ØÓÚÇ°ÃæµÄ֪ʶÎҾͲ»½âÊÍÁË ¡£

Ê×ÏÈ£¬Zuul ÐèÒªÏò Eureka ½øÐÐ×¢²á£¬×¢²áÓÐɶºÃ´¦ÄØ£¿

Äãɵѽ£¬Consumer ¶¼Ïò Eureka Server ½øÐÐ×¢²áÁË£¬ÎÒÍø¹ØÊDz»ÊÇֻҪע²á¾ÍÄÜÄõ½ËùÓÐ Consumer µÄÐÅÏ¢ÁË£¿

Äõ½ÐÅÏ¢ÓÐʲôºÃ´¦ÄØ£¿

ÎÒÄõ½ÐÅÏ¢ÎÒÊDz»ÊÇ¿ÉÒÔ»ñÈ¡ËùÓÐµÄ Consumer µÄÔªÊý¾Ý(Ãû³Æ£¬ip£¬¶Ë¿Ú)£¿

Äõ½ÕâЩԪÊý¾ÝÓÐʲôºÃ´¦ÄØ£¿Äõ½ÁËÎÒÃÇÊDz»ÊÇÖ±½Ó¿ÉÒÔ×ö·ÓÉÓ³É䣿±ÈÈçÔ­À´Óû§µ÷Óà Consumer1 µÄ½Ó¿Ú localhost:8001/studentInfo/update Õâ¸öÇëÇó£¬ÎÒÃÇÊDz»ÊÇ¿ÉÒÔÕâÑù½øÐе÷ÓÃÁËÄØ£¿localhost:9000/consumer1/studentInfo/update ÄØ£¿ÄãÕâÑùÊDz»ÊÇ»ÐÈ»´óÎòÁË£¿

ÕâÀïµÄurlΪÁËÈøü¶àÈË¿´¶®ËùÒÔûÓÐʹÓà restful ·ç¸ñ¡£

ÉÏÃæµÄÄãÀí½âÁË£¬ÄÇô¾ÍÄÜÀí½â¹ØÓÚ Zuul ×î»ù±¾µÄÅäÖÃÁË£¬¿´ÏÂÃæ¡£

server:
port: 9000
eureka:
client:
service-url:
# ÕâÀïֻҪע²á Eureka ¾ÍÐÐÁË
defaultZone: http://localhost:9997/eureka

È»ºóÔÚÆô¶¯ÀàÉϼÓÈë @EnableZuulProxy ×¢½â¾ÍÐÐÁË¡£Ã»´í£¬¾ÍÊÇÄÇô¼òµ¥ ¡£

ͳһǰ׺

Õâ¸öºÜ¼òµ¥£¬¾ÍÊÇÎÒÃÇ¿ÉÒÔÔÚÇ°Ãæ¼ÓÒ»¸öͳһµÄǰ׺£¬±ÈÈçÎÒÃǸոյ÷ÓõÄÊÇ localhost: 9000/consumer1/ studentInfo/update£¬Õâ¸öʱºòÎÒÃÇÔÚ yaml ÅäÖÃÎļþÖÐÌí¼ÓÈçÏ¡£

zuul:
prefix: /zuul

ÕâÑùÎÒÃǾÍÐèҪͨ¹ý localhost: 9000/zuul/consumer1/ studentInfo/update À´½øÐзÃÎÊÁË¡£

·ÓɲßÂÔÅäÖÃ

Äã»á·¢ÏÖÇ°ÃæµÄ·ÃÎÊ·½Ê½(Ö±½ÓʹÓ÷þÎñÃû)£¬ÐèÒª½«Î¢·þÎñÃû³Æ±©Â¶¸øÓû§£¬»á´æÔÚ°²È«ÐÔÎÊÌâ¡£ËùÒÔ£¬¿ÉÒÔ×Ô¶¨Òå·¾¶À´Ìæ´ú΢·þÎñÃû³Æ£¬¼´×Ô¶¨Òå·ÓɲßÂÔ¡£

zuul:
routes:
consumer1: /FrancisQ1/**
consumer2: /FrancisQ2/**

Õâ¸öʱºòÄã¾Í¿ÉÒÔʹÓà localhost: 9000/zuul/FrancisQ1/ studentInfo/update ½øÐзÃÎÊÁË¡£

·þÎñÃûÆÁ±Î

Õâ¸öʱºòÄã±ðÒÔΪÄãºÃÁË£¬Äã¿ÉÒÔÊÔÊÔ£¬ÔÚÄãÅäÖÃÍê·ÓɲßÂÔÖ®ºóʹÓÃ΢·þÎñÃû³Æ»¹ÊÇ¿ÉÒÔ·ÃÎʵģ¬Õâ¸öʱºòÄãÐèÒª½«·þÎñÃûÆÁ±Î¡£

zuul:
ignore-services: "*"

·¾¶ÆÁ±Î

Zuul »¹¿ÉÒÔÖ¸¶¨ÆÁ±ÎµôµÄ·¾¶ URI£¬¼´Ö»ÒªÓû§ÇëÇóÖаüº¬Ö¸¶¨µÄ URI ·¾¶£¬ÄÇô¸ÃÇëÇó½«ÎÞ·¨·ÃÎʵ½Ö¸¶¨µÄ·þÎñ¡£Í¨¹ý¸Ã·½Ê½¿ÉÒÔÏÞÖÆÓû§µÄȨÏÞ¡£

zuul:
ignore-patterns: **/auto/**

ÕâÑù¹ØÓÚ auto µÄÇëÇóÎÒÃǾͿÉÒÔ¹ýÂ˵ôÁË¡£

** ´ú±íÆ¥Åä¶à¼¶ÈÎÒâ·¾¶

*´ú±íÆ¥ÅäÒ»¼¶ÈÎÒâ·¾¶

Ãô¸ÐÇëÇóÍ·ÆÁ±Î

ĬÈÏÇé¿öÏ£¬Ïñ Cookie¡¢Set-Cookie µÈÃô¸ÐÇëÇóÍ·ÐÅÏ¢»á±» zuul ÆÁ±Îµô£¬ÎÒÃÇ¿ÉÒÔ½«ÕâЩĬÈÏÆÁ±ÎÈ¥µô£¬µ±È»£¬Ò²¿ÉÒÔÌí¼ÓÒªÆÁ±ÎµÄÇëÇóÍ·¡£

Zuul µÄ¹ýÂ˹¦ÄÜ

Èç¹û˵£¬Â·Óɹ¦ÄÜÊÇ Zuul µÄ»ù²ÙµÄ»°£¬ÄÇô¹ýÂËÆ÷¾ÍÊÇ ZuulµÄÀûÆ÷ÁË¡£±Ï¾¹ËùÓÐÇëÇó¶¼¾­¹ýÍø¹Ø(Zuul)£¬ÄÇôÎÒÃÇ¿ÉÒÔ½øÐи÷ÖÖ¹ýÂË£¬ÕâÑùÎÒÃǾÍÄÜʵÏÖ ÏÞÁ÷£¬»Ò¶È·¢²¼£¬È¨ÏÞ¿ØÖƵȵȡ£

¼òµ¥ÊµÏÖÒ»¸öÇëÇóʱ¼äÈÕÖ¾´òÓ¡

ҪʵÏÖ×Ô¼º¶¨ÒåµÄ Filter ÎÒÃÇÖ»ÐèÒª¼Ì³Ð ZuulFilter È»ºó½«Õâ¸ö¹ýÂËÆ÷ÀàÒÔ @Component×¢½â¼ÓÈë Spring ÈÝÆ÷ÖоÍÐÐÁË¡£

ÔÚ¸øÄãÃÇ¿´´úÂë֮ǰÎÒÏȸøÄãÃǽâÊÍһϹØÓÚ¹ýÂËÆ÷µÄһЩעÒâµã¡£

¹ýÂËÆ÷ÀàÐÍ£ºPre¡¢Routing¡¢Post¡£Ç°ÖÃPre¾ÍÊÇÔÚÇëÇó֮ǰ½øÐйýÂË£¬Routing·ÓɹýÂËÆ÷¾ÍÊÇÎÒÃÇÉÏÃæËù½²µÄ·ÓɲßÂÔ£¬¶øPostºóÖùýÂËÆ÷¾ÍÊÇÔÚ Response ֮ǰ½øÐйýÂ˵ĹýÂËÆ÷¡£Äã¿ÉÒÔ¹Û²ìÉÏͼ½áºÏ×ÅÀí½â£¬²¢ÇÒÏÂÃæÎÒ»á¸ø³öÏàÓ¦µÄ×¢ÊÍ¡£

// ¼ÓÈëSpringÈÝÆ÷
@Component
public class PreRequestFilter extends ZuulFilter {
// ·µ»Ø¹ýÂËÆ÷ÀàÐÍ ÕâÀïÊÇǰÖùýÂËÆ÷
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}
// Ö¸¶¨¹ýÂË˳Ðò ԽСԽÏÈÖ´ÐУ¬ÕâÀïµÚÒ»¸öÖ´ÐÐ
// µ±È»²»ÊÇÖ»ÕæÕýµÚÒ»¸ö ÔÚZuulÄÚÖÃÖÐÓÐÆäËû¹ýÂËÆ÷»áÏÈÖ´ÐÐ
// ÄÇÊÇдËÀµÄ ±ÈÈç SERVLET_DETECTION_FILTER_ORDER = -3
@Override
public int filterOrder() {
return 0;
}
// ʲôʱºò¸Ã½øÐйýÂË
// ÕâÀïÎÒÃÇ¿ÉÒÔ½øÐÐһЩÅжϣ¬ÕâÑùÎÒÃǾͿÉÒÔ¹ýÂ˵ôһЩ²»·ûºÏ¹æ¶¨µÄÇëÇóµÈµÈ
@Override
public boolean shouldFilter() {
return true;
}
// Èç¹û¹ýÂËÆ÷ÔÊÐíͨ¹ýÔòÔõô½øÐд¦Àí
@Override
public Object run() throws ZuulException {
// ÕâÀïÎÒÉèÖÃÁËÈ«¾ÖµÄRequestContext²¢¼Ç¼ÁËÇëÇó¿ªÊ¼Ê±¼ä
RequestContext ctx = RequestContext.getCurrentContext();
ctx.set("startTime", System.currentTimeMillis());
return null;
}
}

 

// lombokµÄÈÕÖ¾
@Slf4j
// ¼ÓÈë Spring ÈÝÆ÷
@Component
public class AccessLogFilter extends ZuulFilter {
// Ö¸¶¨¸Ã¹ýÂËÆ÷µÄ¹ýÂËÀàÐÍ
// ´ËʱÊǺóÖùýÂËÆ÷
@Override
public String filterType() {
return FilterConstants.POST_TYPE;
}
// SEND_RESPONSE_FILTER_ORDER ÊÇ×îºóÒ»¸ö¹ýÂËÆ÷
// ÎÒÃǴ˹ýÂËÆ÷ÔÚËü֮ǰִÐÐ
@Override
public int filterOrder() {
return FilterConstants.SEND_RESPONSE_FILTER_ORDER - 1;
}
@Override
public boolean shouldFilter() {
return true;
}
// ¹ýÂËʱִÐеIJßÂÔ
@Override
public Object run() throws ZuulException {
RequestContext context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
// ´ÓRequestContext»ñȡԭÏȵĿªÊ¼Ê±¼ä ²¢Í¨¹ýËü¼ÆËãÕû¸öʱ¼ä¼ä¸ô
Long startTime = (Long) context.get ("startTime");
// ÕâÀïÎÒ¿ÉÒÔ»ñÈ¡HttpServletRequestÀ´»ñÈ¡URI²¢ÇÒ´òÓ¡³öÀ´
String uri = request.getRequestURI();
long duration = System.currentTimeMillis() - startTime;
log.info(" uri: " + uri + ", duration: " + duration / 100 + "ms");
return null;
}
}

 

ÉÏÃæ¾Í¼òµ¥ÊµÏÖÁËÇëÇóʱ¼äÈÕÖ¾´òÓ¡¹¦ÄÜ£¬ÄãÓÐûÓиÐÊܵ½ Zuul ¹ýÂ˹¦ÄܵÄÇ¿´óÁËÄØ£¿

ûÓУ¿ºÃµÄ¡¢ÄÇÎÒÃÇÔÙÀ´¡£

ÁîÅÆÍ°ÏÞÁ÷

µ±È»²»½ö½öÊÇÁîÅÆÍ°ÏÞÁ÷·½Ê½£¬Zuul Ö»ÒªÊÇÏÞÁ÷µÄ»îËü¶¼Äܸɣ¬ÕâÀïÎÒÖ»ÊǼòµ¥¾Ù¸ö ¡£

ÎÒÏÈÀ´½âÊÍÒ»ÏÂʲôÊÇ ÁîÅÆÍ°ÏÞÁ÷ °É¡£

Ê×ÏÈÎÒÃÇ»áÓиöͰ£¬Èç¹ûÀïÃæÃ»ÓÐÂúÄÇô¾Í»áÒÔÒ»¶¨ ¹Ì¶¨µÄËÙÂÊ »áÍùÀïÃæ·ÅÁîÅÆ£¬Ò»¸öÇëÇó¹ýÀ´Ê×ÏÈÒª´ÓͰÖлñÈ¡ÁîÅÆ£¬Èç¹ûûÓлñÈ¡µ½£¬ÄÇôÕâ¸öÇëÇó¾Í¾Ü¾ø£¬Èç¹û»ñÈ¡µ½ÄÇô¾Í·ÅÐС£ºÜ¼òµ¥°É£¬°¡¹þ¹þ¡¢

ÏÂÃæÎÒÃǾÍͨ¹ý Zuul µÄǰÖùýÂËÆ÷À´ÊµÏÖÒ»ÏÂÁîÅÆÍ°ÏÞÁ÷¡£

@Component
@Slf4j
public class RouteFilter extends ZuulFilter {
// ¶¨ÒåÒ»¸öÁîÅÆÍ°£¬Ã¿Ãë²úÉú2¸öÁîÅÆ£¬¼´Ã¿Ãë×î¶à´¦Àí2¸öÇëÇó
private static final RateLimiter RATE_LIMITER = RateLimiter.create(2);
@Override
public String filterType() {
return FilterConstants.PRE_TYPE;
}

@Override
public int filterOrder() {
return -5;
}

@Override
public Object run() throws ZuulException {
log.info("·ÅÐÐ");
return null;
}

@Override
public boolean shouldFilter() {
RequestContext context = RequestContext.getCurrentContext();
if(!RATE_LIMITER.tryAcquire()) {
log.warn("·ÃÎÊÁ¿³¬ÔØ");
// Ö¸¶¨µ±Ç°ÇëÇóδͨ¹ý¹ýÂË
context.setSendZuulResponse(false);
// Ïò¿Í»§¶Ë·µ»ØÏìÓ¦Âë429£¬ÇëÇóÊýÁ¿¹ý¶à
context.setResponseStatusCode(429);
return false;
}
return true;
}
}

ÕâÑùÎÒÃǾÍÄܽ«ÇëÇóÊýÁ¿¿ØÖÆÔÚÒ»ÃëÁ½¸ö£¬ÓÐûÓоõµÃºÜ¿á£¿

¹ØÓÚ Zuul µÄÆäËû

Zuul µÄ¹ýÂËÆ÷µÄ¹¦Äܿ϶¨²»Ö¹ÉÏÃæÎÒËùʵÏÖµÄÁ½ÖÖ£¬Ëü»¹¿ÉÒÔʵÏÖ È¨ÏÞУÑ飬°üÀ¨ÎÒÉÏÃæÌáµ½µÄ »Ò¶È·¢²¼ µÈµÈ¡£

µ±È»£¬Zuul ×÷ÎªÍø¹Ø¿Ï¶¨Ò²´æÔÚ µ¥µãÎÊÌâ £¬Èç¹ûÎÒÃÇÒª±£Ö¤ Zuul µÄ¸ß¿ÉÓã¬ÎÒÃǾÍÐèÒª½øÐÐ Zuul µÄ¼¯ÈºÅäÖã¬Õâ¸öʱºò¿ÉÒÔ½èÖú¶îÍâµÄһЩ¸ºÔؾùºâÆ÷±ÈÈç Nginx ¡£

Spring CloudÅäÖùÜÀí¡ª¡ªConfig

ΪʲôҪʹÓýøÐÐÅäÖùÜÀí£¿

µ±ÎÒÃǵÄ΢·þÎñϵͳ¿ªÊ¼ÂýÂýµØÅÓ´óÆðÀ´£¬ÄÇô¶à Consumer ¡¢Provider ¡¢Eureka Server¡¢Zuul ϵͳ¶¼»á³ÖÓÐ×Ô¼ºµÄÅäÖã¬Õâ¸öʱºòÎÒÃÇÔÚÏîÄ¿ÔËÐеÄʱºò¿ÉÄÜÐèÒª¸ü¸ÄijЩӦÓõÄÅäÖã¬Èç¹ûÎÒÃDz»½øÐÐÅäÖõÄͳһ¹ÜÀí£¬ÎÒÃÇÖ»ÄÜȥÿ¸öÓ¦ÓÃÏÂÒ»¸öÒ»¸öѰÕÒÅäÖÃÎļþÈ»ºóÐÞ¸ÄÅäÖÃÎļþÔÙÖØÆôÓ¦Óá£

Ê×ÏȶÔÓÚ·Ö²¼Ê½ÏµÍ³¶øÑÔÎÒÃǾͲ»Ó¦¸Ãȥÿ¸öÓ¦ÓÃÏÂÈ¥·Ö±ðÐÞ¸ÄÅäÖÃÎļþ£¬ÔÙÕß¶ÔÓÚÖØÆôÓ¦ÓÃÀ´Ëµ£¬·þÎñÎÞ·¨·ÃÎÊËùÒÔÖ±½ÓÅׯúÁË¿ÉÓÃÐÔ£¬ÕâÊÇÎÒÃǸü²»Ô¸¼ûµ½µÄ¡£

ÄÇôÓÐûÓÐÒ»ÖÖ·½·¨¼ÈÄܶÔÅäÖÃÎļþͳһµØ½øÐйÜÀí£¬ÓÖÄÜÔÚÏîÄ¿ÔËÐÐʱ¶¯Ì¬ÐÞ¸ÄÅäÖÃÎļþÄØ£¿

ÄǾÍÊÇÎÒ½ñÌìËùÒª½éÉÜµÄ Spring Cloud Config ¡£

ÄܽøÐÐÅäÖùÜÀíµÄ¿ò¼Ü²»Ö¹ Spring Cloud Config Ò»ÖÖ£¬´ó¼Ò¿ÉÒÔ¸ù¾ÝÐèÇó×Ô¼ºÑ¡Ôñ£¨disconf£¬°¢²¨Â޵ȵȣ©¡£¶øÇÒ¶ÔÓÚ Config À´ËµÓÐЩµØ·½ÊµÏֵIJ»ÊÇÄÇô¾¡ÈËÒâ¡£

Config ÊÇʲô

Spring Cloud Config Ϊ·Ö²¼Ê½ÏµÍ³ÖеÄÍⲿ»¯ÅäÖÃÌṩ·þÎñÆ÷ºÍ¿Í»§¶ËÖ§³Ö¡£Ê¹Óà Config ·þÎñÆ÷£¬¿ÉÒÔÔÚÖÐÐÄλÖùÜÀíËùÓл·¾³ÖÐÓ¦ÓóÌÐòµÄÍⲿÊôÐÔ¡£

¼òµ¥À´Ëµ£¬Spring Cloud Config ¾ÍÊÇÄܽ«¸÷¸ö Ó¦ÓÃ/ϵͳ/Ä£¿é µÄÅäÖÃÎļþ´æ·Åµ½ ͳһµÄµØ·½È»ºó½øÐйÜÀí(Git »òÕß SVN)¡£

ÄãÏëһϣ¬ÎÒÃǵÄÓ¦ÓÃÊDz»ÊÇÖ»ÓÐÆô¶¯µÄʱºò²Å»á½øÐÐÅäÖÃÎļþµÄ¼ÓÔØ£¬ÄÇôÎÒÃÇµÄ Spring Cloud Config ¾Í±©Â¶³öÒ»¸ö½Ó¿Ú¸øÆô¶¯Ó¦ÓÃÀ´»ñÈ¡ËüËùÏëÒªµÄÅäÖÃÎļþ£¬Ó¦ÓûñÈ¡µ½ÅäÖÃÎļþÈ»ºóÔÙ½øÐÐËüµÄ³õʼ»¯¹¤×÷¡£¾ÍÈçÏÂͼ¡£

µ±È»ÕâÀïÄã¿Ï¶¨»¹»áÓÐÒ»¸öÒÉÎÊ£¬Èç¹ûÎÒÔÚÓ¦ÓÃÔËÐÐʱȥ¸ü¸ÄÔ¶³ÌÅäÖòֿâ(Git)ÖеĶÔÓ¦ÅäÖÃÎļþ£¬ÄÇôÒÀÀµÓÚÕâ¸öÅäÖÃÎļþµÄÒÑÆô¶¯µÄÓ¦Óû᲻»á½øÐÐÆäÏàÓ¦ÅäÖõĸü¸ÄÄØ£¿

´ð°¸ÊDz»»áµÄ¡£

ʲô£¿ÄÇÔõô½øÐж¯Ì¬ÐÞ¸ÄÅäÖÃÎļþÄØ£¿Õâ²»ÊdzöÏÖÁË ÅäÖÃÆ¯ÒÆ Âð£¿Äã¸öÔüÄÐ £¬ÄãÓÖÆ­ÎÒ£¡

±ð¼±ÂÄã¿ÉÒÔʹÓà Webhooks £¬ÕâÊÇ github ÌṩµÄ¹¦ÄÜ£¬ËüÄÜÈ·±£Ô¶³Ì¿âµÄÅäÖÃÎļþ¸üкó¿Í»§¶ËÖеÄÅäÖÃÐÅÏ¢Ò²µÃµ½¸üС£

àÞàÞ£¬Õ⻹²î²»¶à¡£ÎÒÈ¥²é²éÔõôÓá£

Âý×Å£¬ÌýÎÒ˵Í꣬Webhooks ËäÈ»Äܽâ¾ö£¬µ«ÊÇÄãÁ˽âһϻᷢÏÖËü¸ù±¾²»ÊʺÏÓÃÓÚÉú²ú»·¾³£¬ËùÒÔ»ù±¾²»»áʹÓÃËüµÄ¡£

¶øÒ»°ãÎÒÃÇ»áʹÓà Bus ÏûÏ¢×ÜÏß + Spring Cloud Config ½øÐÐÅäÖõĶ¯Ì¬Ë¢Ð¡£

Òý³ö Spring Cloud Bus

ÓÃÓÚ½«·þÎñºÍ·þÎñʵÀýÓë·Ö²¼Ê½ÏûϢϵͳÁ´½ÓÔÚÒ»ÆðµÄʼþ×ÜÏß¡£ÔÚ¼¯ÈºÖд«²¥×´Ì¬¸ü¸ÄºÜÓÐÓã¨ÀýÈçÅäÖøü¸Äʼþ£©¡£

Äã¿ÉÒÔ¼òµ¥Àí½âΪ Spring Cloud Bus µÄ×÷ÓþÍÊǹÜÀíºÍ¹ã²¥·Ö²¼Ê½ÏµÍ³ÖеÄÏûÏ¢£¬Ò²¾ÍÊÇÏûÏ¢ÒýÇæÏµÍ³ÖеĹ㲥ģʽ¡£µ±È»×÷Ϊ ÏûÏ¢×ÜÏß µÄ Spring Cloud Bus ¿ÉÒÔ×öºÜ¶àʶø²»½ö½öÊǿͻ§¶ËµÄÅäÖÃˢй¦ÄÜ¡£

¶øÓµÓÐÁË Spring Cloud Bus Ö®ºó£¬ÎÒÃÇÖ»ÐèÒª´´½¨Ò»¸ö¼òµ¥µÄÇëÇ󣬲¢ÇÒ¼ÓÉÏ @ResfreshScope ×¢½â¾ÍÄܽøÐÐÅäÖõĶ¯Ì¬ÐÞ¸ÄÁË£¬ÏÂÃæÎÒ»­ÁËÕÅͼ¹©ÄãÀí½â¡£

×ܽá

ÕâÆªÎÄÕÂÖÐÎÒ´ø´ó¼Ò³õ²½Á˽âÁË Spring Cloud µÄ¸÷¸ö×é¼þ£¬ËûÃÇÓÐ

Eureka ·þÎñ·¢ÏÖ¿ò¼Ü

Ribbon ½ø³ÌÄÚ¸ºÔؾùºâÆ÷

Open Feign ·þÎñµ÷ÓÃÓ³Éä

Hystrix ·þÎñ½µ¼¶ÈÛ¶ÏÆ÷

Zuul ΢·þÎñÍø¹Ø

Config ΢·þÎñͳһÅäÖÃÖÐÐÄ

Bus ÏûÏ¢×ÜÏß

Èç¹ûÄãÄÜÕâ¸öʱºòÄÜ¿´¶®ÏÂÃæÄÇÕÅͼ£¬Ò²¾Í˵Ã÷ÁËÄãÒѾ­¶Ô Spring Cloud ΢·þÎñÓÐÁËÒ»¶¨µÄ¼Ü¹¹ÈÏʶ¡£

 

 

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

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

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

ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ÖÐ̨սÂÔ¡¢ÖÐ̨½¨ÉèÓëÊý×ÖÉÌÒµ
ÒÚ¼¶Óû§¸ß²¢·¢¡¢¸ß¿ÉÓÃϵͳ¼Ü¹¹
¸ß¿ÉÓ÷ֲ¼Ê½¼Ü¹¹Éè¼ÆÓëʵ¼ù
×îл¼Æ»®
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢ 6-12[ÏÃÃÅ]
È˹¤ÖÇÄÜ.»úÆ÷ѧϰTensorFlow 6-22[Ö±²¥]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 6-30[±±¾©]
ǶÈëʽÈí¼þ¼Ü¹¹-¸ß¼¶Êµ¼ù 7-9[±±¾©]
Óû§ÌåÑé¡¢Ò×ÓÃÐÔ²âÊÔÓëÆÀ¹À 7-25[Î÷°²]
ͼÊý¾Ý¿âÓë֪ʶͼÆ× 8-23[±±¾©]
 
×îÐÂÎÄÕÂ
´óÊý¾Ýƽ̨ϵÄÊý¾ÝÖÎÀí
ÈçºÎÉè¼ÆÊµÊ±Êý¾Ýƽ̨£¨¼¼Êõƪ£©
´óÊý¾Ý×ʲú¹ÜÀí×ÜÌå¿ò¼Ü¸ÅÊö
Kafka¼Ü¹¹ºÍÔ­Àí
ELK¶àÖּܹ¹¼°ÓÅÁÓ
×îпγÌ
´óÊý¾Ýƽ̨´î½¨Óë¸ßÐÔÄܼÆËã
´óÊý¾Ýƽ̨¼Ü¹¹ÓëÓ¦ÓÃʵս
´óÊý¾ÝϵͳÔËά
´óÊý¾Ý·ÖÎöÓë¹ÜÀí
Python¼°Êý¾Ý·ÖÎö
³É¹¦°¸Àý
ijͨÐÅÉ豸ÆóÒµ PythonÊý¾Ý·ÖÎöÓëÍÚ¾ò
Ä³ÒøÐÐ È˹¤ÖÇÄÜ+Python+´óÊý¾Ý
±±¾© Python¼°Êý¾Ý·ÖÎö
ÉñÁúÆû³µ ´óÊý¾Ý¼¼Êõƽ̨-Hadoop
ÖйúµçÐÅ ´óÊý¾Ýʱ´úÓëÏÖ´úÆóÒµµÄÊý¾Ý»¯ÔËӪʵ¼ù