千家信息网

什么是spring-cloud-sleuth+zipkin源码

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,今天就跟大家聊聊有关什么是spring-cloud-sleuth+zipkin源码,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1.1. 前言
千家信息网最后更新 2026年11月03日什么是spring-cloud-sleuth+zipkin源码

今天就跟大家聊聊有关什么是spring-cloud-sleuth+zipkin源码,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

1.1. 前言

  粗略看了下spring cloud sleuth core源码,发现内容真的有点多,它支持了很多类型的链路追踪,我就找其中一个比较有代表性的深入剖析下源码结构和内容

1.2. spring-cloud-sleuth-core源码解析

1.2.1. 结构

  1. 可以看到源码中支持的追踪类型有很多,支持async,hystrix,websocket,rxjava,Spring mvc,servlet,spring restTemplate,feign,zuul等等,这里我着重探讨spring web mvc的链路追踪

  2. 打开web包,找到TraceWebAutoConfiguration,这里配置了主要的初始化类

1.2.2. 过滤器注册

  1. 当启动初始化程序时,跟踪代码如下

    @Bean    public FilterRegistrationBean traceWebFilter(TraceFilter traceFilter) {        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(                traceFilter);        filterRegistrationBean.setDispatcherTypes(ASYNC, ERROR, FORWARD, INCLUDE,                REQUEST);        filterRegistrationBean.setOrder(TraceFilter.ORDER);        return filterRegistrationBean;    }    @Bean    @ConditionalOnMissingBean    public TraceFilter traceFilter(BeanFactory beanFactory,            SkipPatternProvider skipPatternProvider) {        return new TraceFilter(beanFactory, skipPatternProvider.skipPattern());    }
  1. 初始化traceFilter,进行过滤器注册

1.2.3. 拦截器注册

  1. 然后看TraceWebMvcConfigurer类,它会进行拦截器的注册

@Configurationclass TraceWebMvcConfigurer extends WebMvcConfigurerAdapter {    @Autowired BeanFactory beanFactory;    @Bean    public TraceHandlerInterceptor traceHandlerInterceptor(BeanFactory beanFactory) {        return new TraceHandlerInterceptor(beanFactory);    }    @Override    public void addInterceptors(InterceptorRegistry registry) {        registry.addInterceptor(this.beanFactory.getBean(TraceHandlerInterceptor.class));    }}
  1. 在TraceHandlerInterceptor类中,preHandle,afterCompletion方法可以看出,这是对请求进行拦截进行span的包装

    @Override    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,            Object handler) throws Exception {        String spanName = spanName(handler);        boolean continueSpan = getRootSpanFromAttribute(request) != null;        Span span = continueSpan ? getRootSpanFromAttribute(request) : getTracer().createSpan(spanName);        if (log.isDebugEnabled()) {            log.debug("Handling span ">
    @Override    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,            Object handler, Exception ex) throws Exception {        if (isErrorControllerRelated(request)) {            if (log.isDebugEnabled()) {                log.debug("Skipping closing of a span for error controller processing");            }            return;        }        Span span = getRootSpanFromAttribute(request);        if (ex != null) {            getErrorParser().parseErrorTags(span, ex);        }        if (getNewSpanFromAttribute(request) != null) {            if (log.isDebugEnabled()) {                log.debug("Closing span " + span);            }            Span newSpan = getNewSpanFromAttribute(request);            getTracer().continueSpan(newSpan);            getTracer().close(newSpan);            clearNewSpanCreatedAttribute(request);        }    }

1.2.4. zipkin端点提交

  1. 这里首先会初始化HttpZipkinSpanReporter类,,用来进行span端点提交,然后初始化ZipkinSpanListenerspan的监听器,用来监听并调用端点提交,以上配置再下图位置

1.2.5. 调用http接口时,进入过滤器

  1. 首先进入TraceFilter中的过滤方法doFilter,这里会做span的创建

private Span createSpan(HttpServletRequest request,            boolean skip, Span spanFromRequest, String name) {        if (spanFromRequest != null) {            if (log.isDebugEnabled()) {                log.debug("Span has already been created - continuing with the previous one");            }            return spanFromRequest;        }        //加入调用链路ZipkinHttpSpanExtractor,此链路在TraceHttpAutoConfiguration中配置实例化,调用链还没有时,返回为空,作为头节点        Span parent = spanExtractor().joinTrace(new HttpServletRequestTextMap(request));        if (parent != null) {            if (log.isDebugEnabled()) {                log.debug("Found a parent span ">

1.2.6. 进入拦截器

  1. 在preHandle方法中,对span进行包装,然后把span放入请求头header中

  2. 最后再DefaultTracer中进行span的关闭和spanReporter的提交

看完上述内容,你们对什么是spring-cloud-sleuth+zipkin源码有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注行业资讯频道,感谢大家的支持。

源码 内容 链路 支持 方法 端点 过滤器 拦截器 配置 类型 结构 包装 监听 粗略 下图 代码 代表 代表性 位置 前言 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 瑰夏咖啡 广州淘业互联网络科技 广州紫鲸互联网科技有限公司 互联网科技工作委员会副主任毛军 互联网最新的科技有限公司 互联网科技的 中国 科技 互联网 宜安科技 互联网金融 美国互联网黑科技 互联网科技公司介绍 茂名市互联网科技产业园 赶超互联网科技 微信多开 坤平互联网科技 互联网公司黑科技创始人 互联网科技数字货币 山东大美朱楼互联网科技有限公司 陕西九四连强互联网科技有限公司 绵阳真晨互联网科技有限公司 青岛易易互联网科技 每日互联网科技新闻 互联网科技有限公司 广州万易互联网科技有限公司 互联网科技行业发展 居家互联网科技有限公司 互联网实体化科技化 中国航天科技大学国际工业互联网 中国互联网十大科技股排名 玉溪新华互联网科技好不好 广州千川互联网科技有限公司 从那以后互联网科技有限公司
0