zipkin学习--03--Springboot 集成 Zipkin--通过io.zipkin.brave包

zipkin学习–03–Springboot 集成 Zipkin–通过io.zipkin.brave包


一、总体信息

在这里插入图片描述
在这里插入图片描述

二、搭建service8081

2.1、pom.xml依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.5.4</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>service8081</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>service8081</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <zipkin.version>3.9.0</zipkin.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web-services</artifactId>
        </dependency>

        <!-- zipkin相关 -->

        <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-core</artifactId>
            <version>${zipkin.version}</version>
        </dependency>
        <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-spancollector-http</artifactId>
            <version>${zipkin.version}</version>
        </dependency>
        <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-web-servlet-filter</artifactId>
            <version>${zipkin.version}</version>
        </dependency>
        <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-apache-http-interceptors</artifactId>
            <version>${zipkin.version}</version>
        </dependency>
        <dependency>
            <groupId>io.zipkin.brave</groupId>
            <artifactId>brave-okhttp</artifactId>
            <version>${zipkin.version}</version>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2.2、application.properties

# 发给zipkin的服务器名称
zipkin.serviceName=service8081
# zipkin的url地址
zipkin.url=http://localhost:9411
# 连接超时时间
zipkin.connectTimeout=6000
# 读取超时时间
zipkin.readTimeout=6000
# 上传 span 的间隔时间
zipkin.flushInterval=1
# 是否启动压缩
zipkin.compressionEnabled=true
# 采样率,默认为0.1,值越大收集越及时,但性能影响也越大
zipkin.samplerRate=1

server.port=8081
server.servlet.context-path=/
spring.application.name=service8081

2.3、Span收集器配置

package com.example.service8081.business.config;

import com.github.kristofa.brave.Brave;
import com.github.kristofa.brave.Brave.Builder;
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 com.github.kristofa.brave.http.HttpSpanCollector;
import com.github.kristofa.brave.http.HttpSpanCollector.Config;
import com.github.kristofa.brave.okhttp.BraveOkHttpRequestResponseInterceptor;
import com.github.kristofa.brave.servlet.BraveServletFilter;
import okhttp3.OkHttpClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 *
 * 配置Span收集器 设置收集器的详细参数,包含超时时间、上传span间隔、以及配置采集率等,进而对收集器进行初始化。
 * 
 */
@Configuration
public class SpanCollectorConfig {
    // zipkin的url地址
    @Value("${zipkin.url}")
    private String url;
    // 发给zipkin的服务器名称
    @Value("${zipkin.serviceName}")
    private String serviceName;
    
    // 连接超时时间
    @Value("${zipkin.connectTimeout}")
    private int connecTimeout;
    
    // 是否启动压缩
    @Value("${zipkin.compressionEnabled}")
    private boolean compressionEnabled;
    
    // 上传 span 的间隔时间
    @Value("${zipkin.flushInterval}")
    private int flushInterval;
    
    // 读取超时时间
    @Value("${zipkin.readTimeout}")
    private int readTimeout;
    // 采样率,默认为0.1,值越大收集越及时,但性能影响也越大
    @Value("${zipkin.samplerRate}")
    private float samplerRate;
    
    /**
     * 配置 span 收集器
     * 
     * @return
     */
    @Bean
    public SpanCollector spanCollector() {
        Config config = Config.builder()
                //连接超时时间
                .connectTimeout(connecTimeout)
                //是否启动压缩
                .compressionEnabled(compressionEnabled)
                //上传 span 的间隔时间
                .flushInterval(flushInterval)
                //读取超时时间
                .readTimeout(readTimeout).build();
                //url:zipkin的url地址
        return HttpSpanCollector.create(url, config, new EmptySpanCollectorMetricsHandler());
    }
    
    /**
     * 配置采集率
     * 作为各调用链路,只需要负责将指定格式的数据发送给zipkin
     * @param spanCollector
     * @return
     */
    @Bean
    public Brave brave(SpanCollector spanCollector) {
        //被采集的服务名称
        Builder builder = new Builder(serviceName);
        //采集器
        builder.spanCollector(spanCollector)
                //采样率,默认为0.1,值越大收集越及时,但性能影响也越大
                .traceSampler(Sampler.create(samplerRate)).build();
        return builder.build();
    }
    
    /**
     * @Description: 设置server的(服务端收到请求和服务端完成处理,并将结果发送给客户端)过滤器
     * @Param:
     * @return: 过滤器
     */
    @Bean
    public BraveServletFilter braveServletFilter(Brave brave) {
        BraveServletFilter filter = new BraveServletFilter(brave.serverRequestInterceptor(),
                brave.serverResponseInterceptor(), new DefaultSpanNameProvider());
        return filter;
    }
    
    /**
     * @Description: 设置client的 rs(表示服务端收到请求)和cs(表示客户端发起请求)的拦截器
     * @Param:
     * @return: OkHttpClient 返回请求实例
     */
    @Bean
    public OkHttpClient okHttpClient(Brave brave) {
        OkHttpClient httpClient = new OkHttpClient.Builder()
                .addInterceptor(new BraveOkHttpRequestResponseInterceptor(brave.clientRequestInterceptor(),
                        brave.clientResponseInterceptor(), new DefaultSpanNameProvider()))
                .build();
        return httpClient;
    }
}

2.4、HelloController

package com.example.service8081.business.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;

import java.io.IOException;

/**
 * 描述该类
 * 
 * @class: HelloController
 * @see
 */
@RestController
@RequestMapping("zipkin")
public class HelloController {
    
    public static final String url = "http://localhost:8082/zipkin/service2";
    
    @Autowired
    OkHttpClient client;
    
    @GetMapping("/service1")
    public String service() throws IOException {
        System.out.println("-----调用service1-----");
        Request request = new Request.Builder().url(url).build();
        
        Response response = client.newCall(request).execute();
        
        return "service1," + response.body().string();
    }
}

三、 service8082到service8085的配置:

3.1、application.properties 修改

zipkin.serviceName= 改为自己的服务名称
server.port=改为自己的端口
spring.application.name=改为自己的服务名称

3.2、HelloController 修改

3.2.1、service8081
@RestController
@RequestMapping("zipkin")
public class HelloController {
    
    public static final String url = "http://localhost:8082/zipkin/service2";
    
    @Autowired
    OkHttpClient client;
    
    @GetMapping("/service1")
    public String service() throws IOException {
        System.out.println("-----调用service1-----");
        Request request = new Request.Builder().url(url).build();
        
        Response response = client.newCall(request).execute();
        
        return "service1," + response.body().string();
    }
}
3.2.2、service8082
@RestController
@RequestMapping("zipkin")
public class HelloController {
    
    public static final String url = "http://localhost:8083/zipkin/service3";
    public static final String url2 = "http://localhost:8084/zipkin/service4";
    @Autowired
    OkHttpClient client;
    
    @GetMapping("/service2")
    public String service() throws Exception {
        System.out.println("-----调用service2-----");
        Request request1 = new Request.Builder().url(url).build();
        Request request2 = new Request.Builder().url(url2).build();
        
        Response response1 = client.newCall(request1).execute();
        Response response2 = client.newCall(request2).execute();
        return "service2【来自service3的信息:" + response1.body().string() +
                         ",来自service4的信息:"+ response2.body().string() + "】";

    }
}   
3.2.3、service8083
@RestController
@RequestMapping("zipkin")
public class HelloController {

    public static final String url = "http://localhost:8084/zipkin/service4";


    @Autowired
    OkHttpClient client;

    @GetMapping("/service3")
    public String service() throws Exception {
        System.out.println("-----调用service3-----");
        Request request = new Request.Builder().url(url).build();
        Response response = client.newCall(request).execute();
        return "service3," + response.body().string();
    }
}
3.2.4、service8084
@RestController
@RequestMapping("zipkin")
public class HelloController {
    
    public static final String url = "http://localhost:8086/zipkin/service5";
    
    @Autowired
    OkHttpClient client;
    
    @GetMapping("/service4")
    public String service() throws Exception {
        System.out.println("-----调用service4-----");
        Request request = new Request.Builder().url(url).build();
        Response response = client.newCall(request).execute();
        return "service4," + response.body().string();
    }
}
3.2.5、service8086
@RestController
@RequestMapping("zipkin")
public class HelloController {
    
    @GetMapping("/service5")
    public String service() throws Exception {
        System.out.println("-----调用service5-----");
        return "service5";
    }
}

四、测试和分析

http://127.0.0.1:8081/zipkin/service1

http://localhost:9411

4.1、发送请求

在这里插入图片描述

4.2、分析

spans分析
参数说明

在这里插入图片描述

调用测试

在这里插入图片描述

在这里插入图片描述

json样例数据
[
  {
    "traceId": "2ce03196265e9729",
    "parentId": "ce0b83f6e721e97d",
    "id": "f470b5a720074acd",
    "kind": "CLIENT",
    "name": "get",
    "timestamp": 1630251666804000,
    "duration": 1701000,
    "localEndpoint": {
      "serviceName": "service8082",
      "ipv4": "192.168.207.1"
    },
    "tags": {
      "http.url": "http://localhost:8083/zipkin/service3"
    }
  },
  {
    "traceId": "2ce03196265e9729",
    "parentId": "074e4cb45a59a76c",
    "id": "96fde753cf354c3e",
    "kind": "CLIENT",
    "name": "get",
    "timestamp": 1630251667658000,
    "duration": 747000,
    "localEndpoint": {
      "serviceName": "service8084",
      "ipv4": "192.168.207.1"
    },
    "tags": {
      "http.url": "http://localhost:8086/zipkin/service5"
    }
  },
  {
    "traceId": "2ce03196265e9729",
    "parentId": "f470b5a720074acd",
    "id": "074e4cb45a59a76c",
    "kind": "SERVER",
    "name": "get",
    "timestamp": 1630251667451000,
    "duration": 988000,
    "localEndpoint": {
      "serviceName": "service8084",
      "ipv4": "192.168.207.1"
    },
    "tags": {
      "http.status_code": "200",
      "http.url": "/zipkin/service4"
    }
  },
  {
    "traceId": "2ce03196265e9729",
    "parentId": "074e4cb45a59a76c",
    "id": "96fde753cf354c3e",
    "kind": "SERVER",
    "name": "get",
    "timestamp": 1630251668029000,
    "duration": 374000,
    "localEndpoint": {
      "serviceName": "service8086",
      "ipv4": "192.168.207.1"
    },
    "tags": {
      "http.status_code": "200",
      "http.url": "/zipkin/service5"
    }
  },
  {
    "traceId": "2ce03196265e9729",
    "parentId": "3e2b6810b608afc7",
    "id": "8803d668b0b3d243",
    "kind": "SERVER",
    "name": "get",
    "timestamp": 1630251668847000,
    "duration": 3000,
    "localEndpoint": {
      "serviceName": "service8086",
      "ipv4": "192.168.207.1"
    },
    "tags": {
      "http.status_code": "200",
      "http.url": "/zipkin/service5"
    }
  },
  {
    "traceId": "2ce03196265e9729",
    "parentId": "f470b5a720074acd",
    "id": "074e4cb45a59a76c",
    "kind": "CLIENT",
    "name": "get",
    "timestamp": 1630251667196000,
    "duration": 1247000,
    "localEndpoint": {
      "serviceName": "service8083",
      "ipv4": "192.168.207.1"
    },
    "tags": {
      "http.url": "http://localhost:8084/zipkin/service4"
    }
  },
  {
    "traceId": "2ce03196265e9729",
    "parentId": "ce0b83f6e721e97d",
    "id": "f470b5a720074acd",
    "kind": "SERVER",
    "name": "get",
    "timestamp": 1630251667042000,
    "duration": 1459000,
    "localEndpoint": {
      "serviceName": "service8083",
      "ipv4": "192.168.207.1"
    },
    "tags": {
      "http.status_code": "200",
      "http.url": "/zipkin/service3"
    }
  },
  {
    "traceId": "2ce03196265e9729",
    "parentId": "2ce03196265e9729",
    "id": "ce0b83f6e721e97d",
    "kind": "CLIENT",
    "name": "get",
    "timestamp": 1630251666391000,
    "duration": 2511000,
    "localEndpoint": {
      "serviceName": "service8081",
      "ipv4": "192.168.207.1"
    },
    "tags": {
      "http.url": "http://localhost:8082/zipkin/service2"
    }
  },
  {
    "traceId": "2ce03196265e9729",
    "id": "2ce03196265e9729",
    "kind": "SERVER",
    "name": "get",
    "timestamp": 1630251666347000,
    "duration": 2562000,
    "localEndpoint": {
      "serviceName": "service8081",
      "ipv4": "192.168.207.1"
    },
    "tags": {
      "http.status_code": "200",
      "http.url": "/zipkin/service1"
    }
  },
  {
    "traceId": "2ce03196265e9729",
    "parentId": "ce0b83f6e721e97d",
    "id": "3e2b6810b608afc7",
    "kind": "CLIENT",
    "name": "get",
    "timestamp": 1630251668505000,
    "duration": 347000,
    "localEndpoint": {
      "serviceName": "service8082",
      "ipv4": "192.168.207.1"
    },
    "tags": {
      "http.url": "http://localhost:8084/zipkin/service4"
    }
  },
  {
    "traceId": "2ce03196265e9729",
    "parentId": "2ce03196265e9729",
    "id": "ce0b83f6e721e97d",
    "kind": "SERVER",
    "name": "get",
    "timestamp": 1630251666651000,
    "duration": 2243000,
    "localEndpoint": {
      "serviceName": "service8082",
      "ipv4": "192.168.207.1"
    },
    "tags": {
      "http.status_code": "200",
      "http.url": "/zipkin/service2"
    }
  },
  {
    "traceId": "2ce03196265e9729",
    "parentId": "3e2b6810b608afc7",
    "id": "8803d668b0b3d243",
    "kind": "CLIENT",
    "name": "get",
    "timestamp": 1630251668511000,
    "duration": 339000,
    "localEndpoint": {
      "serviceName": "service8084",
      "ipv4": "192.168.207.1"
    },
    "tags": {
      "http.url": "http://localhost:8086/zipkin/service5"
    }
  },
  {
    "traceId": "2ce03196265e9729",
    "parentId": "ce0b83f6e721e97d",
    "id": "3e2b6810b608afc7",
    "kind": "SERVER",
    "name": "get",
    "timestamp": 1630251668510000,
    "duration": 342000,
    "localEndpoint": {
      "serviceName": "service8084",
      "ipv4": "192.168.207.1"
    },
    "tags": {
      "http.status_code": "200",
      "http.url": "/zipkin/service4"
    }
  }
]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值