微服务—分布式服务追踪sleuth和zipkin - 开拖拉机的蜡笔小新 - 博客园
现今业界分布式服务跟踪的理论基础主要来自于 Google 的一篇论文。使用最为广泛的开源实现是 Twitter 的 Zipkin,为了实现平台无关、厂商无关的分布式服务跟踪,CNCF 发布了布式服务跟踪标准 Open Tracing。国内,淘宝的“鹰眼”、京东的“Hydra”、大众点评的“CAT”、新浪的“Watchman”、唯品会的“Microscope”、窝窝网的“Tracing”都是这样的系统。
请求创建一个唯一的跟踪标识Trace ID
request到response为 一个“trace”。
请求到达各个服务时,通过唯一标识Span ID来标记它的开始及结束。就能统计出该Span的时间延迟,除了时间戳记录之外,它还可以包含一些其他元数据,比如时间名称、请求信息等。
Spring Cloud Sleuth为服务之间调用提供链路追踪。通过Sleuth可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长。从而让我们可以很方便的理清各微服务间的调用关系。
此外Sleuth可以帮助我们:
耗时分析: 通过Sleuth可以很方便的了解到每个采样请求的耗时,从而分析出哪些服务调用比较耗时;
可视化错误: 对于程序未捕捉的异常,可以通过集成Zipkin服务界面上看到;
链路优化: 对于调用比较频繁的服务,可以针对这些服务实施一些优化措施。
spring cloud sleuth可以结合zipkin,将信息发送到zipkin,利用
zipkin的存储来存储信息,利用zipkin ui来展示数据。
用mvc的角度的理解就是C是sleuth zpkin是MV。
Spring应用在监测到Java依赖包中有sleuth和zipkin后,会自动在RestTemplate的调用过程中向HTTP请求注入追踪信息,并向Zipkin Server发送这些信息。
spring.zipkin.base-url指定了Zipkin服务器的地址,spring.sleuth.sampler.percentage将采样比例设置为1.0,也就是全部都需要。
追踪原理
Spring Cloud Sleuth可以追踪10种类型的组件,async、Hystrix,messaging,websocket,rxjava,scheduling,web(Spring MVC Controller,Servlet),webclient(Spring RestTemplate)、Feign、Zuul。下面是常用的八种类型。
追踪原理
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。
AOP实现
拦截所有的controller 就可以得到路径,请求参数,并生成唯一id
@Around("execution(public * com.controller.*.*(..))")
public Object exeMethod(ProceedingJoinPoint joinPoint)throws Throwable{
//当前请求所执行的controller类的方法
BaseReq req=getParam(joinPoint.getArgs());
//当前请求所执行的controller类的方法
String methodName=joinPoint.getSignature().getName();
// 当前线程执行子任务的唯一标识
ContextUtil.getContext().put("logbean.uuid", UUID.randomUUID().toString());
网友评论