SpringCloud技术指南系列(十五)分布式链路跟踪Sleuth与Zipkin实现

一、概述

分布式链路追踪,是一种用于分析和监控应用程序的方法,尤其是那些使用微服务架构的那些应用。分布式链路跟踪有助于查找故障发生位置和导致性能低下的原因。

SpringCloud全家桶中,整合了Sleuth和Zipkin做分布式链路跟踪和数据的收集展示。

Sleuth:为服务之间调用提供链路追踪。通过 Sleuth 可以很清楚的了解到一个服务请求经过了哪些服务,每个服务处理花费了多长。

Zipkin:可以使用它来收集各个服务器上请求链路的跟踪数据,并通过它提供的 REST API 接口来辅助我们查询跟踪数据以实现对分布式系统的监控程序,从而及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根源。

Spring Cloud Zipkin 整合了Sleuth和Zipkin的功能,提供了一套完整的分布式链路解决方案。

代码可以在SpringBoot组件化构建https://www.pomit.cn/java/spring/springcloud.html中的Zipkin组件中查看,并下载。

首发地址:
品茗IT-首发

如果大家正在寻找一个java的学习环境,或者在开发中遇到困难,可以加入我们的java学习圈,点击即可加入,共同学习,节约学习时间,减少很多在学习中遇到的难题。

二、准备工作

使用zipkin,要明白zipkin的客户端和服务端的概念:

  1. Sleuth是做链路跟踪的。Spring Cloud Sleuth就可以完成链路跟踪;
  2. Zipkin收集数据,如果Spring Cloud应用使用了Zipkin,它就相当于客户端;
  3. Zipkin服务端是单独部署的,单纯负责收集数据和展示等。

2.1 安装zipkin服务端

首先要安装zipkin的服务端,就是一个jar包,启动之后收集客户端数据并做展示。

Zipkin开源地址:https://github.com/openzipkin/zipkin

当你首次接触zipkin时,一定会各种博客上的文章给绕晕的,乱七八糟,各种写法,这是因为Spring Cloud版本不同,提供的功能逐渐丰富,而且zipkin也提供了快读部署的方案。

我当前使用的Spring Cloud zipkin版本为2.1.0.RELEASE。zipkin在github的提交最新记录为Commits on Oct 25, 2019。

下面开始讲安装:

很多博客都是写的自己打包编译zipkin,然后用@EnableZipkinServer注解Spring boot应用来启动zipkin服务端。这种方式已经被官网遗弃,@EnableZipkinServer注解也被标记为@Deprecated。

所以,它给了一种更简单的部署方案:

curl -sSL https://zipkin.io/quickstart.sh | bash -s
java -jar zipkin.jar

如果用 Docker 的话,直接

docker run -d -p 9411:9411 openzipkin/zipkin

然后通过9411端口访问即可,比如我的是:http://10.247.62.23:9411

2.2 SpringCloud应用引入依赖

需要引入spring-boot-starter-web和spring-cloud-starter-zipkin;

因为使用了consul做服务注册发现,需要引入spring-cloud-starter-consul-discovery和spring-cloud-starter-netflix-ribbon。

依赖如下:

<?xml version="1.0"?>
<projectxsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><modelVersion>4.0.0</modelVersion><parent><groupId>cn.pomit</groupId><artifactId>springcloudwork</artifactId><version>0.0.1-SNAPSHOT</version></parent><artifactId>SleuthZipkin</artifactId><name>SleuthZipkin</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><maven-jar-plugin.version>2.6</maven-jar-plugin.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-zipkin</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></dependency></dependencies>
</project>

父模块pom文件可以在https://www.pomit.cn/spring/SpringCloudWork/pom.xml获取。

3.2 配置文件

这里使用yaml文件写配置,配置文件application.yml:

application.yml:

server:port: 8111
spring:application:name: sleuthZipkinsleuth:web:client:enabled: truesampler:probability: 1.0 # 将采样比例设置为 1.0,也就是全部都需要。默认是 0.1zipkin:base-url: http://10.247.62.23:9411/ # 指定了 Zipkin 服务器的地址cloud:consul:host: 10.247.62.23port: 8500discovery:prefer-ip-address: truehealthCheckPath: /consul/health

这里,应用名称是sleuthZipkin,在8111端口监听。

  • spring.cloud.consul开头的配置时consul服务注册发现的配置。前面章节已经有说明。
  • spring.sleuth.*是sleuth的配置,开启webClient,并设置采样比例为1.0,即全部采样。
  • spring.zipkin.base-url:指定了 Zipkin 服务器的地址,就是上面我部署的那个zipkin服务端。

配置完成后,之后就是普通的调用和服务了。下面的第四章节将代码展示出来,第五章节介绍下链路跟踪zipkin的展示和用法。

四、启动服务注册发现

我这里启动了三个服务做测试,分别为consulServer、consulClient和sleuthZipkin。

链路是从sleuthZipkin -> consulClient -> consulServer.

4.1 启动类

使用@EnableDiscoveryClient注解启动类, @EnableDiscoveryClient是将项目作为客户端注册到注册中心的注解,开启服务发现功能。

SleuthZipkinApplication :

package cn.pomit.springbootwork.zipkin;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;@EnableDiscoveryClient
@SpringBootApplication
public class SleuthZipkinApplication {public static void main(String[] args) {SpringApplication.run(SleuthZipkinApplication.class, args);}@Bean@LoadBalancedRestTemplate restTemplate() {return new RestTemplate();}
}

这里的RestTemplate使用@LoadBalanced注解,我们跟踪RestTemplate的时候可以看到,RestTemplate多了个LoadBalancerInterceptor。

4.2 健康检查

不管是服务注册还是服务调用,都需要写健康检查接口。前面写了我们健康检查地址是/consul/health,这里要开放个接口,让consul来检查身体。

package cn.pomit.springbootwork.zipkin.web;import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/consul")
public class HealthWeb {@RequestMapping(value = "health", method = { RequestMethod.GET })public String health() {return "check health";}}

4.3 Ribbon做服务调用

如果我们使用Ribbon做服务调用,需要使用RestTemplate,这个RestTemplate是标识为负载均衡的。我们来调用上一篇提供的ip服务:

IpInfoService :


package cn.pomit.springbootwork.zipkin.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;import cn.pomit.springbootwork.zipkin.model.ResultModel;@Service
public class IpInfoService {/*** 第一个consulServer是配置文件种的spring.application.name,第二个是controller中配置的路径*/public static String remoteIpServiceUrl = "http://consulClient/consulClient/ip";@Autowiredprivate RestTemplate restTemplate;public ResultModel getIpInfo() {ResponseEntity<ResultModel> ipModel = restTemplate.getForEntity(remoteIpServiceUrl, ResultModel.class);return ipModel.getBody();}
}

这里,第一个consulClient是服务提供方配置文件种的spring.application.name,第二个consulClient是服务提供方的controller中配置的路径。我们使用统一的实体ResultModel进行数据接收转换。

4.4 测试Web

SleuthZipkinRest :

package cn.pomit.springbootwork.zipkin.web;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;import cn.pomit.springbootwork.zipkin.model.ResultModel;
import cn.pomit.springbootwork.zipkin.service.IpInfoService;@RestController
@RequestMapping("/sleuthTest")
public class SleuthZipkinRest {@AutowiredIpInfoService ipInfoService;@RequestMapping(value = "/ip", method = { RequestMethod.GET })public ResultModel ip() {return ipInfoService.getIpInfo();}
}

五、链路跟踪展示

我这里对三个服务调用链路sleuthZipkin -> consulClient -> consulServer的不同形式做测试和分析,下面是分析的几种情况:

5.1 单一调用方使用zipkin

只有sleuthZipkin开启了sleuth和zipkin。consulClient 和consulServer都未开启zipkin。

5.1.1 正常情况

这种情况下,只显示sleuthZipkin调用consulClient的情况,展示两个应用的调用情况:

5.1.2 异常情况

如果将consulServer停掉,会显示sleuthZipkin调用consulClient的异常情况,只能到consulClient,展示两个应用的调用情况:

5.2 中间商也使用zipkin

sleuthZipkin和consulClient 都开启了sleuth和zipkin。consulServer为最后调用级别,不开启zipkin了。

5.2.1 正常情况

这种情况下,显示sleuthZipkin -> consulClient -> consulServer的调用情况:

5.2.2 异常情况

如果将consulServer停掉,会显示consulClient调用consulServer的异常情况,会显示完整的调用链:

六、过程中用到的实体

过程中用到了ResultModel实体,作为统一的实体来用。

ResultModel:


详细完整的实体,可以访问品茗IT-博客《SpringCloud技术指南系列(十四)分布式锁之Zookeeper实现》进行查看

品茗IT-博客专题:https://www.pomit.cn/lecture.html汇总了Spring专题、Springboot专题、SpringCloud专题、web基础配置专题。

快速构建项目

Spring项目快速开发工具:

一键快速构建Spring项目工具

一键快速构建SpringBoot项目工具

一键快速构建SpringCloud项目工具

一站式Springboot项目生成

Mysql一键生成Mybatis注解Mapper

Spring组件化构建

SpringBoot组件化构建

SpringCloud服务化构建

喜欢这篇文章么,喜欢就加入我们一起讨论SpringCloud使用吧!

SpringCloud技术指南系列(十五)分布式链路跟踪Sleuth与Zipkin实现相关推荐

  1. SpringCloud技术指南系列(十三)分布式锁之Redis实现(redisson)

    SpringCloud技术指南系列(十三)分布式锁之Redis实现(redisson) 一.概述 分布式锁是控制分布式系统之间同步访问共享资源的一种方式.在分布式系统中,常常需要协调他们的动作.如果不 ...

  2. Spring Cloud 分布式链路跟踪 Sleuth + Zipkin + Elasticsearch

    2019独角兽企业重金招聘Python工程师标准>>> 随着业务越来越复杂,系统也随之进行各种拆分,特别是随着微服务架构的兴起,看似一个简单的应用,后台可能很多服务在支撑:一个请求可 ...

  3. gateway网关_SpringCloud技术指南系列(十二)API网关之Gateway使用

    SpringCloud技术指南系列(十二)API网关之Gateway使用 一.概述 API网关是一个更为智能的应用服务器,它的定义类似于面向对象设计模式中的Facade模式,它的存在就像是整个微服务架 ...

  4. WCF技术剖析之十五:数据契约代理(DataContractSurrogate)在序列化中的作用

    如果一个类型,不一定是数据契约,和给定的数据契约具有很大的差异,而我们要将该类型的对象序列化成基于数据契约对应的XML.反之,对于一段给定的基于数据契约的XML,要通过反序列化生成该类型的对象,我们该 ...

  5. Vue3官网-高级指南(十五)Vue 与 Web Components

    Vue3官网-高级指南(十五)Vue 与 Web Components 文章目录 Vue3官网-高级指南(十五)Vue 与 Web Components 1. Vue 与 Web Components ...

  6. 跟我学SpringCloud | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪

    SpringCloud系列教程 | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪 Springboot: 2.1.6.RELEASE SpringCloud: ...

  7. ELK系列(十五)、Elasticsearch核心原理一篇全搞定

    目录 Lucene 介绍 核心术语 如何理解倒排索引? 检索方式 分段存储 段合并策略 Elasticsearch 核心概念 节点类型 集群状态 3C和脑裂 1.共识性(Consensus) 2.并发 ...

  8. 数学之美 系列十五 繁与简 自然语言处理的几位精英

    数学之美 系列十五 繁与简 自然语言处理的几位精英 我在数学之美系列中一直强调的一个好方法就是简单.但是,事实上,自然语言处理中也有一些特例,比如有些学者将一个问题研究到极致,执著追求完善甚至可以说完 ...

  9. 开发指南专题十五 JEECG微云快速开发平台EXCEL导入导出

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴!  开 ...

最新文章

  1. 有状态会话Bean(SLSB)和无状态会话Bean(SFSB)的区别
  2. Windows消息机制学习笔记(二)—— 窗口与线程
  3. Tengine ngx_http_sysguard_module 过载保护模块使用
  4. 【Java】switch 是否能作用在 byte 上,是否能作用在 long 上,是否能作用在 String 上
  5. C语言中输入输出格式控制
  6. RuoYi-Cloud 部署篇_03(windows环境 mysql版本)
  7. WPF Visibility的用法
  8. Linux内核同步机制--自旋锁【转】
  9. 647.回文字符串 (力扣leetcode) 博主可答疑该问题
  10. 刀片服务器接显示器,认识刀片服务器
  11. 《一只特例独行的猪》摘抄
  12. Inspector检视视图
  13. Chrome Extension 介绍
  14. iPhone6无法开机、不能开机的解决方法
  15. 《曹云社》走进东软:奇妙的HR数字化
  16. 【kmp】似乎在梦中见过的样子
  17. 机器学习 2014斯坦福大学课程: 4-1 神经网络
  18. 我在VsCode上看基金,你呢?
  19. 征信系统出新政 互联网金融与征信互补
  20. 框架学习——WCF框架

热门文章

  1. 合适的工作就是好工作
  2. 快排 递归三种方式+非递归 --排序
  3. C++ 新手必备:文件分割器
  4. S5PV210的开发板刷机
  5. 电子器件系列八:肖特基二极管
  6. 什么广播域?什么是冲突域?冲突域和广播域的区别:
  7. 仿知乎论坛社区社交微信小程序
  8. SpringCloud微服务前后端分离开发中出现的弱智问题之(不支持当前请求方法)
  9. 作业案例—设计学生类
  10. 清理桌面不能删除不掉的Internet图标