SpringBoot2.0 ZipKin示例代码

Zipkin是一种分布式跟踪系统。它有助于收集解决微服务架构中延迟问题所需的时序数据。它管理这些数据的收集和查找。Zipkin的设计基于 Google Dapper论文。

应用程序用于向Zipkin报告时间数据。Zipkin用户界面还提供了一个依赖关系图,显示每个应用程序有多少跟踪请求。如果您正在解决延迟问题或错误问题,则可以根据应用程序,跟踪长度,注释或时间戳过滤或排序所有跟踪。选择跟踪后,您可以看到每个跨度所需的总跟踪时间百分比,从而可以识别问题应用程序。

这是翻译过来的原意,自己在这里想如果有个调用链,我们自己该怎么实现。要去质疑任何代码。

官方流程图:最关键的是Transport这个地方,通过几种方式传输给Conllector。如何在这里支持多种协议,有兴趣的可以进去看看源码。

开始示例,在这里通过一个项目调用不同的方法来进行测试。

先下载Zipkin的web UI,通过java -jar zipkin.jar执行

项目结构:

pom.xml

<dependency>
  <groupId>org.projectlombok</groupId>
  <artifactId>lombok</artifactId>
  <optional>true</optional>
</dependency>
<!-- zipkin-->
<dependency>
  <groupId>io.zipkin.brave</groupId>
  <artifactId>brave-core</artifactId>
  <version>3.10.0</version>
</dependency>
<dependency>
  <groupId>io.zipkin.brave</groupId>
  <artifactId>brave-spancollector-http</artifactId>
  <version>3.10.0</version>
</dependency>
<dependency>
  <groupId>io.zipkin.brave</groupId>
  <artifactId>brave-web-servlet-filter</artifactId>
  <version>3.10.0</version>
</dependency>
<dependency>
  <groupId>io.zipkin.brave</groupId>
  <artifactId>brave-okhttp</artifactId>
  <version>3.10.0</version>
</dependency>
<!-- zipkin-->

application.properties

server.port=9000

##########请求的项目名##########
server.servlet.context-path=/zipkinTest

##########zipKin################
zipkin.serviceName=zipkin-test
zipkin.url=http://localhost:9411
zipkin.connectTimeout=6000
zipkin.readTimeout=6000
zipkin.flushInterval=1
zipkin.compressionEnabled=true
  • server.port 访问端口号
  • server.servlet.context-path 访问项目名
  • zipkin.serviceName 服务名
  • zipkin.url  Zipkin的web ui访问地址
  • zipkin.connectTimeout 连接时间
  • zipkin.readTimeout 读数据时间
  • zipkin.flushInterval 采集率
  • zipkin.compressionEnabled 是否压缩

ZipkinProperties.java

package com.cms.zipkin;

import com.github.kristofa.brave.Brave;
import com.github.kristofa.brave.EmptySpanCollectorMetricsHandler;
import com.github.kristofa.brave.Sampler;
import com.github.kristofa.brave.SpanCollector;
import com.github.kristofa.brave.http.DefaultSpanNameProvider;
import static com.github.kristofa.brave.Brave.Builder;
import static com.github.kristofa.brave.http.HttpSpanCollector.Config;
import static com.github.kristofa.brave.http.HttpSpanCollector.create;
import com.github.kristofa.brave.okhttp.BraveOkHttpRequestResponseInterceptor;
import com.github.kristofa.brave.servlet.BraveServletFilter;
import lombok.Data;
import okhttp3.OkHttpClient;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @program: zjsz-user
 * @description: Zipkin配置
 * @author: Mr.Yang
 * @create: 2018-07-03 21:58
 **/
@Data
@Configuration
@ConfigurationProperties(prefix = ZipkinProperties.ZIPKIN_PREFIX)
public class ZipkinProperties {

  public static final String ZIPKIN_PREFIX = "zipkin";

  /**
   * 服务名称
   */
  private String serviceName;

  /**
   * zipkin地址
   */
  private String url;

  /**
   * 连接时间
   */
  private int connectTimeout;

  /**
   * 读取时间
   */
  private int readTimeout;

  /**
   * 每间隔多少秒执行一次Span信息上传
   */
  private int flushInterval;

  /**
   * 是否启动压缩
   */
  private boolean compressionEnabled;

  /**
   * @Description: span(一次请求信息或者一次链路调用)信息收集器
   * @Param:
   * @return: SpanCollector 控制器
   * @Author: Mr.Yang
   * @Date: 2018/7/3 0002
   */
  @Bean
  public SpanCollector spanCollector() {
    Config config = Config.builder()
        // 默认false,span在transport之前是否会被gzipped
        .compressionEnabled(compressionEnabled)
        .connectTimeout(connectTimeout)
        .flushInterval(flushInterval)
        .readTimeout(readTimeout)
        .build();
    return create(url, config, new EmptySpanCollectorMetricsHandler());
  }

  /**
   * @Description: 作为各调用链路,只需要负责将指定格式的数据发送给zipkin
   * @Param:
   * @return:
   * @Author: Mr.Yang
   * @Date: 2018/7/3 0002
   */
  @Bean
  public Brave brave(SpanCollector spanCollector) {
    //调用服务的名称
    Builder builder = new Builder(serviceName);
    builder.spanCollector(spanCollector);
    //采集率
    builder.traceSampler(Sampler.ALWAYS_SAMPLE);
    return builder.build();
  }

  /**
   * @Description: 设置server的(服务端收到请求和服务端完成处理,并将结果发送给客户端)过滤器
   * @Param:
   * @return: 过滤器
   * @Author: Mr.Yang
   * @Date: 2018/7/3 0002
   */
  @Bean
  public BraveServletFilter braveServletFilter(Brave brave) {
    BraveServletFilter filter = new BraveServletFilter(brave.serverRequestInterceptor(),
        brave.serverResponseInterceptor(), new DefaultSpanNameProvider());
    return filter;
  }

  /**
   * @Description: 设置client的(发起请求和获取到服务端返回信息)拦截器
   * @Param:
   * @return: OkHttpClient 返回请求实例
   * @Author: Mr.Yang
   * @Date: 2018/7/3 0002
   */
  @Bean
  public OkHttpClient okHttpClient(Brave brave) {
    OkHttpClient httpClient = new OkHttpClient.Builder()
        .addInterceptor(new BraveOkHttpRequestResponseInterceptor(
            brave.clientRequestInterceptor(),
            brave.clientResponseInterceptor(),
            new DefaultSpanNameProvider())).build();
    return httpClient;
  }
}

ZipkinBraveController1

package com.cms.contorller;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @program: zjsz-user
 * @description: 服务一
 * @author: Mr.Yang
 * @create: 2018-07-03 21:58
 **/
@RestController
@RequestMapping("server1")
public class ZipkinBraveController1 {

  @Autowired
  private OkHttpClient client;

  /**
  * @Description: 第一步调用
  * @Param:
  * @return: 字符串
  * @Author: Mr.Yang
  * @Date: 2018/7/3
  */
  @RequestMapping("/zipkin")
  public String service1() throws Exception {
    Thread.sleep(100);
    Request request = new Request.Builder().url("http://localhost:9000/zipkinTest/server2/zipkin").build();
    Response response = client.newCall(request).execute();
    return response.body().string();
  }

}

ZipkinBraveController2

package com.cms.contorller;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @program: zjsz-user
 * @description: 服务二
 * @author: Mr.Yang
 * @create: 2018-07-03 21:58
 **/
@RestController
@RequestMapping("server2")
public class ZipkinBraveController2 {

  @Autowired
  private OkHttpClient client;

  /**
   * @Description: 第二步调用
   * @Param:
   * @return: 字符串
   * @Author: Mr.Yang
   * @Date: 2018/7/3
   */
  @RequestMapping("/zipkin")
  public String service1() throws Exception {
    Thread.sleep(100);
    Request request = new Request.Builder().url("http://localhost:9000/zipkinTest/server3/zipkin").build();
    Response response = client.newCall(request).execute();
    return response.body().string();
  }

}

ZipkinBraveController3

package com.cms.contorller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @program: zjsz-user
 * @description: 服务三
 * @author: Mr.Yang
 * @create: 2018-07-03 21:58
 **/
@RestController
@RequestMapping("server3")
public class ZipkinBraveController3 {

  /**
   * @Description: 第三步调用
   * @Param:
   * @return: 字符串
   * @Author: Mr.Yang
   * @Date: 2018/7/3
   */
  @RequestMapping("/zipkin")
  public String service1() throws Exception {
    Thread.sleep(200);

    return "你好,欢迎进入Zipkin的世界";
  }

}

项目启动后,访问http://localhost:9000/zipkinTest/server1/zipkin 就可以看到

你好,欢迎进入Zipkin的世界

我们通过http://localhost:9411/zipkin 查看zipkin的web UI

查看每条调用链的详情

后面还会讲关于zipkin将数据整合到Mysql、Elasticsearch中去。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot2.0 ZipKin示例代码

    Zipkin是一种分布式跟踪系统.它有助于收集解决微服务架构中延迟问题所需的时序数据.它管理这些数据的收集和查找.Zipkin的设计基于 Google Dapper论文. 应用程序用于向Zipkin报告时间数据.Zipkin用户界面还提供了一个依赖关系图,显示每个应用程序有多少跟踪请求.如果您正在解决延迟问题或错误问题,则可以根据应用程序,跟踪长度,注释或时间戳过滤或排序所有跟踪.选择跟踪后,您可以看到每个跨度所需的总跟踪时间百分比,从而可以识别问题应用程序. 这是翻译过来的原意,自己在这里想如

  • SpringBoot2.3集成ELK7.1.0的示例代码

    最近想用ELK做日志分析,所以先写了Demo来实验一下! 1.安装ELK(Elasticsearch+Logstash+Kibana),具体安装教程百度 2.查看是否安装成功,输入localhost:9200,localhost:5601,如下页面则安装成功 3.pom包依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM

  • SpringBoot2.0整合WebSocket代码实例

    这篇文章主要介绍了SpringBoot2.0整合WebSocket代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 之前公司的某个系统为了实现推送技术,所用的技术都是Ajax轮询,这种方式浏览器需要不断的向服务器发出请求,显然这样会浪费很多的带宽等资源,所以研究了下WebSocket,本文将详细介绍下. 一.什么是WebSocket? WebSocket是HTML5开始提供的一种在单个TCP连接上进行全双工通讯的协议,能更好的节省服务器资

  • Springboot 2.x集成kafka 2.2.0的示例代码

    目录 引言 基本环境 代码编写 1.基本引用pom 2.基本配置 3.实体类 4.生产者端 5.消费者 6.测试 效果展示 遇到的问题 引言 kafka近几年更新非常快,也可以看出kafka在企业中是用的频率越来越高,在springboot中集成kafka还是比较简单的,但是应该注意使用的版本和kafka中基本配置,这个地方需要信心,防止进入坑中. 版本对应地址:https://spring.io/projects/spring-kafka 基本环境 springboot版本2.1.4 kafk

  • C++单例模式实现线程池的示例代码

    C语言单例模式实现线程池. 该代码中,使用了单例模式来创建线程池对象,保证了整个程序中只有一个线程池对象. 线程池中包含了任务队列.工作线程数组.互斥锁.条件变量等成员,通过这些成员来实现任务的提交和执行. 在主函数中,提交了10个任务,每个任务都是一个简单的打印数字的函数,最后等待所有任务执行完毕后销毁线程池. #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define THREAD_POOL

  • springboot2.0整合dubbo的示例代码

    写在前面: 使用springboot作为web框架,方便开发许多,做分布式开发,dubbo又不可少,那么怎么整合在一起呢, 跟我学一遍,至少会用 注意,springboot2.0和springboot1.x与dubbo整合不一样, 1.环境 1.新建一个空的maven项目,作为父工程,新建moudle,,service(接口层,及实现层,没有具体分,),web(web层,springboot项目) 项目结构如下 父pom如下 <properties> <project.build.sou

  • springboot2.0集成rabbitmq的示例代码

    安装rabbitmq 简介: rabbitmq即一个消息队列,主要用来实现应用程序的异步和解耦,消息缓冲,消息分发的作用. 由于rabbitmq依赖于erlang语言,所以先安装erlang: 添加erlang solutions源 $ wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm $ sudo rpm -Uvh erlang-solutions-1.0-1.noarch.rpm $ su

  • springboot2 生产部署注意事项及示例代码

    注意事项 1. 去除不需要的 jar 开发工具 jar :springs-boot-devtools 2. 监控一定要做好权限制或者去除 控制 jar :spring-boot-starter-actuator 监控 druid 的监控 swagger的接口 3 打包的时候要跳过测试 maven : clean package -Dmaven.test.skip=true 打包脚本示例: #!/bin/sh ## chang here SERVICE_DIR=/roncoo/spring-boo

  • springboot2+es7使用RestHighLevelClient的示例代码

    目录 一.引入依赖jar 二.application.properties配置 三.使用 其它 由于spring和es的集成并不是特别友好,es的高低版本兼容问题.api更新频率高等问题,所以我选择是官网提供的原生Client(RestHighLevelClient),但又不想去关注es的配置类以及和spring的集成配置.jar包冲突等问题,所以使用spring-boot-starter-data-elasticsearch. 一.引入依赖jar         <dependency>  

  • Android 7.0 监听网络变化的示例代码

    Android7.0前,Android系统前网络切换时,会发广播,业务只要监听广播即可. public class NetChangeReceiver extends BroadcastReceiver { private static final String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; @Override public void onReceive(Context conte

随机推荐