微服务调用跟踪

随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位服务故障点,以对症下药。于是就有了分布式系统调用跟踪的诞生。
针对微服务化应用链路追踪的问题,Google在2010年发表了论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》,这篇文章是业内实现链路追踪的标杆和理论基础,具有非常大的参考价值。目前链路追踪组件主要有Google的Dapper,Twitter 的Zipkin,以及阿里的Eagleeye (鹰眼)等,它们都是非常优秀的链路追踪开源组件。
Spring Cloud Sleuth是 Spring Cloud为分布式服务链路跟踪提供的解决方案。它提供以下功能:
  1. 提供链路追踪。通过sleuth可以很清楚的看出一个请求都经过了哪些服务;可以很方便的理清服务间的调用关系。
  2. 可视化错误。对于程序未捕捉的异常,可以结合zipkin分析。
  3. 分析耗时。通过sleuth可以很方便的看出每个采样请求的耗时,分析出哪些服务调用比较耗时。当服务调用的耗时随着请求量的增大而增大时,也可以对服务的扩容提供一定的提醒作用。
  4. 优化链路。对于调用频繁的服务,可以并行调用或针对业务做一些优化措施等。
Spring Cloud Sleuth可以追踪以下类型的组件:async,hystrix,messaging,websocket,rxjava,scheduling,web(SpringWebMvc,Spring WebFlux, Servlet),webclient(Spring RestTemplate),feign,zuul。

web

webflux通过注册TraceWebFilter, webmvc通过实现HandlerInterceptorAdapter,Servlet通过定义AOP切面对@RestController、@Controller、Callable对请求进行trace拦截,完成span的新建、传递和销毁。可以设置spring.sleuth.web.enabled为false禁用所有web请求的sleuth跟踪。
async
通过TraceAsyncAspect对@Async注解进行拦截,通过 TraceRunnable 和 TraceCallable来对runnable和callable进行包装和利用LazyTraceExecutor来代替java的Executor。Spring Cloud Sleuth利用以上方式进行span的新建和销毁。
如果需要禁用的话,可以设置spring.sleuth.async.enabled为false。如果禁用,与异步相关的机制就不会发生。
hystrix
原理是使用HystrixPlugins添加trace相关的plugin,自定义了一个HystrixConcurrencyStrategy子类SleuthHystrixConcurrencyStrategy 。若需要禁用可以设置spring.sleuth.hystrix.strategy.enable为false。
messaging
Spring Cloud Sleuth提供了TracingChannelInterceptor,是基于Spring message的ChannelInterceptorAdapter/ExecutorChannelInterceptor,它发布/订阅事件都是会进行span的新建和销毁的。可以设置spring.sleuth.integration.enabled为false禁用该机制。
websocket
将TracingChannelInterceptor拦截类注册到ChannelRegistration中进行trace拦截。
rxjava
通过自定义RxJavaSchedulersHook的子类SleuthRxJavaSchedulersHook,它使用TraceAction来包装实例中Action0。这个钩子对象,会根据之前调度的Action是否已经开始跟踪,来决定是创建还是延续使用span。可以通过设置spring.sleuth.rxjava.schedulers.hook.enabled为false来关闭这个对象的使用。可以定义一组正则表达式来对线程名进行过滤,来选择哪些线程不需要跟踪。
scheduling
原理是建立TraceSchedulingAspect 切面对Scheduled注解进行trace拦截,对span进行创建和销毁。可以通过设置spring.sleuth.scheduled.enabled为false来使该切面无效。
feign
Spring Cloud Sleuth默认通过TraceFeignClientAutoConfiguration提供feign的集成,可以设置spring.sleuth.feign.enabled为false来使其无效。
zuul
注册Zuul过滤器TracePostZuulFilter来传递tracing信息(请求头使用tracing数据填满),可以设置spring.sleuth.zuul.enabled为false来关闭Zuul服务。

posted on 2019-07-15 08:20  时间朋友  阅读(1445)  评论(0编辑  收藏  举报

导航