1.简述

最近在学习spring cloud构建微服务,研究追踪微服务rest服务调用链路的问题,接触到zipkin,而spring cloud也提供了spring-cloud-sleuth来方便集成zipkin实现。

我们准备了三个必要的程序来做测试,分别是
1、microservice-zipkin-server
负责数据收集以及信息展示功能。
2、microservice-zipkin-client-backend
负责微服务的生产者,对外提供 “http://127.0.0.1:11010/call/1” 的地址来完成一个简单的功能rest请求。
3、microservice-zipkin-client
负责微服务的调用,对外提供 "http://localhost:11009/call/1" 的rest地址,当访问此地址时,使用feign方式调用provider的rest服务地址。得到计算结果后,显示在界面上。

2.准备工作

三个程序功能非常简单,接下来我们看看每个程序的具体代码和配置。为了方便我们对三个模块开发,我们在父POM文件中添加了spring-boot和spring-cloud的依赖,避免子模块中需要写版本号

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.2.RELEASE</version>
</parent><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Dalston.RELEASE</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>

接下来我们看看三个程序中的相关配置

3.具体实现

3.1 microservice-zipkin-server

首先,我们添加maven依赖配置

<groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-server</artifactId>
</dependency>
<dependency><groupId>io.zipkin.java</groupId><artifactId>zipkin-autoconfigure-ui</artifactId><scope>runtime</scope>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

在这里为了测试方便,我们可以将数据保存到内存中,但是生产环境还是需要将数据持久化中。原生支持了很多产品,例如ES、数据库等,本例中我们采用将数据保存到内存中的方式来演示。

我们写一个启动类ZipkinServer,代码非常简单,如下

package com.yangyang.cloud;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import zipkin.server.EnableZipkinServer;/*** Created by chenshunyang on 2017/5/24.*/
@EnableZipkinServer
@SpringBootApplication
public class ZipkinServerApplication {public static void main(String[] args) {SpringApplication.run(ZipkinServerApplication.class,args);}
}

接下来我们配置application.ym配置文件

server:port: 11008
spring:application:name : microservice-zipkin-server

启动后 无异常输出,这样我们的server程序就OK了

3.2 microservice-zipkin-client-backend 与microservice-zipkin-client

这两个程序,与其他基础代码我们就不多讲了(相信学些到这一步的童鞋,都已经对spring cloud创建微服务以上手了),两个程序在spring-cloud-sleuth相关的配置都是一样。
首先,我们要在二者的POM文件中添加依赖,引入zipkin客户端自动配置相关依赖

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

其次,在配置文件application中,我们加入zipkin server收集信息的地址

spring:application:name: microservice-zipkin-client-backendzipkin:base-url: http://localhost:11008

这样我们的两个微服务就配置好了(注意这里我们并不会再说明如何写rest接口和使用feign调用rest接口),具体参考代码

4 测试

先后启动我们的三个程序

先启动microservice-zipkin-server 然后访问在浏览器中访问UI界面地址http://127.0.0.1:11008,

可以看到如下效果

image.png

其中Span Name选项为灰色不可选,说明目前没有数据,我们查看数据库也可以看到没有任何数据信息。

接下来我们访问consumer提供的访问地址 http://localhost:11009/call/1

刷新几次之后,我们再次刷新我们的zipkin界面,可以看到Span Name已经可以选择了。

image.png

点击Find Traces按钮,我们可以看到调用的链路和耗时情况,点击Dependencies,我们可以看到provider和consumer的调用图

image.png

OK,我们的简单实用spring-cloud-sleuth+zipkin的例子就完成了。

5.拓展

在测试的过程中我们会发现,有时候,程序刚刚启动后,刷新几次,并不能看到任何数据,原因就是我们的spring-cloud-sleuth收集信息是有一定的比率的,默认的采样率是0.1,配置此值的方式在配置文件中增加spring.sleuth.sampler.percentage参数配置(如果不配置默认0.1),如果我们调大此值为1,可以看到信息收集就更及时。但是当这样调整后,我们会发现我们的rest接口调用速度比0.1的情况下慢了很多,即时在0.1的采样率下,我们多次刷新consumer的接口,会发现对同一个请求两次耗时信息相差非常大,如果取消spring-cloud-sleuth后我们再测试,会发现并没有这种情况,可以看到这种方式追踪服务调用链路会给我们业务程序性能带来一定的影响。

其实,我们仔细想想也可以总结出这种方式的几种缺陷
缺陷1:zipkin客户端向zipkin-server程序发送数据使用的是http的方式通信,每次发送的时候涉及到连接和发送过程。
缺陷2:当我们的zipkin-server程序关闭或者重启过程中,因为客户端收集信息的发送采用http的方式会被丢失。

针对以上两个明显的缺陷,改进的办法是
1、通信采用socket或者其他效率更高的通信方式。
2、客户端数据的发送尽量减少业务线程的时间消耗,采用异步等方式发送收集信息。
3、客户端与zipkin-server之间增加缓存类的中间件,例如redis、MQ等,在zipkin-server程序挂掉或重启过程中,客户端依旧可以正常的发送自己收集的信息。

相信采用以上三种方式会很大的提高我们的效率和可靠性。其实spring-cloud以及为我们提供采用MQ或redis等其他的采用socket方式通信,利用消息中间件或数据库缓存的实现方式。下一次我们再来测试spring-cloud-sleuth-zipkin-stream方式的实现。

6.项目源码:

https://git.oschina.net/shunyang/spring-cloud-microservice-study.git
https://github.com/shunyang/spring-cloud-microservice-study.git

7.参考文档:

spring cloud 官方文档:https://github.com/spring-cloud/spring-cloud-sleuth

第三方:https://yq.aliyun.com/articles/78128?utm_campaign=wenzhang&utm_medium=article&utm_source=QQ-qun&201758&utm_content=m_19862

转载于:https://www.cnblogs.com/powerwu/articles/9851557.html

spring-cloud-sleuth+zipkin追踪服务实现(一)相关推荐

  1. 服务链路追踪配置mysql_学习微服务的服务链路追踪——Spring Cloud Sleuth+zipkin

    spring cloud sleuth提供了服务链路追踪,并兼容了zipkin,Zipkin是一个链路跟踪工具,可以用来监控微服务集群中调用链路的通畅情况. 1.本来想新建一个有关zipkin-ser ...

  2. Spring Cloud Sleuth + Zipkin 监控微服务(一)

    在之前搭建的服务注册中心的基础上,结合Spring Cloud Sleuth + Zipkin 监控微服务. 1.Zipkin server 从https://dl.bintray.com/openz ...

  3. SpringCloud 2020版本教程4:使用spring cloud sleuth+zipkin实现链路追踪

    点击关注公众号,Java干货及时送达 Spring Cloud Sleuth 主要功能就是在分布式系统中提供追踪解决方案,并且兼容支持了 zipkin,你只需要在pom文件中引入相应的依赖即可. 微服 ...

  4. Spring Cloud Sleuth+Zipkin 构建微服务链路跟踪系统

    什么是链路跟踪系统? 在微服务中,多个服务分布在不同物理机器上,各个服务之间相互调用.如何清晰地记录服务调用过程,并在出现问题的时候能够通过查看日志和服务之间的调用关系来定位问题,这样的系统就叫做链路 ...

  5. spring cloud学习进阶篇:Spring Cloud Sleuth + Zipkin 实现分布式跟踪解决方案

    2019独角兽企业重金招聘Python工程师标准>>> 简述 使用 spring cloud 用到最多的是各种rest服务调用,Twitter的Zipkin 是一种实现分布式跟踪解决 ...

  6. Spring Cloud Sleuth + zipkin + kafka

    2.2.5.RELEASE 1 说明 Spring Cloud Sleuth 是Spring Cloud的分布式链路追踪实现. 1.1 术语 Spring Cloud Sleuth采用的是Google ...

  7. Spring Cloud Sleuth 链路追踪

    文章目录 1 概述 2 基本使用 3 异步任务 4 定时任务 5 Zipkin 5.1 准备工作 5.2 实践 学习在 Spring Cloud 中使用 Sleuth 实现链路追踪,包括基本使用.异步 ...

  8. disabled spring cloud bus interation with spring cloud sleuth zipkin

    当spring cloud项目jar依赖里面同时包含类似下面这种: "org.springframework.cloud:spring-cloud-starter-bus-kafka&quo ...

  9. Spring Cloud Sleuth + Zipkin + RabbitMQ 监控微服务应用(二)

    前提是已经安装并启动了RabbitMQ服务. 1.Zipkin server 依旧使用zipkin-server-2.12.6-exec.jar,启动命令如下,指定rabbitmq的ip和访问账号密码 ...

  10. Spring Cloud Sleuth + Zipkin + RabbitMQ +MySQL(三)

    1.创建MySQL数据库和表 CREATE TABLE IF NOT EXISTS zipkin_spans (   `trace_id_high` BIGINT NOT NULL DEFAULT 0 ...

最新文章

  1. Chemistry.AI | 基于非线性激活的多层感知器预测分子特性
  2. instagram api java_如何在没有用户交互的情况下获得instagram access_token(新api)?...
  3. SQL存储过程分页(通用的拼接SQL语句思路实现)
  4. vue 接口节流_vue防抖节流之v-debounce--throttle使用指南
  5. c++全局变量怎么定义_C errno全局变量是否是线程安全的
  6. Manjaro.常用命令/ Mnajaro安装后的配置
  7. 20200225:最小路径和(leetcode64)
  8. dedecms 中变量函数
  9. 2021年大数据面试宝典完整版(含答案解析)
  10. mavonEditor编辑器的使用
  11. echarts南丁格尔玫瑰图
  12. Windows文件保护简介
  13. LINKERD 2.11 中文实战手册
  14. Ubuntu系统下打开chm文件
  15. 丝线行业调研报告 - 市场现状分析与发展前景预测(2021-2027年)
  16. 苹果EMS物流管理系统
  17. 七麦数据analysis参数算法还原
  18. JavaScript 炫酷第一步 抓取别人网站数据
  19. 电子劳动合同,为企业用工护航
  20. [HCIP] 03 - 路由控制之路由策略

热门文章

  1. CentOs 7.2下ELK日志分析系统搭建
  2. #我要10000+# 计划启动啦!让文章拥有更多曝光~
  3. 虚拟机nat固定IP上网配置
  4. 嵌入式开发之davinci--- 8168 电源调试总结
  5. Linux从零到高手的进阶心得
  6. linux-mint 安装 python 包 Gevent
  7. IE滤镜实现透明度/阴影/渐变等特效
  8. 通用算法-sql相似度模糊匹配
  9. Win7安vc2008编译报LINK : fatal error LNK1000: Internal error during IncrBuildImage
  10. Servlet3.0 || IDEA与tomcat的相关配置