当使用微服务构建我们的程序时,客户端的一次请求会产生大量服务调用,包括服务和数据库等中间件的调用。 由单体应用迁移至微服务时,服务间调用的延迟是我们需要面对的一个问题。为了定位每次调用过程中的延迟问题和性能瓶颈,我们需要知道客户端一次请求所经历的过程,分别调用了哪些服务,调用每个服务花费的时长,以及调用每个服务花费的时长,这些将会成为我们性能调优的参考。因此,分布式追踪系统是微服务架构中不可缺少的一部分。
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容器:
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示例应用:
go get github.com/jaegertracing/jaeger
cd $GOPATH/src/github.com/jaegertracing/jaeger
make install
cd examples/hotrod
go run ./main.go allHotROD示例应用是由frontend, customer, driver, route四个微服务组成的,当前HotROD的源码中这些服务默认监听的是127.0.0.1地址,
如果是在服务器上运行HotROD应用的话,可以修改以下HotROD源码中的监听地址。
frontend微服务监听的端口是8080,使用http://<hostip>:8080打开HotROD应用.
点击HotRod页面中的几个按钮进行基本的使用,此时在jaeger webui中就可以查询到收集到的跟踪数据。