Spring Cloud¼ò½é
Spring CloudÊÇ»ùÓÚSpring BootµÄÒ»ÕûÌ×ʵÏÖ΢·þÎñµÄ¿ò¼Ü¡£ËûÌṩÁË΢·þÎñ¿ª·¢ËùÐèµÄÅäÖùÜÀí¡¢·þÎñ·¢ÏÖ¡¢¶Ï·Æ÷¡¢ÖÇÄÜ·ÓÉ¡¢Î¢´úÀí¡¢¿ØÖÆ×ÜÏß¡¢È«¾ÖËø¡¢¾ö²ß¾ºÑ¡¡¢·Ö²¼Ê½»á»°ºÍ¼¯Èº×´Ì¬¹ÜÀíµÈ×é¼þ¡£×îÖØÒªµÄÊÇ£¬¸úspring
boot¿ò¼ÜÒ»ÆðʹÓõϰ£¬»áÈÃÄ㿪·¢Î¢·þÎñ¼Ü¹¹µÄÔÆ·þÎñ·Ç³£ºÃµÄ·½±ã¡£
Spring Cloud°üº¬Á˷dz£¶àµÄ×Ó¿ò¼Ü£¬ÆäÖУ¬Spring Cloud NetflixÊÇÆäÖÐÒ»Ì׿ò¼Ü£¬ÓÉNetflix¿ª·¢ºóÀ´ÓÖ²¢ÈëSpring
Cloud´ó¼ÒÍ¥£¬ËüÖ÷ÒªÌṩµÄÄ£¿é°üÀ¨£º·þÎñ·¢ÏÖ¡¢¶Ï·Æ÷ºÍ¼à¿Ø¡¢ÖÇÄÜ·ÓÉ¡¢¿Í»§¶Ë¸ºÔؾùºâµÈ¡£
Spring Cloud NetflixÏîÄ¿µÄʱ¼ä»¹²»³¤£¬²¢ÈëSpring Cloud´ó¼Ò×廹ÊÇ2Äêǰ£¬ËùÒÔÏà¹ØµÄʹÓÃÎĵµ»¹±È½ÏÉÙ£¬³ýÁ˹ٷ½Îĵµ£¬¹úÄÚÒ²ÓÐÒ»¸öÖÐÎÄÉçÇø¡£µ«ÊÇ£¬Èç¹ûÊǸտªÊ¼½Ó´¥Õâ¸ö£¬ÏëʹÓÃËü´î½¨Ò»Ì×΢·þÎñµÄÓ¦Óüܹ¹£¬×ÜÊÇ»áÓв»ÖªÈçºÎÏÂÊֵĸоõ¡£ËùÒÔ£¬ÕâÆªÎÄÕ¾ÍÊÇ´ÓÕûÌåÉÏÀ´¿´¿´Õâ¸ö¿ò¼ÜµÄ¸÷¸ö×é¼þ¡¢Óô¦ÊÇʲô¡¢ÈçºÎÏ໥×÷Óá£×îºóÔÙ½áºÏʵ¼ÊµÄ¾Ñ飬½éÉÜһϿÉÄÜ»á³öÏÖµÄÎÊÌ⣬ÒÔ¼°Õë¶ÔһЩÎÊÌ⣬²ÉÓÃʲôÑùµÄ½â¾ö·½°¸¡£
΢·þÎñ¼Ü¹¹
Ê×ÏÈ£¬ÎÒÃÇÀ´¿´¿´Ò»°ãµÄ΢·þÎñ¼Ü¹¹ÐèÒªµÄ¹¦ÄÜ»òʹÓó¡¾°£º
ÎÒÃǰÑÕû¸öϵͳ¸ù¾ÝÒµÎñ²ð·Ö³É¼¸¸ö×Óϵͳ¡£
ÿ¸ö×Óϵͳ¿ÉÒÔ²¿Êð¶à¸öÓ¦Ó㬶à¸öÓ¦ÓÃÖ®¼äʹÓøºÔؾùºâ¡£
ÐèÒªÒ»¸ö·þÎñ×¢²áÖÐÐÄ£¬ËùÓеķþÎñ¶¼ÔÚ×¢²áÖÐÐÄ×¢²á£¬¸ºÔؾùºâÒ²ÊÇͨ¹ýÔÚ×¢²áÖÐÐÄ×¢²áµÄ·þÎñÀ´Ê¹ÓÃÒ»¶¨²ßÂÔÀ´ÊµÏÖ¡£
ËùÓеĿͻ§¶Ë¶¼Í¨¹ýͬһ¸öÍø¹ØµØÖ··ÃÎʺǫ́µÄ·þÎñ£¬Í¨¹ý·ÓÉÅäÖã¬Íø¹ØÀ´ÅжÏÒ»¸öURLÇëÇóÓÉÄĸö·þÎñ´¦Àí¡£ÇëÇóת·¢µ½·þÎñÉϵÄʱºòҲʹÓøºÔؾùºâ¡£
·þÎñÖ®¼äÓÐʱºòÒ²ÐèÒªÏ໥·ÃÎÊ¡£ÀýÈçÓÐÒ»¸öÓû§Ä£¿é£¬ÆäËû·þÎñÔÚ´¦ÀíһЩҵÎñµÄʱºò£¬Òª»ñÈ¡Óû§·þÎñµÄÓû§Êý¾Ý¡£
ÐèÒªÒ»¸ö¶Ï·Æ÷£¬¼°Ê±´¦Àí·þÎñµ÷ÓÃʱµÄ³¬Ê±ºÍ´íÎ󣬷ÀÖ¹ÓÉÓÚÆäÖÐÒ»¸ö·þÎñµÄÎÊÌâ¶øµ¼ÖÂÕûÌåϵͳµÄ̱»¾¡£
»¹ÐèÒªÒ»¸ö¼à¿Ø¹¦ÄÜ£¬¼à¿ØÃ¿¸ö·þÎñµ÷Óû¨·ÑµÄʱ¼äµÈ¡£
Spring Cloud Netflix×é¼þÒÔ¼°²¿Êð
Spring Cloud Netflix¿ò¼Ü¸ÕºÃ¾ÍÂú×ãÁËÉÏÃæËùÓеÄÐèÇ󣬶øÇÒ×îÖØÒªµÄÊÇ£¬Ê¹ÓÃÆðÀ´·Ç³£µÄ¼òµ¥¡£Spring
Cloud Netflix°üº¬µÄ×é¼þ¼°ÆäÖ÷Òª¹¦ÄÜ´óÖÂÈçÏ£º
Eureka£¬·þÎñ×¢²áºÍ·¢ÏÖ£¬ËüÌṩÁËÒ»¸ö·þÎñ×¢²áÖÐÐÄ¡¢·þÎñ·¢ÏֵĿͻ§¶Ë£¬»¹ÓÐÒ»¸ö·½±ãµÄ²é¿´ËùÓÐ×¢²áµÄ·þÎñµÄ½çÃæ¡£
ËùÓеķþÎñʹÓÃEurekaµÄ·þÎñ·¢ÏÖ¿Í»§¶ËÀ´½«×Ô¼º×¢²áµ½EurekaµÄ·þÎñÆ÷ÉÏ¡£
Zuul£¬Íø¹Ø£¬ËùÓеĿͻ§¶ËÇëÇóͨ¹ýÕâ¸öÍø¹Ø·ÃÎʺǫ́µÄ·þÎñ¡£Ëû¿ÉÒÔʹÓÃÒ»¶¨µÄ·ÓÉÅäÖÃÀ´ÅжÏijһ¸öURLÓÉÄĸö·þÎñÀ´´¦Àí¡£²¢´ÓEureka»ñȡע²áµÄ·þÎñÀ´×ª·¢ÇëÇó¡£
Ribbon£¬¼´¸ºÔؾùºâ£¬ZuulÍø¹Ø½«Ò»¸öÇëÇó·¢Ë͸øÄ³Ò»¸ö·þÎñµÄÓ¦ÓõÄʱºò£¬Èç¹ûÒ»¸ö·þÎñÆô¶¯Á˶à¸öʵÀý£¬¾Í»áͨ¹ýRibbonÀ´Í¨¹ýÒ»¶¨µÄ¸ºÔؾùºâ²ßÂÔÀ´·¢Ë͸øÄ³Ò»¸ö·þÎñʵÀý¡£
Feign£¬·þÎñ¿Í»§¶Ë£¬·þÎñÖ®¼äÈç¹ûÐèÒªÏ໥·ÃÎÊ£¬¿ÉÒÔʹÓÃRestTemplate£¬Ò²¿ÉÒÔʹÓÃFeign¿Í»§¶Ë·ÃÎÊ¡£ËüĬÈÏ»áʹÓÃRibbonÀ´ÊµÏÖ¸ºÔؾùºâ¡£
Hystrix£¬¼à¿ØºÍ¶Ï·Æ÷¡£ÎÒÃÇÖ»ÐèÒªÔÚ·þÎñ½Ó¿ÚÉÏÌí¼ÓHystrix±êÇ©£¬¾Í¿ÉÒÔʵÏÖ¶ÔÕâ¸ö½Ó¿ÚµÄ¼à¿ØºÍ¶Ï·Æ÷¹¦ÄÜ¡£
Hystrix Dashboard£¬¼à¿ØÃæ°å£¬ËûÌṩÁËÒ»¸ö½çÃæ£¬¿ÉÒÔ¼à¿Ø¸÷¸ö·þÎñÉϵķþÎñµ÷ÓÃËùÏûºÄµÄʱ¼äµÈ¡£
Turbine£¬¼à¿Ø¾ÛºÏ£¬Ê¹ÓÃHystrix¼à¿Ø£¬ÎÒÃÇÐèÒª´ò¿ªÃ¿Ò»¸ö·þÎñʵÀýµÄ¼à¿ØÐÅÏ¢À´²é¿´¡£¶øTurbine¿ÉÒÔ°ïÖúÎÒÃǰÑËùÓеķþÎñʵÀýµÄ¼à¿ØÐÅÏ¢¾ÛºÏµ½Ò»¸öµØ·½Í³Ò»²é¿´¡£ÕâÑù¾Í²»ÐèÒª°¤¸ö´ò¿ªÒ»¸ö¸öµÄÒ³ÃæÒ»¸ö¸ö²é¿´¡£
ÏÂÃæ¾ÍÊÇʹÓÃÉÏÊöµÄ×Ó¿ò¼ÜʵÏÖµÄΪ·þÎñ¼Ü¹¹µÄ×é¼Ü¹¹Í¼£º

ÔÚÉÏͼÖУ¬Óм¸¸öÐèҪ˵Ã÷µÄµØ·½£º
ZuulÍø¹ØÒ²ÔÚ×¢²áÖÐÐÄ×¢²á£¬°ÑËüÒ²µ±³ÉÒ»¸ö·þÎñÀ´Í³Ò»²é¿´¡£ ¸ºÔؾùºâ²»ÊÇÒ»¸ö¶ÀÁ¢µÄ×é¼þ£¬ËüÔËÐÐÔÚÍø¹Ø¡¢·þÎñµ÷Óõȵط½£¬Ã¿µ±ÐèÒª·ÃÎÊÒ»¸ö·þÎñµÄʱºò£¬¾Í»áͨ¹ýRibbonÀ´»ñµÃÒ»¸ö¸Ã·þÎñµÄʵÀýÈ¥µôÓá£Ribbon´ÓEureka×¢²áÖÐÐÄ»ñµÃ·þÎñºÍʵÀýµÄÁÐ±í£¬¶ø²»ÊÇ·¢ËÍÿ¸öÇëÇóµÄʱºò´Ó×¢²áÖÐÐÄ»ñµÃ¡£
ÎÒÃÇ¿ÉÒÔʹÓÃRestTemplateÀ´½øÐзþÎñ¼äµ÷Óã¬Ò²¿ÉÒÔÅäÖÃFeignClientÀ´Ê¹Ó㬲»¹Üʲô·½Ê½£¬Ö»ÒªÊ¹Ó÷þÎñ×¢²á£¬¾Í»áĬÈÏʹÓÃRibbon¸ºÔؾùºâ¡££¨RestTemplateÐèÒªÌí¼Ó@LoadBalanced£©
ÿ¸ö·þÎñ¶¼¿ÉÒÔ¿ªÆô¼à¿Ø¹¦ÄÜ£¬¿ªÆô¼à¿ØµÄ·þÎñ»áÌṩһ¸öservlet½Ó¿Ú/hystrix.stream£¬Èç¹ûÄãÐèÒª¼à¿ØÕâ¸ö·þÎñµÄijһ¸ö·½·¨µÄÔËÐÐͳ¼Æ£¬¾ÍÔÚÕâ¸ö·½·¨ÉϼÓÒ»¸ö@HystrixCommandµÄ±êÇ©¡£
²é¿´¼à¿ØÐÅÏ¢£¬¾ÍÊÇÔÚHystrix DashboardÉÏÊäÈëÕâ¸ö·þÎñµÄ¼à¿Øurl: http://serviceIp:port/hystrix.stream£¬¾Í¿ÉÒÔÓÃͼ±íµÄ·½Ê½²é¿´ÔËÐÐ¼à¿ØÐÅÏ¢¡£
Èç¹ûÒª°ÑËùÓеķþÎñµÄ¼à¿ØÐÅÏ¢¾ÛºÏÔÚÒ»Æðͳһ²é¿´£¬¾ÍÐèҪʹÓÃTurbineÀ´¾ÛºÏËùÐèÒªµÄ·þÎñµÄ¼à¿ØÐÅÏ¢¡£
ÎÒÃÇÒ²¿ÉÒÔ´ÓÉÏͼÖп´³ö¸Ã¼Ü¹¹µÄ²¿Êð·½Ê½£º
¶ÀÁ¢²¿ÊðÒ»¸öÍø¹ØÓ¦ÓÃ
·þÎñ×¢²áÖÐÐÄºÍ¼à¿Ø¿ÉÒÔÅäÖÃÔÚÒ»¸öÓ¦ÓÃÀҲ¿ÉÒÔÊÇ2¸öÓ¦Óá£
·þÎñ×¢²áÖÐÐÄÒ²¿ÉÒÔ²¿Êð¶à¸ö£¬Í¨¹ýÇøÓòzoneÀ´Çø·Ö£¬À´ÊµÏָ߿ÉÓá£
ÿ¸ö·þÎñ£¬¸ù¾Ý¸ºÔغ͸߿ÉÓõÄÐèÒª£¬²¿ÊðÒ»¸ö»ò¶à¸öʵÀý¡£
Spring Cloud Netflix×é¼þ¿ª·¢
ÉÏÃæËµµ½£¬¿ª·¢»ùÓÚSpring Cloud NetflixµÄ΢·þÎñ·Ç³£¼òµ¥£¬Ò»°ãÎÒÃÇÊǺÍSpring BootÒ»ÆðʹÓã¬Èç¹ûÄãÏëÔÚ×Ô¼ºÔÏȵÄJava
WebÓ¦ÓÃÖÐʹÓÃÒ²¿ÉÒÔͨ¹ýÌí¼ÓÏà¹ØÅäÖÃÀ´Êµ¼ù¡£
Óйؿª·¢µÄÏêϸÄÚÈÝ£¬¿ÉÒԲο¼Spring CloudÖÐÎÄÉçÇøµÄÕâ¸öϵÁÐÎÄÕ£¬ÀïÃæÏêϸ½éÉÜÁËÿһÖÖ×é¼þµÄ¿ª·¢¡£ÕâÀ¾ÍÖ»ÊÇÀ´¿´Ò»Ï·þÎñ×¢²áÖÐºÍ¼à¿ØÄ£¿éµÄ¿ª·¢£¬»¹ÓзþÎñµ÷ÓõĿª·¢£¬ÆäËûµÄ¿ÉÒÔÖ±½Ó²Î¿¼ÉÏÃæµÄϵÁÐÎÄÕ¡£
×¢²áºÍ¼à¿ØÖÐÐĵĿª·¢
Õâ¸ö·Ç³£¼òµ¥£¬¾ÍÏÂÃæÒ»¸öÀࣺ
// Ê¡ÂÔimport @SpringBootApplication @EnableEurekaServer @EnableHystrixDashboard public class ApplicationRegistry { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } } |
ÕâÀïʹÓÃSpring Boot±êÇ©µÄ@SpringBootApplication˵Ã÷µ±Ç°µÄÓ¦ÓÃÊÇÒ»¸öSpring
BootÓ¦Óá£ÕâÑùÎҾͿÉÒÔÖ±½ÓÓÃmainº¯ÊýÔÚIDEÀïÃæÆô¶¯Õâ¸öÓ¦Óã¬Ò²¿ÉÒÔ´ò°üºóÓÃÃüÁîÐÐÆô¶¯¡£µ±È»Ò²¿ÉÒÔ°Ñ´ò°üµÄwar°üÓÃTomcatÖ®ÀàµÄ·þÎñÆ÷Æô¶¯¡£
ʹÓñêÇ©@EnableEurekaServer£¬¾ÍÄÜÔÚÆô¶¯¹ý³ÌÖÐÆô¶¯Eureka·þÎñ×¢²áÖÐÐĵÄ×é¼þ¡£Ëü»á¼àÌýÒ»¸ö¶Ë¿Ú£¬Ä¬ÈÏÊÇ8761£¬À´½ÓÊÕ·þÎñ×¢²á¡£²¢Ìṩһ¸öWebÒ³Ãæ£¬´ò¿ªÒԺ󣬿ÉÒÔ¿´µ½×¢²áµÄ·þÎñ¡£
Ìí¼Ó@EnableHystrixDashboard¾Í»áÌṩһ¸ö¼à¿ØµÄÒ³Ãæ£¬ÎÒÃÇ¿ÉÒÔÔÚÉÏÃæÊäÈëÒª¼à¿ØµÄ·þÎñµÄµØÖ·£¬¾Í¿ÉÒԲ鿴ÆôÓÃÁËHystrix¼à¿ØµÄ½Ó¿ÚµÄµ÷ÓÃÇé¿ö¡£
µ±È»£¬ÎªÁËʹÓÃÉÏÃæµÄ×é¼þ£¬ÎÒÃÇÐèÒªÔÚMavenµÄPOMÎļþÀïÌí¼ÓÏàÓ¦µÄÒÀÀµ£¬±ÈÈçʹÓÃspring-boot-starter-parent£¬ÒÀÀµspring-cloud-starter-eureka-serverºÍspring-cloud-starter-hystrix-dashboardµÈ¡£
·þÎñ¼äµ÷ÓÃ
ÔÚÍøÉϵĸ÷ÖÖÎĵµÖУ¬¶Ô·þÎñ¼äµ÷Ó㬶¼Ã»ÓÐ˵Ã÷µÄºÜÇå³þ£¬ËùÒÔÕâÀïÌØ±ð˵Ã÷Ò»ÏÂÕâ¸öÈçºÎ¿ª·¢¡£
ÓÐÁ½ÖÖ·½Ê½¿ÉÒÔ½øÐзþÎñµ÷Óã¬RestTemplateºÍFeignClient¡£²»¹ÜÊÇʲô·½Ê½£¬Ëû¶¼ÊÇͨ¹ýREST½Ó¿Úµ÷Ó÷þÎñµÄhttp½Ó¿Ú£¬²ÎÊýºÍ½á¹ûĬÈ϶¼ÊÇͨ¹ýJacksonÐòÁл¯ºÍ·´ÐòÁл¯¡£ÒòΪSpring
MVCµÄRestController¶¨ÒåµÄ½Ó¿Ú£¬·µ»ØµÄÊý¾Ý¶¼ÊÇͨ¹ýJacksonÐòÁл¯³ÉJSONÊý¾Ý¡£
RestTemplate
ʹÓÃÕâÖÖ·½Ê½£¬Ö»ÐèÒª¶¨ÒåÒ»¸öRestTemplateµÄBean£¬ÉèÖóÉLoadBalanced¼´¿É£º
@Configuration public class SomeCloudConfiguration { @LoadBalanced @Bean RestTemplate restTemplate() { return new RestTemplate(); } } |
ÕâÑùÎÒÃǾͿÉÒÔÔÚÐèÒªÓõĵط½×¢ÈëÕâ¸öbeanʹÓãº
public class SomeServiceClass { @Autowired private RestTemplate restTemplate; public String getUserById(Long userId) { UserDTO results = restTemplate.getForObject ("http://users/getUserDetail/" + userId, UserDTO.class); return results; } } |
ÆäÖУ¬usersÊÇ·þÎñID£¬Ribbon»á´Ó·þÎñʵÀýÁбí»ñµÃÕâ¸ö·þÎñµÄÒ»¸öʵÀý£¬·¢ËÍÇëÇ󣬲¢»ñµÃ½á¹û¡£¶ÔÏóUserDTOÐèÒªÐòÁкţ¬ËüµÄ·´ÐòÁкŻá×Ô¶¯Íê³É¡£
FeignClient
³ýÁËÉÏÃæµÄ·½Ê½£¬ÎÒÃÇ»¹¿ÉÒÔÓÃFeignClient¡£»¹ÊÇÖ±½Ó¿´´úÂ룺
@FeignClient(value = "users", path = "/users") public interface UserCompositeService { @RequestMapping(value = "/getUserDetail/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) UserDTO getUserById(@PathVariable Long id); } |
ÎÒÃÇÖ»ÐèҪʹÓÃ@FeignClient¶¨ÒåÒ»¸ö½Ó¿Ú£¬Spring Cloud Feign»á°ïÎÒÃÇÉú³ÉÒ»¸öËüµÄʵÏÖ£¬´ÓÏàÓ¦µÄusers·þÎñ»ñÈ¡Êý¾Ý¡£
ÆäÖУ¬@FeignClient(value = "users", path
= "/users/getUserDetail")ÀïÃæµÄvalueÊÇ·þÎñID£¬pathÊÇÕâÒ»×é½Ó¿ÚµÄpathǰ׺¡£
ÔÚÏÂÃæµÄ·½·¨¶¨ÒåÀ¾ÍºÃÏñÉèÖÃSpring MVCµÄ½Ó¿ÚÒ»Ñù£¬¶ÔÓÚÕâ¸ö·½·¨£¬Ëü¶ÔÓ¦µÄURLÊÇ/users/getUserDetail/{id}¡£
È»ºó£¬ÔÚʹÓÃËüµÄʱºò£¬¾ÍÏñ×¢ÈëÒ»¸öÒ»°ãµÄ·þÎñÒ»Ñù×¢ÈëºóʹÓü´¿É£º
public class SomeOtherServiceClass { @Autowired private UserCompositeService userService; public void doSomething() { // ..... UserDTO results = userService.getUserById(userId); // other operation... } } |
Óöµ½µÄÎÊÌâ
ÓÉÓÚSpring Cloud˵Ã÷Îĵµ½ÏÉÙ£¬Î¢·þÎñµÄ¼Ü¹¹Ïà¶ÔÀ´ËµÒ²±È½Ï¸´ÔÓ£¬ÔÚ¿ª·¢µÄʱºò£¬ÄÑÃâ»áÓöµ½ºÜ¶àÎÊÌ⣬ÓÐһЩÊÇÈçºÎ¸üºÃµØÊ¹ÓÃÕâÌ׿ò¼ÜÈ¥´î½¨¼Ü¹¹£¬Ò²ÓÐһЩÎÊÌâÊÇÈçºÎÅäÖá£ÕâÀï¾ÍһЩÎÒÔڴ΢·þÎñ¼Ü¹¹µÄʱºòÓöµ½µÄÎÊÌâÌṩһЩ·½·¨¡£
ÇëÇó³¬Ê±ÎÊÌâ
ZuulÍø¹ØÄ¬Èϵij¬Ê±Ê±¼ä·Ç³£¶Ì£¬ÕâÊÇΪÁ˱£Ö¤µ÷Ó÷þÎñµÄʱºòÄܹ»ºÜ¿ìµÄÏìÓ¦¡£µ«ÊÇ£¬ÎÒÃÇ»áÓÐһЩҵÎñ·½·¨ÔËÐеÄʱ¼ä±È½Ï³¤£¬ÌرðÊÇÔÚ²âÊÔ·þÎñÆ÷¡£Õâʱºò£¬¾ÍÐèÒªµ÷Õû³¬Ê±Ê±¼ä¡£Õâ¸ö³¬Ê±Óм¸¸öµØ·½£º
¸ºÔؾùºâRibbon£¬¸ºÔؾùºâÓÐÒ»¸ö³¬Ê±µÄÉèÖ㬰üÀ¨Á´½Óʱ¼äºÍ¶Áȡʱ¼ä
Hystrix¶Ï·Æ÷Ò²ÓÐÒ»¸ö³¬Ê±ÉèÖã¬ËüÐèÒªÔÚÊʵ±µÄʱºò·µ»Ø£¬¶ø²»ÊÇÒ»Ö±µÈÔÚÒ»¸öÇëÇóÉÏ¡£
¶ÔÓ¦µÄÅäÖÃÈçÏ£º
hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds = 30000 ribbon: ReadTimeout: 30000 ConnectTimeout: 15000 |
·þÎñIDµÄÎÊÌâ
·þÎñµÄID£¬Ò²¾ÍÊÇ·þÎñÃû£¬¿ÉÒÔͨ¹ýÔÚapplication.yml»òÕßBootstrap.ymlÀïÃæÉèÖãº
spring: application: name: users |
¹ÜÀí·¾¶µÄÎÊÌâ
Spring BootµÄÓ¦ÓÃĬÈ϶¼ÊÇ¿ª·ÅһЩ¹ÜÀíµÄ½Ó¿Ú£¬Èç/info¡¢/healthºÍmetrics¼à¿ØµÄ½Ó¿Ú/metricsµÈ¡£Èç¹ûÄãʹÓÃĬÈϵÄ·¾¶£¬Ê¹ÓÃHystrix¼à¿Ø¡¢·þÎñ×¢²áÖÐÐĵļàÌý·þÎñ״̬¶¼²»»áÓÐÎÊÌ⣬µ«ÊÇ£¬Èç¹ûÄãÏëʹÓñðµÄ·¾¶£¬ÀýÈç/management/info¡¢/management/health£¬ÄǾÍÇ£³¶µ½ºÜ¶àµØ·½£¬¶øÇÒ£¬Ã¿¸ö°æ±¾¿ÉÄÜ»á»ò¶à»òÉÙµÄÓÐһЩÎÊÌ⣬µ¼ÖÂÄãÓöµ½µÄÎÊÌ⻹»á²»Ò»Ñù¡£ÎÒÓöµ½¹ýµÄÎÊÌâÓУº
×¢²á³É¹¦È´ÕÒ²»µ½·þÎñ
Ê×ÏÈ£¬×¢²á¿ÉÒԳɹ¦£¬ÔÚEureka·þÎñÆ÷Ò³ÃæÉÏÒ²¿ÉÒÔ¿´µ½¸÷¸ö·þÎñ¡£µ«ÊÇ£¬µ±Äãͨ¹ýÍø¹Øµ÷ÓõÄʱºò£¬È´×ÜÊÇÌáʾ·þÎñÕÒ²»µ½¡£Õâʱºò¿ÉÄܾÍÐèÒªÔÚÿ¸ö·þÎñµÄapplication.ymlÀïÃæ½øÐÐÈçÏÂÅäÖãº
eureka: instance: nonSecurePort: ${server.port} appname: ${spring.application.name} statusPageUrlPath: ${management.context-path}/info healthCheckUrlPath: ${management.context-path}/health |
¼òµ¥À´Ëµ£¬Õâ¾ÍÊǸæËßÔÚ×¢²áµÄʱºò£¬Í¬Ê±¸æËßEureka·þÎñÆ÷£¬·þÎñµÄ¶Ë¿ÚÊÇʲô£¬ÓÃÀ´¼àÌý״̬µÄ·¾¶ÊÇʲô¡£ÕâÊÇÒòΪÎÒÃÇʹÓÃÁ˲»Í¬µÄ¹ÜÀí½Ó¿Ú·¾¶£¬¶øEureka·þÎñÆ÷ûÓÐʹÓÃÏàÓ¦µÄ·¾¶¡£
Èç¹ûÒ»ÇÐÕý³££¬ÄãÔÚEureka·þÎñÆ÷Éϵã»÷Ò»¸ö×¢²áµÄ·þÎñ£¬Ó¦¸ÃÄÜ´ò¿ªÒ»¸öinfoÒ³Ãæ¡£Ëû¿ÉÄÜÊǿհ׵쬵«ÊÇ£¬ÖÁÉÙEureka·þÎñÆ÷ÄÜͨ¹ýÕâ¸öÖªµÀ·þÎñµÄÔËÐÐÕý³£¡£
Õâ¸öÎÊÌâÒ²²»ÊÇÔÚËùÓеİ汾¶¼´æÔÚ£¬Ö»ÊÇÔÚijһЩSpring CloudµÄ°æ±¾´æÔÚ¡£
ÉèÖÃÁ˹ÜÀí·¾¶µÄHystrix¼à¿Ø
¸Õ²Å˵ÁËHystrix¼à¿ØµÄ·¾¶ÊÇhttp://serviceIp:port/hystrix.stream£¬Èç¹ûÄãÉèÖÃÁ˹ÜÀí½Ó¿ÚµÄ·¾¶£¬ÄÇôÕâ¸ö¼à¿ØÂ·¾¶Ò²»á±ä³É£º
http://serviceIp:port/${management.context-path}/hystrix.stream |
Èç¹ûÕâʱºò£¬ÄãÔÙÏëʹÓÃTurbine¾ÛºÏ£¬Turbine¾Í»áÕÒ²»µ½ÁË£¬ÒòΪËüĬÈÏʹÓÃEureka·þÎñÆ÷ÉϵķþÎñÆ÷µØÖ·ºÍ¶Ë¿Ú£¬ÔÚºóÃæÌí¼Ó/hystrix.stream¡£Õâʱºò£¬Äã¾ÍÐèÒªÉèÖÃTurbine£º
turbine: aggregator: clusterConfig: USER appConfig: USER instanceUrlSuffix: USER: /user/hystrix.stream |
¹ÜÀí·¾¶µÄ°²È«ÐÔ
¶ÔÓÚ΢·þÎñ²¿ÊðµÄ¼¸Ì¨»úÆ÷£¬¿ÉÒÔͨ¹ý¿ªÍ¨·À»ðǽÀ´¿ØÖÆË¿ÉÒÔ·ÃÎʹÜÀí½Ó¿Ú£¬µ«ÊÇ£¬¼´Ê¹ÊÇÕâÑù£¬ÎªÁ˰²È«ÐԵȣ¬ÎÒÒ»°ã»¹ÊÇ»á°Ñ¹ÜÀí¶Ë½Ó¿ÚÒ²ÓÃSpring
SecurityÀ´±£»¤¡£ÕâÑùÒ»À´£¬¼à¿Ø½Ó¿Ú¾Íû·¨Ö±½Ó·ÃÎÊÁË¡£
·þÎñ¼äµ÷ÓõÄȨÏÞÑéÖ¤
Ò»°ãÎÒÃǵÄAPI½Ó¿Ú¶¼ÐèҪijÖÖÊÚȨ²ÅÄÜ·ÃÎÊ£¬µÇ½³É¹¦ÒÔºó£¬È»ºóͨ¹ýtoken»òÕßcookieµÈ·½Ê½²ÅÄܵ÷Óýӿڡ£
ʹÓÃSpring Cloud Netfix¿ò¼ÜµÄ»°£¬µÇ¼µÄʱºò£¬°ÑµÇ¼ÇëÇóת·¢µ½ÏàÓ¦µÄÓû§·þÎñÉÏ£¬µÇ½³É¹¦ºó£¬»áÉèÖÃcookie»òheader
tokenµÈ¡£È»ºó¿Í»§¶Ë½ÓÏÂÀ´µÄÇëÇó¾Í»á´ø×ÅÕâЩÑéÖ¤ÐÅÏ¢£¬´ÓZuulÍø¹Ø´«µ½ÏàÓ¦µÄ·þÎñÉϽøÐÐÑéÖ¤¡£
ZuulÍø¹ØÔÚ°ÑÇëÇóת·¢µ½ºǫ́µÄ·þÎñµÄʱºò£¬»áĬÈϰÑһЩheader´«µ½·þÎñ¶Ë£¬È磺Cookie¡¢Set-Cookie¡¢Authorization¡£ÕâÑù£¬¿Í»§¶ËÇëÇóµÄÏà¹Øheaders¾Í¿ÉÒÔ´«µÝµ½·þÎñ¶Ë£¬·þÎñ¶ËÉèÖõÄcookieÒ²¿ÉÒÔ´«µ½¿Í»§¶Ë¡£
µ«ÊÇ£¬Èç¹ûÄãÏë½ûֹijЩheader͸´«µ½·þÎñ¶Ë£¬¿ÉÒÔÔÚZuulÍø¹ØµÄapplication.ymlÅäÖÃÀïͨ¹ýÏÂÃæµÄ·½Ê½½ûÓãº
zuul: routes: users: path: /users/** sensitiveHeaders: Cookie,Set-Cookie,Authorization serviceId: user |
¸Õ²Å˵ÁËÎÒÃǵÄij¸ö·þÎñÓÐʱºòÐèÒªµ÷ÓÃÁíÒ»¸ö·þÎñ£¬Õâʱºò£¬Õâ¸öÇëÇó²»Êǿͻ§¶Ë·¢Æð£¬ËûµÄÇëÇóµÄheaderÀïÃæÒ²²»»áÓÐÈκÎÑéÖ¤ÐÅÏ¢¡£Õâʱºò£¬ÒªÃ´£¬Í¨¹ý·À»ðǽµÈÉèÖ㬱£Ö¤·þÎñ¼äµ÷ÓõĽӿڣ¬Ö»ÄÜij¼¸¸öµØÖ··ÃÎÊ£»ÒªÃ´£¬¾Íͨ¹ýijÖÖ·½Ê½ÉèÖÃheader¡£
ͬʱ£¬Èç¹ûÄãÏëÔÚij¸ö·þÎñÀïÃæ»ñµÃÕâ¸öÇëÇóµÄÕæÊÇIP£¬£¨ÒòΪÇëÇóµÄͨ¹ýÍø¹Ø×ª·¢¶øÀ´£¬ÄãÖ±½Óͨ¹ýrequest»ñµÃipµÃµ½µÄÊÇÍø¹ØµÄIP£©£¬¾Í¿ÉÒÔ´ÓheaderX-Forwarded-Host»ñµÃ¡£Èç¹ûÏë½ûÓÃÕâ¸öheader£¬Ò²¿ÉÒÔ£º
zuul.addProxyHeaders = false |
Èç¹ûÄãʹÓÃRestTemplateµÄ·½Ê½µ÷Ó㬿ÉÒÔÔÚÇëÇóÀïÃæÌí¼ÓÒ»¸öÓÐheaderµÄOptions¡£
Ò²¿ÉÒÔͨ¹ýÈçϵÄÀ¹½ØÆ÷µÄ·½Ê½ÉèÖã¬Ëü¶ÔRestTemplate·½Ê½ºÍFeignClientµÄ·½Ê½¶¼¿ÉÒÔÆð×÷Óãº
@Bean public RequestInterceptor requestInterceptor() { return new RequestInterceptor() { @Override public void apply(RequestTemplate template) { String authToken = getToken(); template.header(AUTH_TOKEN_HEADER, authToken); } }; } |
|