点击上方蓝色“方志朋”,选择“设为星标”

回复“666”获取独家整理的学习资料!

我们都知道,微服务之间通过feign传递,在复杂的微服务架构系统中,几乎每一个前端请求都会形成一个复杂的分布式服务调用链路,在每条链路中任何一个依赖服务出现延迟超时或者错误都有可能引起整个请求最后的失败。当业务流程足够复杂时,一个完整的HTTP请求调用链一般会经过多个微服务系统,要通过日志来跟踪一整个调用链变得不再那么简单。通过sleuth可以很方便的看出每个采集请求的耗时情况,分析出哪些服务调用比较耗时,当服务调用的耗时随着请求量的增大而增大时,可以针对业务做一些优化措施。所以我们可以通过我们可以通过Spring Cloud Sleuth来解决这个问题。这里我们将演示如何通过Spring Cloud Sleuth来追踪这个过程,并借助Zipkin以图形化界面的方式展示。展示之前,分别介绍一下rabbitmq、sleuth、zinkip。

  1. rabbitmq

  • RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。

  • sleuth和zinkip

    • sleuth 是spring cloud的组成部分之一,为springcloud应用实现了一种分布式追踪解决方案,其兼容了zinkip,HTrace和log-based追踪

    • Zipkin 是一款开源的分布式实时数据追踪系统(Distributed Tracking System),基于 Google Dapper 的论文设计而来,由 Twitter公司开发贡献。其主要功能是聚集来自各个异构系统的实时监控数据,用来追踪微服务架构下的系统延时问题。Zipkin 的用户界面可以呈现一幅关联图表,以显示有多少被追踪的请求通过了每一层应用。Zipkin 以 Trace 结构表示对一次请求的追踪,又把每个 Trace 拆分为若干个有依赖关系的 Span。在微服务架构中,一次用户请求可能会由后台若干个服务负责处理,那么每个处理请求的服务就可以理解为一个 Span(可以包括 API 服务,缓存服务,数据库服务以及报表服务等)。当然这个服务也可能继续请求其他的服务,因此 Span 是一个树形结构,以体现服务之间的调用关系。Zipkin 的用户界面除了可以查看 Span 的依赖关系之外,还以瀑布图的形式显示了每个 Span 的耗时情况,可以一目了然的看到各个服务的性能状况。

    sleuth中的一些术语

    1. Span:基本工作单元,例如,在一个新建的span中发送一个RPC等同于发送一个回应请求给RPC,span通过一个64位ID唯一标识,trace以另一个64位ID表示,span还有其他数据信息,比如摘要、时间戳事件、关键值注释(tags)、span的ID、以及进度ID(通常是IP地址) ,span在不断的启动和停止,同时记录了时间信息,当你创建了一个span,你必须在未来的某个时刻停止它。

    2. Trace:一系列spans组成的一个树状结构,例如,如果你正在跑一个分布式工程,你可能需要创建一个trace。

    3. Annotation:用来及时记录一个事件的存在,一些核心annotations用来定义一个请求的开始和结束

    • cs - Client Sent -客户端发起一个请求,这个annotion描述了这个span的开始

    • sr - Server Received -服务端获得请求并准备开始处理它,如果将其sr减去cs时间戳便可得到网络延迟

    • ss - Server Sent -注解表明请求处理的完成(当请求返回客户端),如果ss减去sr时间戳便可得到服务端需要的处理请求时间

    • cr - Client Received -表明span的结束,客户端成功接收到服务端的回复,如果cr减去cs时间戳便可得到客户端从服务端获取回复的所有所需时间

    接下来就开始搭建
    这里cloud版本用的Greenwich.SR1,boot使用的是2.1.6

    1.在pom.xml中 引入sleuth依赖

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

    2.模拟两个日志 这两个服务之间通过feign调用,由test调用system,这里本来有一个注册中心,这里就不在演示了

    test模块

    @Slf4j
    @RestController
    public class TestController {@Autowiredprivate IHelloService helloService;@GetMapping("hello")public String hello(String name) {log.info("Feign调用system的/hello服务");return this.helloService.hello(name);}
    }
    

    在test模块的service包下创建IHelloService

    @FeignClient(value = "system",contextId = "helloServiceClient")
    public interface IHelloService {@GetMapping("hello")String hello(@RequestParam("name") String name);
    }
    

    system 模块

    @Slf4j
    @RestController
    public class TestController {@GetMapping("hello")public String hello(String name) {log.info("/hello服务被调用");return "hello" + name;}
    }
    

    3.访问接口 localhost:8202/test/hello?name=sleuth:会出现两个我们自定义的日志

    启动的时候查看test模块产生的

    2019-08-23 14:22:51.774  INFO [test,72bb0469bee07104,72bb0469bee07104,false] 22728 --- [nio-8202-exec-1] c.m.f.s.test.controller.TestController   : Feign调用system的/hello服务
    

    启动的时候查看system模块产生的

    2019-08-23 14:22:52.469  INFO [system,72bb0469bee07104,43597a6edded6f2e,false] 812 --- [nio-8201-exec-2] c.m.f.s.s.controller.TestController      : /hello服务被调用
    

    可以看到,日志里出现了[Test,72bb0469bee07104,72bb0469bee07104,false]信息,这些信息由Spring Cloud Sleuth生成,用于跟踪微服务请求链路。这些信息包含了4个部分的值,它们的含义如下:

    1. system微服务的名称,与spring.application.name对应;

    2. 72bb0469bee07104称为Trace ID,在一条完整的请求链路中,这个值是固定的。观察上面的日志即可证实这一点;

    3. 43597a6edded6f2e称为Span ID,它表示一个基本的工作单元;

    4. false表示是否要将该信息输出到Zipkin等服务中来收集和展示,这里我们还没有集成Zipkin,所以为false。

    下面我们来整合Zipkin

    在整合Zipkin之前,我们需要先搭建RabbitMQ。RabbitMQ用于收集Sleuth提供的追踪信息,然后Zipkin Server从RabbitMQ里获取,这样可以提升性能。

    在安装RabbitMQ之前,需要先安装Erlang/OTP,下载地址为:http://www.erlang.org/downloads/,下载exe文件安装即可。安装完毕后,下载RabbitMQ,下载地址为 :http://www.rabbitmq.com/install-windows.html,下载exe文件安装即可。

    安装完RabbitMQ之后,我们到RabbitMQ安装目录的sbin下执行如下命令

    rabbitmq-plugins enable rabbitmq_management
    

    然后在浏览器中输入http://localhost:15672,默认用户名和密码都是guest,登录后可看到:

    image

    点击Admin Tab页面,新增一个用户:

    image

    用户名为febs,密码为123456,角色为管理员。新添加的用户还是No access状态,需要进一步对该用户进行授权后,方可以远程通过该用户名访问。点击该新增用户名。进入授权页面,点击Set permission按钮,进行用户授权操作。安装好RabbitMQ后,我们开始整合Zipkin。在较低版本的Spring Cloud中,我们可以自己搭建Zipkin Server,现在我们只能使用官方搭建好的Zipkin Server,地址为:https://github.com/openzipkin/zipkin

    在cmd窗口下运行下面这条命令(windows下没有curl环境的话,可以在git bash中运行这条命令),下载zipkin.jar:

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

    如果下载速度极慢,可以复制链接到迅雷下载中下载,下载后重命名为zipkin.jar即可。

    zipkin支持将追踪信息保存到MySQL数据库,所以在运行zipkin.jar之前,我们先准备好相关库表,SQL脚本地址为:

    https://github.com/openzipkin/zipkin/blob/master/zipkin-storage/mysql-v1/src/main/resources/mysql.sql。
    

    库表准备好后,运行下面这条命令启动zipkin.jar:

    java -jar zipkin.jar --server.port=8402 --zipkin.storage.type=mysql --zipkin.storage.mysql.db=febs_cloud_base --zipkin.storage.mysql.username=root --zipkin.storage.mysql.password=123456 --zipkin.storage.mysql.host=localhost --zipkin.storage.mysql.port=3306 --zipkin.collector.rabbitmq.addresses=localhost:5672 --zipkin.collector.rabbitmq.username=febs --zipkin.collector.rabbitmq.password=123456
    

    上面命令指定了数据库链接和RabbitMQ链接信息。更多可选配置可以解压zipkin.jar,查看zipkin\BOOT-INF\classes路径下的zipkin-server-shared.yml配置类源码。

    启动好zipkin.jar后,在对应模块的pom里引入如下依赖:

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

    修改对应模块的application.yml

    spring:zipkin:sender:type: rabbitsleuth:sampler:probability: 1rabbitmq:host: localhostport: 5672username: febspassword: 123456
    

    spring.zipkin.sender.type指定了使用RabbitMQ收集追踪信息;

    spring.sleuth.sampler.probability默认值为0.1,即采样率才1/10,发送10笔请求只有一笔会被采集。为了测试方便,我们可以将它设置为1,即100%采样;

    spring.rabbitmq用于配置RabbitMQ连接信息,你可能会问,为什么刚刚RabbitMQ端口是15672,这里却配置为5672,是不是写错了呢?其实不是,15672是RabbitMQ的管理页面端口,5672是AMPQ端口。

    添加好配置后,启动system和test模块,发送一笔localhost:8202/test/hello?name=夏天请求后,使用浏览器访问http://localhost:8402/zipkin/链接,然后点击图中所示

    image

    image

    image

    查看依赖关系:

    image

    查看数据表,看是否存储了信息:

    image
    热门内容:
    
    • 干掉Navicat:正版,MySQL官方客户端真香!

    • JDK 16 即将发布,新特性速览!

    • 微服务架构中配置中心的选择

    • Java 项目权威排名:Nacos 未上版,Gradle 排名第二,Maven 排名 28

    最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。
    明天见(。・ω・。)ノ
    

rabbitmq sleuth zinkip 分布式链路追踪相关推荐

  1. 分布式链路追踪之Spring Cloud Sleuth夺命连环9问?

    点击上方☝码猿技术专栏 轻松关注,设为星标! 及时获取有趣有料的技术 大家好,我是不才陈某~ 这是<Spring Cloud 进阶>第九篇文章,往期文章如下: 五十五张图告诉你微服务的灵魂 ...

  2. Sleuth + Zipkin 微服务分布式链路追踪

    在开发环境中对业务问题的排查可以debugger计算时差等问题进行处理,如果架构复杂微服务嗲用众多,这样的方式就显得鸡肋. 如何快速发现问题? 如何判断故障影响范围? 如何梳理服务依赖以及依赖的合理性 ...

  3. 分布式链路追踪系统深入理解

    背景 对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk进行定位及分析问题,更有甚者直接远程服务器,使用各种linux命令单手操作查看日志,说到这,我也没摆脱这种困境.那么随着业务越 ...

  4. 分布式链路追踪深入了解

    分布式链路追踪系统 背景 对于普通系统或者服务来说,一般通过打日志来进行埋点,然后再通过elk进行定位及分析问题,更有甚者直接远程服务器,使用各种linux命令单手操作查看日志,说到这,我也没摆脱这种 ...

  5. 分布式链路追踪之SkyWalking

    一 链路追踪简介   在微服务架构中,一次请求往往涉及到多个模块,多个中间件,多台机器的相互协作才能完成.这一系列调用请求中,有些是串行的,有些是并行的,那么如何确定这个请求背后调用了哪些应用,哪些模 ...

  6. Gateway+Nacos+Sleuth+Zipkin网关链路追踪(测试及源码),Gateway+FeignClient+Nacos通过网关远程调用微服务(一)

    Gateway+Nacos+Sleuth+Zipkin网关链路追踪(测试及源码),Gateway+FeignClient+Nacos通过网关远程调用微服务(一) 问题背景 Gateway+Nacos+ ...

  7. 如何理解分布式链路追踪技术

    什么是链路追踪?微服务引发了怎样的问题? 在深入了解分布式链路追踪技术之前,我们需要先理解这项技术产生的背景,以及它能够帮我们解决哪些棘手的问题. 提到分布式链路追踪,我们要先提到微服务.相信很多人都 ...

  8. 谷粒商城二十五springCloud之Sleuth+Zipkin 服务链路追踪

    为什么用 分布式系统庞大而复杂,服务众多,调用关系网也非常复杂, 服务上线以后如果出现了某些错误,错误的异常就很难定位. 一个请求可能调用了非常多的链路,我们需要知道到底哪一块儿出现了错误. 最终希望 ...

  9. PHP分布式链路追踪,SkyWalking:分布式架构链路追踪-SkyWalking介绍

    前面几篇文章提到了微服务相关系统的使用与搭建,在微服务架构下的问题也比较突出.正常系统下我们的每个请求都会在同一个系统中进行输出.但是在微服务架构中一个请求可能设置一到多个服务进行处理.服务之间相互依 ...

最新文章

  1. yii2的model数据库配置以及应用(主从数据库配置)
  2. python数据导入一个列表_Python基础数据类型list 列表
  3. Codeforces Round #716 (Div. 2) (位运算AND)
  4. 纯手写实现HashMap
  5. 计算机信息管理系统设计原理探究,计算机信息管理系统设计原理探究
  6. 数据之路 - Python爬虫 - BeautifulSoup库
  7. 深度图像RGB-D(RGB+Depth Map)名词扫盲笔记
  8. 从零开始研发GPS接收机连载——3、用HackRF软件无线电平台作为GPS模拟器
  9. Unity 简单RPG对话系统——龙之谷2的NPC对话系统
  10. 概率Probability的本质是什么?[附概率基础知识,文末可下载28页PDF]
  11. 科幻-奇幻小说TOP100
  12. 杭电ACMSteps中Chapter One——Section 3中所有ac代码及解析
  13. 检验图片有没有被 P 过
  14. Python「剪藏」网页为 PDF
  15. 服务器开机grub gt 命令修复方法,开机grubgt命令修复方法
  16. EOS系列 - 账户名规则
  17. D. Ela and the Wiring Wizard codeforces 1737D
  18. PCB工艺设计规范-01
  19. promise兼容浏览器问题
  20. matlab里的随机数函数,MATLAB中常用的产生随机数的几种函数

热门文章

  1. Linux软件的安装,更新与卸载
  2. 7.Odoo产品分析 (二) – 商业板块(3) –CRM(1)
  3. ConcurrentHashMap实现原理及源码分析
  4. Python 出现 can't use a string pattern on a bytes-like object
  5. 青少年编程竞赛交流群周报(第040周)
  6. 【青少年编程(第31周)】一个有趣又有料的抖音号!
  7. 【第13周复盘】小朋友们也开始卷了
  8. 技术图文:进一步完善自动化交易系统 - 04
  9. 【建模必备】遗传算法的基本原理与步骤(编码/解码)
  10. 英特尔2022年投资者大会:公布技术路线图及重要节点