Spring Cloud Zipkin服务端追踪服务

Spring Cloud Zipkin是一个分布式跟踪系统,用于提供跨越多个微服务的请求追踪解决方案。它基于Google Dapper的论文设计实现,通过收集和分析各个服务器之间的交互来提供微服务应用的链路跟踪支持。

以下是实现Spring Cloud Zipkin服务端追踪服务的攻略:

1. 添加依赖

首先,我们需要在Spring Boot应用的pom.xml文件中添加必要的Spring Cloud Zipkin依赖。具体如下:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>

2. 启用Zipkin服务

Zipkin服务可以通过运行zipkin-server Jar(可以从Maven中央仓库中下载)开启。首先,需要从Zipkin官网下载zipkin-server Jar包并运行。下载地址:https://zipkin.io/pages/quickstart.html

可以通过以下命令来启动Zipkin注入类:

@SpringBootApplication
@EnableZipkinServer
public class ZipkinServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(ZipkinServiceApplication.class, args);
    }
}

可以通过访问从命令行输出的特定URL(http://localhost:9411/zipkin/)来访问Zipkin Web UI。

3. 启用二进制传输

默认情况下,Zipkin使用HTTP JSON提交跟踪数据。但是,它同时也支持使用Google Protobuf协议在二进制层面上传输跟踪数据,这样能够减少负载和延迟(HTTP JSON的大小和格式可能会占用更多的带宽和处理时间)。

可以通过添加以下依赖来启用Protobuf:

<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>3.9.1</version>
</dependency>
<dependency>
    <groupId>io.zipkin.reporter2</groupId>
    <artifactId>zipkin-reporter-metrics-micrometer</artifactId>
    <version>2.15.0</version>
</dependency>

然后,可以配置zipkin-sender-url为:

spring.zipkin.sender.type: com.github.kristofa.brave.http.DefaultSpanNameProvider

4. 将Zipkin与Spring Cloud Sleuth集成

Spring Cloud Sleuth提供了基于两个HTTP头信息(X-B3-TraceId和X-B3-SpanId)的追踪实现。此外,它还提供了一组注解,用于标记一些特殊的方法和过程,从而能够在具有繁忙线程的异步设置中进行跟踪。以下是集成Zipkin和Sleuth的详细步骤:

声明依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>

配置服务名称和端口号

spring:
  application:
    name: zipkin-demo
server:
  port: 9999

开启Zipkin和Sleuth的支持

@SpringBootApplication
@EnableZipkinStreamServer
@EnableBinding(Sink.class)
public class ZipkinStreamServer {

    public static void main(String[] args) {
        SpringApplication.run(ZipkinStreamServer.class, args);
    }

    @StreamListener(Sink.INPUT)
    public void log(Span span) {
        System.out.println("TraceId====>"+span.traceIdString()+"||SpanId====>"+span.id());
    }
}

在以上代码中,@EnableZipkinStreamServer是用于启用Zipkin的Stream支持,这样可以使用canary版本的Zipkin。

启用注解

Sleuth提供了一些注解,可以用于跨越多个方法和过程进行Tracing。这些注解被定义在:org.springframework.cloud:spring-cloud-sleuth-core库中。在以下示例中,我们在示例Controller类中添加了@NewSpan注解,以将该请求标记为一个新的Span,然后分别执行两个方法,并在其中一个方法中添加了@ContinueSpan注解。

@RestController
public class TestController {

    @Autowired RestTemplate restTemplate;

    @GetMapping("/hello")
    @NewSpan
    public String hello() {
        return "Hello";
    }

    @GetMapping("/world")
    @ContinueSpan(log = "第二个方法")
    public String world() {
        return restTemplate.getForObject("http://localhost:8080/hello", String.class);
    }
}

需要注意以下问题:
1. 新的Span是在“hello”方法中创建的,并且该Span将在“world”方法中继续(因为@ContinueSpan注解与“world”方法相关联)。
2. 在“world”方法中,我们使用RestTemplate发起了另一个HTTP请求,并从http://localhost:8080/hello服务返回了响应。
3. 另一个Span是从服务中返回的,并将在控制台日志中记录。

以上是关于Spring Cloud Zipkin服务端追踪服务的完整攻略。需要注意的是,还可以将Zipkin与Spring Cloud Config、Eureka等服务一起使用,以实现更好的分布式跟踪能力。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Cloud Zipkin服务端追踪服务 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • C++中的new/delete、构造/析构函数、dynamic_cast分析

    C++ 中的 new/delete、构造/析构函数和 dynamic_cast 是面向对象编程中非常重要的概念。本攻略将为你详细讲解这三个概念的含义和用法。 new/delete 在 C++ 中,new 和 delete 是动态内存分配和释放运算符。new 运算符用于分配动态内存,delete 运算符用于释放动态内存。它们可以用于任意类型的数据。 示例说明 …

    other 2023年6月26日
    00
  • JS精髓原型链继承及构造函数继承问题纠正

    下面是关于“JS精髓原型链继承及构造函数继承问题纠正”的完整攻略。 原型链继承 在JavaScript中,对象可以通过原型链进行继承。原型链是一个对象到另一个对象的链,每个对象都有一个指向它的原型对象的引用。 实现原型链继承 示例代码如下: function Animal() { this.name = ‘animal’; this.showName = f…

    other 2023年6月26日
    00
  • java中hasnext方法

    Java中hasNext()方法 hasNext()是Scanner类中的方法之一,它的主要功能是判断是否还有输入值。在Java中,Scanner类是一个强大的工具,它可以解析基本类型和字符串数据。本文将介绍hasNext()方法的详细用法和实现过程。 简介 hasNext()方法是Java中一个常用的输入检查操作,它可以用来判断输入流中是否还有数据可以读取…

    其他 2023年3月28日
    00
  • Linux之进程间通信(共享内存【mmap实现+系统V】)

    Linux之进程间通信(共享内存[mmap实现+系统V])攻略 简介 进程间通信(IPC)是操作系统中重要的概念,它允许不同的进程之间进行数据交换和共享资源。共享内存是一种高效的进程间通信机制,它允许多个进程访问同一块内存区域,从而实现数据共享。 本攻略将详细介绍Linux中共享内存的实现方式,包括mmap和系统V共享内存。 mmap实现共享内存 mmap是…

    other 2023年8月1日
    00
  • qq语音视频聊天没有声音(对方听不到我的声音)的解决方案

    qq语音视频聊天没有声音的解决方案 如果在使用QQ语音视频聊天时出现对方听不到我的声音的情况,可能是以下原因造成的: 电脑麦克风或扬声器的设置有误。 QQ软件设置有误。 系统设置中麦克风或扬声器被禁用。 接下来,我们将分别介绍以上三种情况的解决方案。 电脑麦克风或扬声器的设置有误 如果电脑麦克风或扬声器的音量过小,或者麦克风被关闭,就会出现对方听不到你的声音…

    other 2023年6月26日
    00
  • ExtJS4 表格的嵌套 rowExpander应用

    { id: 1, name: ‘John Doe’, email: ‘john@example.com’, phone: ‘1234567890’, address: ‘123 Main St’ }, { id: 2, name: ‘Jane Smith’, email: ‘jane@example.com’, phone: ‘0987654321’, ad…

    other 2023年7月28日
    00
  • synchronized优化

    synchronized优化的完整攻略 synchronized是Java中用于实现线程同步的关键字,可以保证多个线程对共享资源的访问顺序和互斥性。但是,在高并发场景下,synchronized的性能可能会成为瓶颈,因此需要进行优化。本文将介绍synchronized优化的完整攻略,包括使用锁粒度、使用CAS、使用读写锁、使用分段锁和两个示例说明。 使用锁粒…

    other 2023年5月9日
    00
  • C++实现LeetCode(83.移除有序链表中的重复项)

    下面是关于“C++实现LeetCode(83.移除有序链表中的重复项)”的完整攻略。 题目描述 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。 示例1: 输入: 1->1->2 输出: 1->2 示例2: 输入: 1->1->2->3->3 输出: 1->2->3 解题思路 由于链表已经是…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部