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. 一位中科院自动化所博士毕业论文的致谢:二十二载风雨求学路,他把自己活成了光.........
  2. AI开放只是幌子?科技巨头边承诺开放边申请专利
  3. zabbix配置外部邮件服务器进行邮件报警
  4. boost::unique_copy相关的测试程序
  5. java 取dataset_Java LineDataSet.getYVals方法代码示例
  6. 斐波那契数列 C++ 实现代码
  7. 【kafka】Flink 消费 kafka Received unknown topic topic/partition may not exist Describe access to it
  8. .NET中的DES对称加密
  9. android 资料
  10. pycharm中不能安装bs4的解决方案
  11. Oracle体系结构图(思维导图及详解)
  12. html form回调函数,js 中的submit 回调函数
  13. springcloud Netflix
  14. mysql MERGE 错误(differently defined or of non-MyISAM type)
  15. 程序员开发常用英语词汇汇总,满满的干货!
  16. Re2:读论文 CS-GNN Measuring and Improving the Use of Graph Information in Graph Neural Networks
  17. 既然都有了NS,何不再入一个喷喷(Splatoon 2)【上】
  18. 推荐系统学习笔记-FNN
  19. How to evaluate and motivate a speech
  20. 江西彩礼到底有多高?我问了问身边的朋友们……

热门文章

  1. 移动端通过ajax上传图片(文件)并在前台展示——通过H5的FormData对象
  2. php访问mysql工具类
  3. java JFrame修改左上角的图片
  4. SQL Server中的锁的简单学习
  5. c++ using namespace std; - 海明威 - 博客园
  6. C# 设置Menustrip提示框的显示
  7. html5常用的属性标签,HTML5常用标签及其属性设置
  8. 栈和队列的算法题总结
  9. IntelliJ IDEA绑定Github报Error 403: Not Authorized没有授权问题解决方法
  10. Python 技术篇-连接oracle数据库并执行sql语句实例演示,python连接oracle数据库oci详细配置方法