分布式调用链追踪能有效地监控服务间的网络延时并可视化微服务中的数据流转。ServiceComb扩展了zipkin的接口提供了服务内部的链路调用信息,能提供更完整的调用链路信息,更容易定位问题和潜在性能问题。
本文将介绍ServiceComb 提供的分布式调用链追踪能力及使用指导。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/7c369e0f81a19a40b884cffc159d9865.png)
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/64bc5c217a12cd86fe8506d4fb344582.jpeg)
一. 异常场景示例
我们将使用ServiceComb的入门案例BMI(体质指数应用),展示ServiceComb的调用链追踪和自定义调用链追踪能力。BMI应用程序包含体质指数计算calculator和服务网关webapp两个服务。
参见ServiceComb的入门案例BMI指导
http://servicecomb.apache.org/cn/docs/quick-start/
我们给BMI的体质计算服务增加了异常代码,如下。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/e72c3dc3fd410fe3a529c063ce9bac76.png)
参见BMI程序使用指导1
http://servicecomb.apache.org/cn/docs/quick-start/,运行bmi程序,出现如下异常结果。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/1187ae23d5c14a4ce13de2fc99cb35cc.jpeg)
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/914908ded5b322c9dbe92709653aec91.jpeg)
二. 使用Zipkin定位服务级别异常
以上的BMI示例还未开启调用链追踪,下面我们将使用ServiceComb提供的分布式调用链追踪能力定位分析BMI应用的哪个服务发生了异常。
首先需要给BMI程序配置zipkin调用链追踪能力,只需添加两个配置即可。可参考分布式追踪2和Distributed Tracing with ServiceComb and Zipkin3。
1.添加依赖
在 calculator微服务的pom.xml文件中添加依赖项:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/598963ef16b7984bd35ec68eb2816e60.png)
在 webapp微服务的pom.xml文件中添加依赖项:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/23ae240dadf715e4ec4d6362fe4b9992.png)
2 .配置跟踪处理程序
在 calculator微服务的microservice.yaml文件中添加分布式追踪的处理链:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/01085c9f781ac2e4a2a002394fd55c7a.png)
到此已配置完毕,您只需执行以下几步即可运行↓↓↓
使用Docker运行Zipkin分布式追踪服务:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d81044a6e634ab8afe381dc7ac062297.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/36b0b0a1fac0d25f0e07c52df7eee18d.png)
重启 calculator 微服务:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/b51939c8083b2fa723d0094ecba3b328.png)
重启 webapp 微服务:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/73dc457ae8ba44a00b0278c2d044e754.png)
打开浏览器访问 http://localhost:9411 ,查看调用链追踪情况,结果如下。可以看到gateway服务在1.7S时就返回给了用户失败结果,而calculator服务却运行了5S的时间,但calculator为蓝色(并非内部错误),可以确定calculator 服务超时导致gateway超时异常。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/5cb52688d8c5c18d56cae53f6c9b8fc6.png)
我们通过在后台服务打印程序调用栈日志可以看到,异常是由于socket读取超时,可以印证我们在Zipkin中看到的结果。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/ca92e95892c3dc0c5ecf66fd5e81ad29.png)
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/6b5791d5981ada5c0846c9db178b5d41.jpeg)
三、使用自定义追踪功能定位到函数级别
以上已确定导致超时返回的是calculator服务,在服务应用代码较大时,会较难找到具体出现异常的地点,ServiceComb支持可以在服务内部进行函数级别的调用链打点追踪,这将可以帮助我们解决这个问题。
配置BMI程序的自定义追踪功能,只需三步即可。
↓↓↓
参考java-chassis使用手册—自定义调用链打点4
https://docs.servicecomb.io/java-chassis/zh_CN/general-development/customized-tracing.html
在体质指数计算器的pom.xml文件中添加依赖项:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/e2ee366229b40997a13525fef2b5da81.png)
在程序入口或者配置处添加 @EnableZipkinTracing 注解
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/bbdc8f05fc0b727eeed56850b9bba37a.png)
在服务程序中的调用方法处添加 @Span 注解
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/0d76701a11eaf0fff3e70d91c9dc4fc3.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/ebbf7c02f70e79f95f2040dff9a5998b.png)
至此,自定义函数级别打点配置完成。
运行程序,从Zipkin界面如下:
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/e0a8c1a872bb5a05a98e30af99a55b27.png)
可以看到,调用链中新增加了calculate函数这个Span(上图红圈处),耗时5S。
点开该Span,可以查看该函数的详细信息,我们可以根据该信息准确查找到对应的源码进行修正。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/43016fb9aad6da4f18505977279a6097.jpeg)
总结
本例子为了最简化读者理解,使用了仅有两个微服务的BMI用例,在实际的生产环境中,微服务数量繁多将导致问题的定位变得复杂,调用链追踪和自定义追踪能力,可以帮助我们高效地解决这个问题。
五、参考链接
1.ServiceComb的入门案例BMI指导
http://servicecomb.apache.org/cn/docs/quick-start/
2.分布式追踪
http://servicecomb.apache.org/docs/quick-start-advance/distributed-tracing/
3.Distributed Tracing with ServiceComb and Zipkin
https://servicecomb.apache.org/docs/tracing-with-servicecomb/
4.java-chassis使用手册——自定义调用链打点
https://docs.servicecomb.io/java-chassis/zh_CN/general-development/customized-tracing.html
文末小结
本文向社区读者从使用角度阐述了ServiceComb是如何支持Zipkin的。
我们也非常欢迎爱好者们向社区提问和贡献代码。
下章我们将介绍ServiceComb+Zipkin源码解读篇。
如果在阅读代码时有任何疑问想交流,欢迎扫码加入进微信群。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/63b04dfd179a9c87aebd1c124b336bf5.png)
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/a45bfa0976e621b1473e70c0d8c0657f.jpeg)
期待志同道合的朋友们加入
ServiceComb的大门为你们敞开~
用心做开源,不忘初衷
前期阅读:
[学习微服务-第3天] ServiceComb内置高性能网关服务
[每天学习微服务-源码解读] ServiceComb+SpringCloud Zuul
[每天学习微服务-网关]ServiceComb+SpringCloud Zuul
------------------------------------------------
了解更多信息请访问:
官方网站 http://servicecomb.apache.org/
Github代码仓库https://github.com/apache?q=ServiceComb
赶紧点击阅读原文阅读相关源码
并给ServiceComb点个“Star”吧