Spring Cloud Sleuth消息追踪原理

发博词

是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。

示例代码

示例代码提供了上述八种组件的追踪示例,项目结构如下:
1. zipkin stream server
2. eureka server
3. 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

    原文作者:Spring Cloud
    原文地址: https://blog.csdn.net/xichenguan/article/details/77448288
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞