当使用微服务构建我们的程序时,客户端的一次请求会产生大量服务调用,包括服务和数据库等中间件的调用。 由单体应用迁移至微服务时,服务间调用的延迟是我们需要面对的一个问题。为了定位每次调用过程中的延迟问题和性能瓶颈,我们需要知道客户端一次请求所经历的过程,分别调用了哪些服务,调用每个服务花费的时长,以及调用每个服务花费的时长,这些将会成为我们性能调优的参考。因此,分布式追踪系统是微服务架构中不可缺少的一部分。

1.Jaeger简介

Jaeger是Uber开源的分布式跟踪系统,现在已经成为CNCF的开源项目,其灵感来源于Google的Dapper和twitter的Zipkin,从2016年开始该系统在Uber内部得到了广泛的应用。

Jaege在设计上参考了Google的Dapper。Dapper是Google内部大规模分布式追踪系统。关于Dapper的内容可以参考Google的论文:

本篇博文的主要目的是基于Jaeger官方的all-in-one docker镜像和示例应用HotRod快速体验一下Jaeger。

2.Jaeger Docker All in one容器

jaeger提供了一个all in one的docker镜像,主要用来体验和测试。这个镜像内包含了query, collector, agent, memory storage等组件。

下面启动jaeger docker all in one容器:

1
2
3
4
5
6
7
8
9
docker run -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
  -p5775:5775/udp \
  -p6831:6831/udp \
  -p6832:6832/udp \
  -p5778:5778 \
  -p16686:16686 \
  -p14268:14268 \
  -p9411:9411 \
  jaegertracing/all-in-one:latest

上面启动jaeger容器暴露了很多端口:

端口号 协议 组件 功能
5775 UDP agent 通过thrift的compact协议接收zipkin.thrift数据
6831 UDP agent 通过thrift的compact协议接收jaeger.thrift数据
6832 UDP agent 通过thrift的binary协议接收jaeger.thrift数据
5778 HTTP agent 服务配置接口
16686 HTTP web Jaeger Web UI的端口
9411 HTTP collector 兼容zipkin的http端点

容器启动后使用下面的的地址访问jaeger webui: http://<hostip>:16686

3.HotROD示例应用

jaeger是使用go语言开发的,HotRod的示例应用位于jaeger源码的examples目录下。

运行HotROD示例应用:

1
2
3
4
5
go get github.com/jaegertracing/jaeger
cd $GOPATH/src/github.com/jaegertracing/jaeger
make install
cd examples/hotrod
go run ./main.go all

HotROD示例应用是由frontend, customer, driver, route四个微服务组成的,当前HotROD的源码中这些服务默认监听的是127.0.0.1地址, 如果是在服务器上运行HotROD应用的话,可以修改以下HotROD源码中的监听地址。

frontend微服务监听的端口是8080,使用http://<hostip>:8080打开HotROD应用.

点击HotRod页面中的几个按钮进行基本的使用,此时在jaeger webui中就可以查询到收集到的跟踪数据。

参考