链路追踪

1 概念

分布式计算八大误区

网络可靠。

延迟为零。

带宽无限。

网络绝对安全。

网络拓扑不会改变。

必须有一名管理员。

传输成本为零。

网络同质化。(操作系统-协议)

链路追踪的必要性

如果能跟踪每个请求-中间请求经过哪些微服务-请求耗时-网络延迟-业务逻辑耗时等。我们就能更好地分析系统瓶颈、解决系统问题。因此链路跟踪很重要。

> 《链路追踪》看看微服务之熵。

我们自己思考解决方案:在调用前后加时间戳。捕获异常。

链路追踪目的:解决错综复杂的服务调用中链路的查看。排查慢服务。

市面上链路追踪产品-大部分基于google的Dapper论文。

``sh zipkin,twitter开源的。是严格按照谷歌的Dapper论文来的。pinpoint 韩国的 Naver公司的。Cat 美团点评的EagleEye 淘宝的 `

链路追踪要考虑的几个问题

  • 探针的性能消耗。尽量不影响 服务本尊。
  • 易用。开发可以很快接入-别浪费太多精力。
  • 数据分析。要实时分析。维度足够。
  • Sleuth简介

    Sleuth是Spring cloud的分布式跟踪解决方案。

  • span(跨度)-基本工作单元。一次链路调用-创建一个span-
  • span用一个64位id唯一标识。包括:id-描述-时间戳事件-spanId,span父id。

    span被启动和停止时-记录了时间信息-初始化span叫:root span-它的span id和trace id相等。

  • trace(跟踪)-一组共享“root span”的span组成的树状结构 称为 trace-trace也有一个64位ID-trace中所有span共享一个trace id。类似于一颗 span 树。
  • annotation(标签)-annotation用来记录事件的存在-其中-核心annotation用来定义请求的开始和结束。
  • - CS(Client Send客户端发起请求)。客户端发起请求描述了span开始。 - SR(Server Received服务端接到请求)。服务端获得请求并准备处理它。SR-CS=网络延迟。 - SS(Server Send服务器端处理完成-并将结果发送给客户端)。表示服务器完成请求处理-响应客户端时。SS-SR=服务器处理请求的时间。 - CR(Client Received 客户端接受服务端信息)。span结束的标识。客户端接收到服务器的响应。CR-CS=客户端发出请求到服务器响应的总时间。

    其实数据结构是一颗树-从root span 开始。

    > 《链路树演示》

    2 使用

    #### Sleuth单独

  • pom
  • 每个需要监控的系统

    `sh org.springframework.cloud spring-cloud-starter-sleuth `

    测试点:

  • 启动eureka 7900-service-sms 8002-api-driver 9002.
  • 访问一次。看日志结果。
  • `sh [api-driver,1a409c98e7a3cdbf,1a409c98e7a3cdbf,true] [服务名称-traceId(一条请求调用链中 唯一ID)-spanID(基本的工作单元-获取数据等)-是否让zipkin收集和展示此信息]看下游[service-sms,1a409c98e7a3cdbf,b3d93470b5cf8434,true]traceId- 是一样的。服务名必须得写。 `

    #### zipkin

    上面拍错看日志-很原始。刀耕火种-加入利器 zipkin。

    zipkin是twitter开源的分布式跟踪系统。

    原理收集系统的时序数据-从而追踪微服务架构中系统延时等问题。还有一个友好的界面。

    由4个部分组成:

    Collector、Storage、Restful API、Web UI组成

    采集器-存储器-接口-UI。

    原理:

    sleuth收集跟踪信息通过http请求发送给zipkin server-zipkin将跟踪信息存储-以及提供RESTful API接口-zipkin ui通过调用api进行数据展示。

    默认内存存储-可以用mysql-ES等存储。

    操作步骤:

  • 每个需要监听的服务的pom中添加。
  • `sh org.springframework.cloud spring-cloud-starter-zipkin `

  • 每个需要监听的服务yml中
  • `sh spring: #zipkin zipkin: base-url: http://localhost:9411/ #采样比例1 sleuth: sampler: rate: 1 `

  • 启动zipkin。
  • `sh jar包下载:curl -sSL https://zipkin.io/quickstart.sh | bash -s我放到了 目录:C:githubonline-taxi-demo 下面。java -jar zipkin.jar或者docker:docker run -d -p 9411:9411 openzipkin/zipkin `

    测试点:

    访问zipkin:http://localhost:9411/zipkin/

    启动:eureka7900-service-sms 8002-api-driver 9002

    发起一次 yapi ->api-driver->司机发送验证码。

    观察zip界面-点查找-点依赖。

    看查找下的时间。

    再制造一次熔断-看看zipkin。停止service-sms-访问。会看到变红。

    zipkin:最好和rabbitmq-mysql配合使用。

    健康检查

    使用

  • admin 组件端 = 项目:(cloud-admin):pom
  • `sh server端: de.codecentric spring-boot-admin-starter-server de.codecentric spring-boot-admin-server-ui `

  • 每个需要监控的服务-都加
  • `sh pom: org.springframework.boot spring-boot-starter-actuatoryml:management: endpoints: web: exposure: #yml加双引号-properties不用加 include: "*" health: ##默认是never show-details: ALWAYS enabled: true `

  • 访问server
  • `sh http://localhost:6010/root/root `

    小插曲 正六边形算法。

    邮件监控 -在admin组件中。

  • pom
  • `sh org.springframework.boot spring-boot-starter-mail `

  • yml
  • `sh spring: application: name: cloud-admin security: user: name: root password: root # 邮件设置 mail: host: smtp.qq.com username: 单纯QQ号 password: xxxxxxx授权码 properties: mail: smpt: auth: true starttls: enable: true required: true#收件邮箱spring.boot.admin.notify.mail.to: 2634982208@qq.com # 发件邮箱spring.boot.admin.notify.mail.from: xxxxxxx@qq.com ``

  • 下线一个服务。
  • 去邮箱查看。