±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚcsdn£¬ÎÄÕÂÖ÷Òª½éÉÜÁËSpring
Cloud Sleuth£¬ZipkinºÍ°¸Àýʵս£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
|
|
΢·þÎñ¼Ü¹¹ÊÇÒ»¸ö·Ö²¼Ê½¼Ü¹¹£¬Î¢·þÎñϵͳ°´ÒµÎñ»®·Ö·þÎñµ¥Ôª£¬Ò»¸ö΢·þÎñϵͳÍùÍùÓкܶà¸ö·þÎñµ¥Ôª¡£ÓÉÓÚ·þÎñµ¥ÔªÊýÁ¿Öڶ࣬ҵÎñµÄ¸´ÔÓÐԽϸߣ¬
Èç¹û³öÏÖÁË´íÎóºÍÒì³££¬ºÜÄÑÈ¥¶¨Î»¡£Ö÷ÒªÌåÏÖÔÚÒ»¸öÇëÇó¿ÉÄÜÐèÒªµ÷Óúܶà¸ö·þÎñ£¬¶øÄÚ²¿·þÎñµÄµ÷Óø´ÔÓÐÔ¾ö¶¨ÁËÎÊÌâÄÑÒÔ¶¨Î»¡£ËùÒÔÔÚ΢·þÎñ¼Ü¹¹ÖУ¬±ØÐëʵÏÖ·Ö²¼Ê½Á´Â·×·×Ù£¬È¥¸ú½øÒ»¸öÇëÇóµ½µ×ÓÐÄÄЩ·þÎñ²ÎÓ룬
²ÎÓëµÄ˳ÐòÓÖÊÇÔõÑùµÄ£¬´Ó¶ø´ïµ½Ã¿¸öÇëÇóµÄ²½ÖèÇåÎú¿É¼û£¬³öÁËÎÊÌâÄܹ»¿ìËÙ¶¨Î»µÄÄ¿µÄ¡£

ÔÚ΢·þÎñϵͳÖУ¬Ò»¸öÀ´×ÔÓû§µÄÇëÇóÏȵ½´ïǰ¶ËA£¨Èçǰ¶Ë½çÃæ£©£¬È»ºóͨ¹ýÔ¶³Ìµ÷Ó㬵½´ïϵͳµÄÖмä¼þB¡¢C£¨Èç¸ºÔØ¾ùºâ¡¢Íø¹ØµÈ£©£¬
×îºóµ½´ïºó¶Ë·þÎñD¡¢E£¬ºó¶Ë¾¹ýһϵÁеÄÒµÎñÂß¼¼ÆË㣬×îºó½«Êý¾Ý·µ»Ø¸øÓû§¡£¶ÔÓÚÕâÑùÒ»¸öÇëÇ󣬾ÀúÁËÕâô¶à¸ö·þÎñ£¬ÔõôÑù½«ËüµÄÇëÇó¹ý³ÌÓÃÊý¾Ý¼Ç¼ÏÂÀ´ÄØ£¿Õâ¾ÍÐèÒªÓõ½·þÎñÁ´Â·×·×Ù¡£
Spring Cloud Sleuth
Spring Cloud Sleuth Ϊ·þÎñÖ®¼äµ÷ÓÃÌṩÁ´Â·×·×Ù¡£Í¨¹ý Sleuth ¿ÉÒÔºÜÇå³þµÄÁ˽⵽һ¸ö·þÎñÇëÇó¾¹ýÁËÄÄЩ·þÎñ£¬
ÿ¸ö·þÎñ´¦Àí»¨·ÑÁ˶೤¡£´Ó¶øÈÃÎÒÃÇ¿ÉÒԺܷ½±ãµÄÀíÇå¸÷΢·þÎñ¼äµÄµ÷ÓùØÏµ¡£´ËÍâ Sleuth ¿ÉÒÔ°ïÖúÎÒÃÇ£º
ºÄʱ·ÖÎö: ͨ¹ý Sleuth ¿ÉÒԺܷ½±ãµÄÁ˽⵽ÿ¸ö²ÉÑùÇëÇóµÄºÄʱ£¬´Ó¶ø·ÖÎö³öÄÄЩ·þÎñµ÷ÓñȽϺÄʱ;
¿ÉÊÓ»¯´íÎó: ¶ÔÓÚ³ÌÐòδ²¶×½µÄÒì³££¬¿ÉÒÔͨ¹ý¼¯³É Zipkin ·þÎñ½çÃæÉÏ¿´µ½;
Á´Â·ÓÅ»¯: ¶ÔÓÚµ÷ÓÃ±È½ÏÆµ·±µÄ·þÎñ£¬¿ÉÒÔÕë¶ÔÕâЩ·þÎñʵʩһЩÓÅ»¯´ëÊ©¡£
Google¿ªÔ´ÁËDapperÁ´Â·×·×Ù×é¼þ£¬²¢ÔÚ2010Äê·¢±íÁËÂÛÎÄ¡¶Dapper, a Large-Scale Distributed
Systems Tracing Infrastructure¡·£¬ ÕâÆªÂÛÎÄÊÇÒµÄÚʵÏÖÁ´Â·×·×ٵıê¸ËºÍÀíÂÛ»ù´¡£¬¾ßÓкܸߵIJο¼¼ÛÖµ¡£

Spring Cloud Sleuth²ÉÓÃÁËGoogleµÄ¿ªÔ´ÏîÄ¿DapperµÄרҵÊõÓï¡£
Span£º»ù±¾¹¤×÷µ¥Ôª£¬·¢ËÍÒ»¸öÔ¶³Ìµ÷¶ÈÈÎÎñ¾Í»á²úÉúÒ»¸öSpan£¬SpanÊÇÓÃÒ»¸ö64λIDΨһ±êʶµÄ£¬TraceÊÇÓÃÁíÒ»¸ö64λIDΨһ±êʶµÄ¡£
Span»¹°üº¬ÁËÆäËûµÄÐÅÏ¢£¬ÀýÈçÕªÒª¡¢Ê±¼ä´Áʼþ¡¢SpanµÄIDÒÔ¼°½ø³ÌID¡£
Trace£ºÓÉһϵÁÐSpan×é³ÉµÄ£¬³ÊÊ÷×´½á¹¹¡£ÇëÇóÒ»¸ö΢·þÎñϵͳµÄAPI½Ó¿Ú£¬Õâ¸öAPI½Ó¿ÚÐèÒªµ÷Óöà¸ö΢·þÎñµ¥Ôª£¬
µ÷ÓÃÿ¸ö΢·þÎñµ¥Ôª¶¼»á²úÉúÒ»¸öеÄSpan£¬ËùÓÐÓÉÕâ¸öÇëÇó²úÉúµÄSpan×é³ÉÁËÕâ¸öTrace¡£
Annotation£ºÓÃÓڼǼһ¸öʼþ£¬Ò»Ð©ºËÐÄ×¢½âÓÃÓÚ¶¨ÒåÒ»¸öÇëÇóµÄ¿ªÊ¼ºÍ½áÊø£¬ÕâЩע½âÈçÏ¡£
cs-Client Sent£º¿Í»§¶Ë·¢ËÍÒ»¸öÇëÇó£¬Õâ¸ö×¢½âÃèÊöÁËSpanµÄ¿ªÊ¼¡£
sr-Server Received£º·þÎñ¶Ë»ñµÃÇëÇó²¢×¼±¸¿ªÊ¼´¦ÀíËü£¬Èç¹û½«Æäsr¼õÈ¥csʱ¼ä´Á£¬±ã¿ÉµÃµ½ÍøÂç´«ÊäµÄʱ¼ä¡£
ss-Server Sent£º·þÎñ¶Ë·¢ËÍÏìÓ¦£¬¸Ã×¢½â±íÃ÷ÇëÇó´¦ÀíµÄÍê³É£¨µ±ÇëÇ󷵻ؿͻ§¶Ë£©£¬ÓÃssµÄʱ¼ä´Á¼õÈ¥srʱ¼ä´Á£¬
±ã¿ÉÒԵõ½·þÎñÆ÷ÇëÇóµÄʱ¼ä¡£
cr-Client Received£º¿Í»§¶Ë½ÓÊÕÏìÓ¦£¬´ËʱSpan½áÊø£¬Èç¹ûcrµÄʱ¼ä´Á¼õÈ¥csʱ¼ä´Á£¬±ã¿ÉÒԵõ½Õû¸öÇëÇóËùÏûºÄµÄʱ¼ä¡£
Spring Cloud Sleuth ҲΪÎÒÃÇÌṩÁËÒ»Ì×ÍêÕûµÄÁ´Â·½â¾ö·½°¸,Spring Cloud Sleuth ¿ÉÒÔ½áºÏ
Zipkin£¬½«ÐÅÏ¢·¢Ë͵½ Zipkin£¬ ÀûÓà Zipkin µÄ´æ´¢À´´æ´¢Á´Â·ÐÅÏ¢£¬ÀûÓà Zipkin
UI À´Õ¹Ê¾Êý¾Ý¡£
Zipkin
ZipkinÊÇÒ»ÖÖ·Ö²¼Ê½Á´Â·×·×Ùϵͳ¡£ ËüÓÐÖúÓÚÊÕ¼¯½â¾ö΢·þÎñ¼Ü¹¹ÖеÄÑÓ³ÙÎÊÌâËùÐèµÄʱÐòÊý¾Ý¡£ Ëü¹ÜÀíÕâЩÊý¾ÝµÄÊÕ¼¯ºÍ²éÕÒ¡£
ZipkinµÄÉè¼Æ»ùÓÚGoogle DapperÂÛÎÄ¡£
¸ú×ÙÆ÷´æÔÚÓÚÓ¦ÓóÌÐòÖУ¬¼Ç¼ÇëÇóµ÷ÓõÄʱ¼äºÍÔªÊý¾Ý¡£¸ú×ÙÆ÷ʹÓÿ⣬ËüÃǵÄʹÓöÔÓû§ÊÇÎÞ¸ÐÖªµÄ¡£ÀýÈ磬 Web·þÎñÆ÷»áÔÚÊÕµ½ÇëÇóʱºÍ·¢ËÍÏìӦʱ»á¼Ç¼ÏàÓ¦µÄʱ¼äºÍһЩԪÊý¾Ý¡£Ò»´ÎÍêÕûÁ´Â·ÇëÇóËùÊÕ¼¯µÄÊý¾Ý±»³ÆÎªSpan¡£
ÎÒÃÇ¿ÉÒÔʹÓÃËüÀ´ÊÕ¼¯¸÷¸ö·þÎñÆ÷ÉÏÇëÇóÁ´Â·µÄ¸ú×ÙÊý¾Ý£¬²¢Í¨¹ýËüÌṩµÄ
REST API ½Ó¿ÚÀ´¸¨ÖúÎÒÃDzéѯ¸ú×ÙÊý¾ÝÒÔʵÏÖ¶Ô·Ö²¼Ê½ÏµÍ³µÄ¼à¿Ø³ÌÐò£¬ ´Ó¶ø¼°Ê±µØ·¢ÏÖϵͳÖгöÏÖµÄÑÓ³ÙÉý¸ßÎÊÌâ²¢ÕÒ³öϵͳÐÔÄÜÆ¿¾±µÄ¸ùÔ´¡£³ýÁËÃæÏò¿ª·¢µÄ
API ½Ó¿ÚÖ®Í⣬ËüÒ²ÌṩÁË·½±ãµÄ UI ×é¼þÀ´°ïÖúÎÒÃÇÖ±¹ÛµÄËÑË÷¸ú×ÙÐÅÏ¢ºÍ·ÖÎöÇëÇóÁ´Â·Ã÷ϸ£¬ ±ÈÈ磺¿ÉÒÔ²éѯij¶Îʱ¼äÄÚ¸÷Óû§ÇëÇóµÄ´¦Àíʱ¼äµÈ¡£
Zipkin ÌṩÁ˿ɲå°ÎÊý¾Ý´æ´¢·½Ê½£ºIn-Memory¡¢MySql¡¢Cassandra ÒÔ¼° Elasticsearch¡£½ÓÏÂÀ´µÄ²âÊÔΪ·½±ãÖ±½Ó²ÉÓÃ
In-Memory ·½Ê½½øÐд洢£¬Éú²úÍÆ¼ö Elasticsearch.

ÉÏͼչʾÁË Zipkin µÄ»ù´¡¼Ü¹¹£¬ËüÖ÷ÒªÓÉ 4 ¸öºËÐÄ×é¼þ¹¹³É£º
Collector£ºÊÕ¼¯Æ÷×é¼þ£¬ËüÖ÷ÒªÓÃÓÚ´¦Àí´ÓÍⲿϵͳ·¢Ë͹ýÀ´µÄ¸ú×ÙÐÅÏ¢£¬ ½«ÕâЩÐÅϢת»»Îª Zipkin ÄÚ²¿´¦ÀíµÄ
Span ¸ñʽ£¬ÒÔÖ§³ÖºóÐøµÄ´æ´¢¡¢·ÖÎö¡¢Õ¹Ê¾µÈ¹¦ÄÜ¡£
Storage£º´æ´¢×é¼þ£¬ËüÖ÷Òª¶Ô´¦ÀíÊÕ¼¯Æ÷½ÓÊÕµ½µÄ¸ú×ÙÐÅÏ¢£¬Ä¬ÈϻὫÕâЩÐÅÏ¢´æ´¢ÔÚÄÚ´æÖУ¬ ÎÒÃÇÒ²¿ÉÒÔÐ޸Ĵ˴洢²ßÂÔ£¬Í¨¹ýʹÓÃÆäËû´æ´¢×é¼þ½«¸ú×ÙÐÅÏ¢´æ´¢µ½Êý¾Ý¿âÖС£
RESTful API£ºAPI ×é¼þ£¬ËüÖ÷ÒªÓÃÀ´ÌṩÍⲿ·ÃÎʽӿڡ£±ÈÈç¸ø¿Í»§¶Ëչʾ¸ú×ÙÐÅÏ¢£¬ »òÊÇÍâ½Óϵͳ·ÃÎÊÒÔʵÏÖ¼à¿ØµÈ¡£
Web UI£ºUI ×é¼þ£¬»ùÓÚ API ×é¼þʵÏÖµÄÉϲãÓ¦Óá£Í¨¹ý UI ×é¼þÓû§¿ÉÒÔ·½±ã¶øÓÐÖ±¹ÛµØ²éѯºÍ·ÖÎö¸ú×ÙÐÅÏ¢¡£
°¸Àýʵս
ÔÚ±¾°¸ÀýÒ»¹²ÓÐÈý¸öÓ¦Ó㬷ֱðΪע²áÖÐÐÄ£¬eureka-server¡¢eureka-client¡¢eureka-client-feign£¬ Èý¸öÓ¦ÓõĻù±¾ÐÅÏ¢ÈçÏ£º
Ó¦ÓÃÃû |
¶Ë¿Ú |
×÷ÓÃ |
eureka-server |
8761 |
×¢²áÖÐÐÄ |
eureka-client |
8763 |
·þÎñÌṩÕß |
eureka-client-feign |
8765 |
·þÎñÏû·ÑÕß |
ÆäÖÐeureka-server Ó¦ÓÃΪע²áÖÐÐÄ£¬ÆäËûÁ½¸öÓ¦ÓÃÏòËü×¢²á¡£eureka-clientΪ·þÎñÌṩÕߣ¬ÌṩÁËÒ»¸öRESTAPI,eureka-client-feignΪ·þÎñÏû·ÑÕߣ¬
ͨ¹ýFeign ClientÏò·þÎñÌṩÕßÏû·Ñ·þÎñ¡£ ÔÚ֮ǰµÄÎÄÕÂÒѾ½²ÊöÁËÈçºÎÈçºÎ´î½¨·þÎñ×¢²áÖÐÐÄ£¬ÔÚÕâÀï¾ÍÊ¡ÂÔÕâÒ»²¿·ÖÄÚÈÝ¡£·þÎñÌṩÕßÌṩһ¸öREST½Ó¿Ú£¬·þÎñÏû·ÑÕßͨ¹ýFeignClientÏû·Ñ·þÎñ¡£
·þÎñÌṩÕß eureka-client·þÎñÌṩÕߣ¬¶ÔÍâÌṩһ¸öRESTAPI£¬²¢Ïò·þÎñ×¢²áÖÐÐÄ×¢²á£¬Õⲿ·ÖÄÚÈÝ£¬²»ÔÙ½²Êö£¬¼ûÔ´Âë¡£ÐèÒªÔÚ¹¤³ÌµÄpomÎļþ¼ÓÉÏsleuthµÄÆð²½ÒÀÀµºÍzipkinµÄÆð²½ÒÀÀµ£¬´úÂëÈçÏ£º
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency> <groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency> |
ÔÚ¹¤³ÌµÄÅäÖÃÎļþapplication.ymlÐèÒª×öÒÔϵÄÅäÖãº
spring:
sleuth:
web:
client:
enabled: true
sampler:
probability: 1.0 # ½«²ÉÑù±ÈÀýÉèÖÃΪ 1.0£¬Ò²¾ÍÊÇÈ«²¿¶¼ÐèÒª¡£Ä¬ÈÏÊÇ 0.1
zipkin:
base-url: http://localhost:9411/ # Ö¸¶¨ÁË Zipkin
·þÎñÆ÷µÄµØÖ· |
ÆäÖÐspring.sleuth.web.client.enableΪtrueÉèÖõÄÊÇweb¿ªÆôsleuth¹¦ÄÜ;spring.sleuth.sampler.probability¿ÉÒÔÉèÖÃΪСÊý£¬
×î´óֵΪ1.0£¬µ±ÉèÖÃΪ1.0ʱ¾ÍÊÇÁ´Â·Êý¾Ý100%ÊÕ¼¯µ½zipkin-server£¬µ±ÉèÖÃΪ0.1ʱ£¬¼´10%¸ÅÂÊÊÕ¼¯Á´Â·Êý¾Ý;spring.zipkin.base-urlÉèÖÃzipkin-serverµÄµØÖ·¡£
¶ÔÍâÌṩһ¸öApi£¬´úÂëÈçÏ£º
@RestController
public class HiController {
@Value("${server.port}")
String port;
@GetMapping("/hi")
public String home(@RequestParam String name)
{
return "hi "+name+",i am from
port:" +port;
}
} |
·þÎñÏû·ÑÕß
·þÎñÏû·ÑÕßͨ¹ýFeignClientÏû·Ñ·þÎñÌṩÕßÌṩµÄ·þÎñ¡£Í¬·þÎñÌṩÕßÒ»Ñù£¬ÐèÒªÔÚ¹¤³ÌµÄpomÎļþ¼ÓÉÏsleuthµÄÆð²½ÒÀÀµºÍzipkinµÄÆð²½ÒÀÀµ£¬
ÁíÍâÒ²ÐèÒªÔÚÅäÖÃÎļþapplication.yml×öÏà¹ØµÄÅäÖ㬾ßÌåͬ·þÎñÌṩÕß¡£
·þÎñÏû·ÑÕßͨ¹ýfeignClient½øÐзþÎñÏû·Ñ£¬feignclient´úÂëÈçÏ£º
@FeignClient(value
= "eureka-client",configuration = FeignConfig.class)
public interface EurekaClientFeign {
@GetMapping(value = "/hi")
String sayHiFromClientEureka(@RequestParam(value
= "name") String name);
}
|
servcie²ã´úÂëÈçÏ£º
@Service
public class HiService {
@Autowired
EurekaClientFeign eurekaClientFeign;
public String sayHi(String name){
return eurekaClientFeign.sayHiFromClientEureka(name);
}
} |
controller´úÂëÈçÏ£º
@RestController
public class HiController {
@Autowired
HiService hiService;
@GetMapping("/hi")
public String sayHi(@RequestParam( defaultValue
= "forezp",required = false)String
name){
return hiService.sayHi(name);
} |
ÉÏÃæµÄ´úÂë¶ÔÍⱩ¶һ¸öAPI£¬Í¨¹ýFeignClientµÄ·½Ê½µ÷ÓÃeureka-clientµÄ·þÎñ¡£
zipkin-server
ÔÚSpring Cloud D°æ±¾£¬zipkin-serverͨ¹ýÒýÈëÒÀÀµµÄ·½Ê½¹¹½¨¹¤³Ì£¬×Ô´ÓE°æ±¾Ö®ºó£¬ÕâÒ»·½Ê½¸Ä±äÁË£¬²ÉÓùٷ½µÄjarÐÎʽÆô¶¯£¬
ËùÒÔÐèҪͨ¹ýÏÂÔØ¹Ù·½µÄjarÀ´Æô¶¯£¬Ò²Í¨¹ýÒÔÏÂÃüÁîÒ»¼üÆô¶¯£º
curl -sSL https://zipkin.io/quickstart.sh
| bash -s
java -jar zipkin.jar |
ÉÏÃæµÄµÚÒ»ÐÐÃüÁî»á´Ózipkin¹ÙÍøÏÂÔØ¹Ù·½µÄjar°ü¡£ Èç¹ûÊÇwindowϵͳ£¬½¨ÒéʹÓÃgitbashÖ´ÐÐÉÏÃæµÄÃüÁî¡£ Èç¹ûÓà Docker µÄ»°£¬Ê¹ÓÃÒÔÏÂÃüÁ
docker run -d
-p 9411:9411 openzipkin/zipkin |
ͨ¹ýjava -jar zipkin.jarµÄ·½Ê½Æô¶¯Ö®ºó£¬ÔÚä¯ÀÀÆ÷ÉÏ·ÃÎÊlcoalhost:9411£¬ÏÔʾµÄ½çÃæÈçÏ£º

Á´Â·Êý¾ÝÑéÖ¤
ÒÀ´ÎÆô¶¯eureka-server£¬eureka-client,eureka-client-feignµÄÈý¸öÓ¦Ó㬵ÈËùÓÐÓ¦ÓÃÆô¶¯Íê³Éºó£¬ÔÚä¯ÀÀÆ÷ÉÏ·ÃÎÊhttp://localhost:8765/hi
£¨Èç¹û±¨´í£¬ÊÇ·þÎñÓë·¢ÏÖÐèÒªÒ»¶¨µÄʱ¼ä£¬ÄÍÐĵȴý¼¸Ê®Ã룩£¬·ÃÎʳɹ¦ºó£¬ÔÙ´ÎÔÚä¯ÀÀÆ÷ÉÏ·ÃÎÊzipkin-serverµÄÒ³Ãæ£¬ÏÔʾÈçÏ£º

´ÓÉÏͼ¿ÉÒÔ¿´³öÿ´ÎÇëÇóËùÏûºÄµÄʱ¼ä£¬ÒÔ¼°Ò»Ð©spanµÄÐÅÏ¢¡£

´ÓÉÏͼ¿ÉÒÔ¿´³ö¾ßÌåµÄ·þÎñÒÀÀµ¹ØÏµ£¬eureka-feign-clientÒÀÀµÁËeureka-client¡£
ʹÓÃrabbitmq½øÐÐÁ´Â·Êý¾ÝÊÕ¼¯
ÔÚÉÏÃæµÄ°¸ÀýÖÐʹÓõÄhttpÇëÇóµÄ·½Ê½½«Á´Â·Êý¾Ý·¢Ë͸øzipkin-server£¬Æäʵ»¹¿ÉÒÔʹÓÃrabbitmqµÄ·½Ê½½øÐзþÎñµÄÏû·Ñ¡£
ʹÓÃrabbitmqÐèÒª°²×°rabbitmq³ÌÐò£¬ÏÂÔØµØÖ·http://www.rabbitmq.com/¡£
ÏÂÔØÍê³Éºó£¬ÐèÒªeureka-clientºÍeureka-client-feignµÄÆð²½ÒÀÀµ¼ÓÉÏrabbitmqµÄÒÀÀµ£¬ÒÀÀµÈçÏ£º
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
</dependency> |
ÔÚÅäÖÃÎļþÉÏÐèÒªÅäÖÃrabbitmqµÄÅäÖã¬ÅäÖÃÐÅÏ¢ÈçÏ£º
spring:
rabbitmq:
host: localhost
username: guest
password: guest
port: 5672 |
ÁíÍâÐèÒª°Ñspring.zipkin.base-urlÈ¥µô¡£
ÔÚÉÏÃæ2¸ö¹¤³ÌÖУ¬rabbitmqͨ¹ý·¢ËÍÁ´Â·Êý¾Ý£¬ÄÇôzipkin-serverÊÇÔõôÑùÖªµÀrabbitmqµÄµØÖ·ÄØ£¬Ôõô¼àÌýÊÕµ½µÄÁ´Â·Êý¾ÝÄØ£¿
ÕâÐèÒªÔÚ³ÌÐòÆô¶¯µÄʱºò£¬Í¨¹ý»·¾³±äÁ¿µÄÐÎʽµ½»·¾³ÖУ¬È»ºózikin-server´Ó»·¾³±äÁ¿ÖжÁÈ¡¡£
¿ÉÅäÖõÄÊôÐÔÈçÏ£º

±ÈÈ磬ͨ¹ýÒÔÏÂÃüÁîÆô¶¯£º
RABBIT_ADDRESSES=localhost
java -jar zipkin.jar |
ÉÏÃæµÄÃüÁîµÈͬÓÚһϵÄÃüÁ
java -jar zipkin.jar
--zipkin.collector.rabbitmq.addressed=localhost |
ÓÃÉÏÃæµÄ2ÌõÃüÁîÖеÄÈκÎÒ»ÖÖ·½Ê½ÖØÐÂÆô¶¯zipkin-server³ÌÐò£¬²¢ÖØÐÂÆô¶¯eureka-client¡¢eureka-server¡¢eureka-client-feign£¬
¶¯Íê³ÉºóÔÚä¯ÀÀÆ÷ÉÏ·ÃÎÊhttp://localhost:8765/hi£¬ÔÙ·ÃÎÊhttp://localhost:9411/zipkin/£¬¾Í¿ÉÒÔ¿´µ½Í¨¹ýHttp·½Ê½·¢ËÍÁ´Â·Êý¾ÝÒ»ÑùµÄ½Ó¿Ú¡£
×Ô¶¨ÒåTag
ÔÚÒ³ÃæÉÏ¿ÉÒԲ鿴ÿ¸öÇëÇóµÄtraceId£¬Ã¿¸ötraceÓÖ°üº¬Èô¸ÉµÄspan£¬Ã¿¸öspanÓÖ°üº¬Á˺ܶàµÄtag£¬×Ô¶¨Òåtag¿ÉÒÔͨ¹ýTracerÕâ¸öÀàÀ´×Ô¶¨Òå¡£
@Autowired
Tracer tracer;
@GetMapping("/hi")
public String home(@RequestParam String name)
{
tracer.currentSpan().tag("name","forezp");
return "hi "+name+",i am from
port:" +port;
} |
½«Á´Â·Êý¾Ý´æ´¢ÔÚMysqlÊý¾Ý¿âÖÐ
ÉÏÃæµÄÀý×ÓÊǽ«Á´Â·Êý¾Ý´æÔÚÄÚ´æÖУ¬Ö»Òªzipkin-serverÖØÆôÖ®ºó£¬Ö®Ç°µÄÁ´Â·Êý¾ÝÈ«²¿²éÕÒ²»µ½ÁË£¬zipkinÊÇÖ§³Ö½«Á´Â·Êý¾Ý´æ´¢ÔÚmysql¡¢cassandra¡¢elasticsearchÖеġ£
ÏÖÔÚ½²½âÈçºÎ½«Á´Â·Êý¾Ý´æ´¢ÔÚMysqlÊý¾Ý¿âÖС£
Ê×ÏÈÐèÒª³õʼ»¯zikin´æ´¢ÔÚMysqlµÄÊý¾ÝµÄscheme£¬¿ÉÒÔÔÚÕâÀï²é¿´ https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql£¬¾ßÌåÈçÏ£º
CREATE TABLE
IF NOT EXISTS zipkin_spans (
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT
'If non zero, this means the trace uses 128 bit
traceIds instead of 64 bit',
`trace_id` BIGINT NOT NULL,
`id` BIGINT NOT NULL,
`name` VARCHAR(255) NOT NULL,
`parent_id` BIGINT,
`debug` BIT(1),
`start_ts` BIGINT COMMENT 'Span.timestamp(): epoch
micros used for endTs query and to implement TTL',
`duration` BIGINT COMMENT 'Span.duration(): micros
used for minDuration and maxDuration query'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER
SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`,
`trace_id`, `id`) COMMENT 'ignore insert on
duplicate';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`,
`trace_id`, `id`) COMMENT 'for joining with
zipkin_annotations';
ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`,
`trace_id`) COMMENT 'for getTracesByIds';
ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT
'for getTraces and getSpanNames';
ALTER TABLE zipkin_spans ADD INDEX(`start_ts`)
COMMENT 'for getTraces ordering and range';
CREATE TABLE IF NOT EXISTS zipkin_annotations
(
`trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT
'If non zero, this means the trace uses 128
bit traceIds instead of 64 bit',
`trace_id` BIGINT NOT NULL COMMENT 'coincides
with zipkin_spans.trace_id',
`span_id` BIGINT NOT NULL COMMENT 'coincides
with zipkin_spans.id',
`a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key
or Annotation.value if type == -1',
`a_value` BLOB COMMENT 'BinaryAnnotation.value(),
which must be smaller than 64KB',
`a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type()
or -1 if Annotation',
`a_timestamp` BIGINT COMMENT 'Used to implement
TTL; Annotation.timestamp or zipkin_spans.timestamp',
`endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint
is null',
`endpoint_ipv6` BINARY(16) COMMENT 'Null when
Binary/Annotation.endpoint is null, or no IPv6
address',
`endpoint_port` SMALLINT COMMENT 'Null when
Binary/Annotation.endpoint is null',
`endpoint_service_name` VARCHAR(255) COMMENT
'Null when Binary/Annotation.endpoint is null'
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER
SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`,
`trace_id`, `span_id`, `a_key`, `a_timestamp`)
COMMENT 'Ignore insert on duplicate';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`,
`trace_id`, `span_id`) COMMENT 'for joining
with zipkin_spans';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`,
`trace_id`) COMMENT 'for getTraces/ByIds';
ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`)
COMMENT 'for getTraces and getServiceNames';
ALTER TABLE zipkin_annotations ADD INDEX(`a_type`)
COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`a_key`)
COMMENT 'for getTraces and autocomplete values';
ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`,
`span_id`, `a_key`) COMMENT 'for dependencies
job';
CREATE TABLE IF NOT EXISTS zipkin_dependencies
(
`day` DATE NOT NULL,
`parent` VARCHAR(255) NOT NULL,
`child` VARCHAR(255) NOT NULL,
`call_count` BIGINT,
`error_count` BIGINT
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER
SET=utf8 COLLATE utf8_general_ci;
ALTER TABLE zipkin_dependencies ADD UNIQUE
KEY(`day`, `parent`, `child`); |
ÔÚÊý¾Ý¿âÖгõʼ»¯ÉÏÃæµÄ½Å±¾Ö®ºó£¬ÐèÒª×öµÄ¾ÍÊÇzipkin-serverÈçºÎÁ¬½ÓÊý¾Ý¿â¡£zipkinÈçºÎÁ¬Êý¾Ý¿âͬÁ¬½ÓrabbitmqÒ»Ñù¡£
zipkinÁ¬½ÓÊý¾Ý¿âµÄÊôÐÔËù¶ÔÓ¦µÄ»·¾³±äÁ¿ÈçÏ£º

-
STORAGE_TYPE=mysql
MYSQL_HOST=localhost MYSQL_TCP_PORT=3306 MYSQL_USER=root
MYSQL_PASS=123456 MYSQL_DB=zipkin java -jar zipkin.jar |
µÈͬÓÚÒÔϵÄÃüÁî
java -jar zipkin.jar
--zipkin.torage.type=mysql --zipkin.torage.mysql.
host=localhost --zipkin.torage.mysql.port=3306
--zipkin.torage.mysql.username=root --zipkin.torage.mysql.password=123456 |
ʹÓÃÉÏÃæµÄÃüÁîÆô¶¯zipkin.jar¹¤³Ì£¬È»ºóÔÙä¯ÀÀÊýÉÏ·ÃÎÊhttp://localhost:8765/hi£¬ÔÙ·ÃÎÊhttp://localhost:9411/zipkin/£¬¿ÉÒÔ¿´µ½Á´Â·Êý¾Ý¡£ÕâʱȥÊý¾Ý¿â²é¿´Êý¾Ý£¬Ò²ÊÇ¿ÉÒÔ¿´µ½´æ´¢ÔÚÊý¾Ý¿âµÄÁ´Â·Êý¾Ý£¬ÈçÏ£º

ÕâÊ±ÖØÆôÓ¦ÓÃzipkin.jar£¬ÔÙ´ÎÔÚä¯ÀÀÆ÷ÉÏ·ÃÎÊhttp://localhost:9411/zipkin/£¬ÈÔÈ»¿ÉÒԵõ½Ö®Ç°µÄ½á¹û£¬Ö¤Ã÷Á´Â·Êý¾Ý´æ´¢ÔÚÊý¾Ý¿âÖУ¬¶ø²»ÊÇÄÚ´æÖС£
½«Á´Â·Êý¾Ý´æÔÚÔÚElasticsearchÖÐ
zipkin-serverÖ§³Ö½«Á´Â·Êý¾Ý´æ´¢ÔÚElasticSearchÖС£¶ÁÕßÐèÒª×ÔÐа²×°ElasticSearchºÍKibana£¬ÏÂÔØµØÖ·Îª
https://www. elastic.co/products/elasticsearch¡£°²×°Íê³ÉºóÆô¶¯£¬ÆäÖÐElasticSearchµÄĬÈ϶˿ںÅΪ9200£¬KibanaµÄĬÈ϶˿ںÅΪ5601¡£
ͬÀí£¬zipkinÁ¬½ÓelasticsearchÒ²ÊÇ´Ó»·¾³±äÁ¿ÖжÁÈ¡µÄ£¬elasticsearchÏà¹ØµÄ»·¾³±äÁ¿ºÍ¶ÔÓ¦µÄÊôÐÔÈçÏ£º

²ÉÓÃÒÔÏÂÃüÁîÆô¶¯zipkin-server:
STORAGE_TYPE=elasticsearch
ES_HOSTS=http://localhost:9200 ES_INDEX=zipkin
java -jar zipkin.jar |
java -jar zipkin.jar
--STORAGE_TYPE=elasticsearch --ES_HOSTS= http://localhost:9200
--ES_INDEX=zipkin |
java -jar zipkin.jar
--STORAGE_TYPE=elasticsearch --ES_HOSTS= http://localhost:9200
--ES_INDEX=zipkin |
java -jar zipkin.jar
--zipkin.torage.type=elasticsearch --zipkin.torage.elasticsearch.hosts=http://localhost:9200
--zipkin.torage.elasticsearch.index=zipkin |
Æô¶¯Íê³Éºó£¬È»ºóÔÚä¯ÀÀÊýÉÏ·ÃÎÊhttp://localhost:8765/hi£¬ÔÙ·ÃÎÊhttp://localhost:9411/zipkin/£¬¿ÉÒÔ¿´µ½Á´Â·Êý¾Ý¡£ÕâʱÁ´Â·Êý¾Ý´æ´¢ÔÚElasticSearch¡£
ÔÚzipkinÉÏչʾÁ´Â·Êý¾Ý
Á´Â·Êý¾Ý´æ´¢ÔÚElasticSearchÖУ¬ElasticSearch¿ÉÒÔºÍKibana½áºÏ£¬½«Á´Â·Êý¾ÝչʾÔÚKibanaÉÏ¡£°²×°Íê³ÉKibanaºóÆô¶¯£¬KibanaĬÈÏ»áÏò±¾µØ¶Ë¿ÚΪ9200µÄElasticSearch¶ÁÈ¡Êý¾Ý¡£KibanaĬÈϵĶ˿ÚΪ5601£¬·ÃÎÊKibanaµÄÖ÷Ò³http://localhost:5601£¬Æä½çÃæÈçÏÂͼËùʾ¡£

ÔÚÉÏͼµÄ½çÃæÖУ¬µ¥»÷¡°Management¡±°´Å¥£¬È»ºóµ¥»÷¡°Add New¡±£¬Ìí¼ÓÒ»¸öindex¡£ÎÒÃǽ«ÔÚÉϽÚElasticSearchÖÐдÈëÁ´Â·Êý¾ÝµÄindexÅäÖÃΪ¡°zipkin¡±£¬ÄÇôÔÚ½çÃæÌîдΪ¡°zipkin-*¡±£¬µ¥»÷¡°Create¡±°´Å¥£¬½çÃæÈçÏÂͼËùʾ£º

´´½¨Íê³Éindexºó£¬µ¥»÷¡°Discover¡±£¬¾Í¿ÉÒÔÔÚ½çÃæÉÏչʾÁ´Â·Êý¾ÝÁË£¬Õ¹Ê¾½çÃæÈçÏÂͼËùʾ¡£

|