资讯专栏INFORMATION COLUMN

Motan+Zipkin+Brave链路跟踪初探

woshicixide / 2299人阅读

0.Why Zipkin

随着业务发展,系统拆分导致系统调用链路愈发复杂一个前端请求可能最终需要调用很多次后端服务才能完成,当整个请求变慢或不可用时,我们是无法得知该请求是由某个或某些后端服务引起的,这时就需要解决如何快读定位服务故障点,以对症下药。于是就有了分布式系统调用跟踪的诞生。而zipkin就是开源分布式系统调用跟踪的佼佼者

zipkin基于google-Dapper的论文有兴趣的可以看下

1. 部署zipkin 快速上手

上zipkin官网把可运行jar包下下来
zipkin latest release

运行
java -jar zipkin.jar

改变存储方式

zipkin默认会将链路跟踪数据保存到内存,同时也支持MySql、ElasticSearch等多种持久化插件

以MySql为例,只需在启时加上以下参数即可:

java -jar zipkin.jar --zipkin.storage.StorageComponent=mysql
--zipkin.storage.type=mysql --zipkin.storage.mysql.host=127.0.0.1--zipkin.storage.mysql.port=3306 --zipkin.storage.mysql.username=root --zipkin.storage.mysql.password=root --zipkin.storage.mysql.db=zipkin_test
--zipkin.storage.StorageComponent=mysql #使用mysql组件
--zipkin.storage.type=mysql #使用mysql持久化
--zipkin.storage.mysql.host #mysql数据库域名
--zipkin.storage.mysql.port=3306 #mysql数据库端口
--zipkin.storage.mysql.username=root #数据库账号
--zipkin.storage.mysql.password=root #数据库密码
--zipkin.storage.mysql.db=zipkin_test #库名
2.服务集成
本文使用Brave作为Tracer实现,使用spring-cloud的小伙伴可以选择spring-cloud-sleuth
引入依赖

引入Brave


    
        
            io.zipkin.brave
            brave-bom
            ${brave.version}
            pom
            import
        
    

    io.opentracing.brave
    brave-opentracing
    0.31.0


    io.zipkin.reporter2
    zipkin-sender-okhttp3
    2.6.1

引入filter-opentracing模块


    com.weibo
    filter-opentracing
    
        
            io.opentracing
            opentracing-api
        
    
此处要exclud掉opentracing-api防止filter-opentracing跟brave的依赖冲突
实现TracerFactory
public class BraveTarcerFactory implements TracerFactory {
    private static Tracer braveTracer = BraveTracer.create(Tracing.newBuilder()
            // 设置当前服务的服务名,需做成配置化
            .localServiceName("goods-service")
            // 此处采用OkHttpSender通过HTTP请求的方式发送跟踪数据,Zipkin的日志接口地址需做成配置化的
            .spanReporter(AsyncReporter.create(OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans")))
            .build());
    @SuppressWarnings("deprecation")
    @Override
    public Tracer getTracer() {
        return braveTracer;
    }
}
将TracerFactory注册到openTracingContext
@Bean
BraveTarcerFactory tarcerFactory() {
    return new BraveTarcerFactory();
}

@Bean
OpenTracingContext openTracingContext(TracerFactory tracerFactory) {
    OpenTracingContext context = new OpenTracingContext();
    context.setTracerFactory(tracerFactory);
    return context;
}
记得注册filter噢~
@Bean(name = "motanClientBasicConfig")
@ConditionalOnMissingBean
public BasicRefererConfigBean baseRefererConfig() {
    BasicRefererConfigBean config = new BasicRefererConfigBean();
    config.setFilter("opentracing");
    return config;
}

@Bean(name = "motanServerBasicConfig")
@ConditionalOnMissingBean
public ServerBasicConfig() {
    BasicRefererConfigBean config = new BasicRefererConfigBean();
    config.setFilter("opentracing");
    return config;
}
3. 走你!

zipkin默认监听9411端口,通过浏览器访问localhost:9441即可进入他的UI页面,点击Find Traces即可看到跟踪结果:

4. SpringClould全家桶万岁!

因为项目没有用SpringCloud,自己折腾Brave的依赖真真蛋痛,想要方便还是得上SpringCloud全家桶啊!

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/69499.html

相关文章

  • 微服务调用链追踪中心搭建

    摘要:一个客户端请求从发出到被响应经历了哪些组件哪些微服务请求总时长每个组件所花时长等信息我们有必要了解和收集,以帮助我们定位性能瓶颈进行性能调优,因此监控整个微服务架构的调用链十分有必要,本文将阐述如何使用搭建微服务调用链追踪中心。 showImg(https://segmentfault.com/img/remote/1460000014553707); 概述 一个完整的微服务系统包含...

    Pines_Cheng 评论0 收藏0
  • 利用Zipkin追踪Mysql数据库调用链

    摘要:注本文首发于公众号,可长按或扫描下面的小心心来订阅扩展组件是在微服务调用链追踪中心搭建一文中编写的与通信的工具组件,利用其追踪微服务调用链的,现在我们想追踪数据库调用链的话,可以扩展一下其功能。 showImg(https://segmentfault.com/img/remote/1460000014751186); 概述 在前面:微服务调用链追踪中心搭建 一文中我们利用Zipki...

    姘存按 评论0 收藏0
  • Spring Cloud 参考文档(Spring Cloud Sleuth特性)

    摘要:介绍从版本开始,使用作为追踪库,为方便起见,在此处嵌入了的部分文档。具有一个上下文,其中包含标识符,该标识符将放置在表示分布式操作的树中的正确位置。追踪通常由拦截器自动完成,在幕后,他们添加与他们在操作中的角色相关的标签和事件。 Spring Cloud Sleuth特性 将trace和span ID添加到Slf4J MDC,因此你可以在日志聚合器中从给定的trace或span提取...

    chinafgj 评论0 收藏0
  • Spring Cloud Sleuth 之Greenwich版本全攻略

    摘要:服务提供者提供一个接口,服务消费者通过消费服务。服务提供者服务提供者,对外提供一个,并向服务注册中心注册,这部分内容,不再讲述,见源码。 微服务架构是一个分布式架构,微服务系统按业务划分服务单元,一个微服务系统往往有很多个服务单元。由于服务单元数量众多,业务的复杂性较高,如果出现了错误和异常,很难去定位。主要体现在一个请求可能需要调用很多个服务,而内部服务的调用复杂性决定了问题难以定位...

    PascalXie 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<