发博词
是Spring Cloud Sleuth的原理不是zipkin的原理。
追踪原理
Spring Cloud Sleuth可以追踪10种类型的组件,async、Hystrix,messaging,websocket,rxjava,scheduling,web(Spring MVC Controller,Servlet),webclient(Spring RestTemplate)、Feign、Zuul。下面是常用的八种类型。
Scheduled
原理是AOP处理Scheduled注解
TraceSchedulingAspect可以带出,只要是在IOC容器中的Bean带有@Scheduled注解的方法的调用都会被sleuth处理。
Messaging
原理是基于spring messaging的ChannelInterceptor。
TraceChannelInterceptor/IntegrationTraceChannelInterceptor
MessagingSpanTextMapExtractor和MessagingSpanTextMapInjector
Hystrix
原理是使用HystrixPlugins添加trace相关的plugin,自定义了一个HystrixConcurrencyStrategy的实现SleuthHystrixConcurrencyStrategy
具体参考TraceCommand和SleuthHystrixConcurrencyStrategy
Feign
原理是实现了两个Feign Client实例,一个不带Ribbon TraceFeignClient、一个带Ribbon,TraceLoadBalancerFeignClient
TraceFeignAspect AOP里面的逻辑是,有地方想获取Client实例,就拦截返回自己封装的Client。
Async
@Async注解和ThreadPoolTaskExecutor下面的类
具体参看TraceAsyncAspect
RestTempate
原理是spring client的Interceptor机制。具体参看TraceRestTemplateInterceptor。
Zuul
原理是zuul的Filter机制,ZuulFilter
实现了三个TracePreZuulFilter、TracePostZuulFilter两个Filter。
示例代码
示例代码提供了上述八种组件的追踪示例,项目结构如下:
- zipkin stream server
- eureka server
- Segment1[定时消息->消息中间件->监听消息中间件->feign+hystrix->feign+hystrix]
->Segment2[controller+async+webclient,controller2(让zuul调用)]->Segment3[zuul]
具体请查看示例代码:
github spring-cloud-sleuth-samples
注意:
zipkin stream server 的${spring.sleuth.stream.group}配置需要放到外部指定,不然不管用。
spring.kafka.consumer.group-id=xxx,内外配置都不管用
spring.cloud.stream.bindings.seluth.group=xxx ,内外配置都不管用
spring.sleuth.stream.group=xxx,在内配置不管用,在外配置管用
具体原因参看:StreamEnvironmentPostProcessor