2

0.Why Zipkin

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

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

1. 部署zipkin

快速上手

  1. 上zipkin官网把可运行jar包下下来
    zipkin latest release
  2. 运行
    java -jar zipkin.jar

改变存储方式

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

clipboard.png

以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

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-bom</artifactId>
            <version>${brave.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
<dependency>
    <groupId>io.opentracing.brave</groupId>
    <artifactId>brave-opentracing</artifactId>
    <version>0.31.0</version>
</dependency>
<dependency>
    <groupId>io.zipkin.reporter2</groupId>
    <artifactId>zipkin-sender-okhttp3</artifactId>
    <version>2.6.1</version>
</dependency>

引入filter-opentracing模块

<dependency>
    <groupId>com.weibo</groupId>
    <artifactId>filter-opentracing</artifactId>
    <exclusions>
        <exclusion>
            <groupId>io.opentracing</groupId>
            <artifactId>opentracing-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>
此处要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全家桶啊!


Akers
29 声望1 粉丝

屡次转投Python神教失败的Java全栈工程师,目前主要关注微服务、人工智能、Koltin语言、用还没学会的区块链技术割韭菜(哎呀说漏嘴了)