3个月前 (12-23)  技术 |   抢沙发  73 
文章评分 0 次,平均分 0.0
[收起] 文章目录

在微服务架构中,一次用户请求往往调用多个服务,微服务调用链追踪工具可以

  • 在用户请求发生错误时,帮助我们定位root cause
  • 在性能优化时提供可观测性指标,找到架构中最耗时的服务和API请求,帮助我们对症下药

现在的NodeJs web项目比较流行地采用express作为服务器,axios也是一款比较流行的HTTP客户端。微服务的特点之一,自己作为服务端的同时,也为作为客户端访问其它服务。所以集成调用链追踪的关键在于:

  • 集成server,处理客户端请求。通常会有现成的框架实现了此功能:构造新的,或者从上游的HTTP 请求的header中获取一个包含tracing的结构体(如x-b3-spanid)
  • 集成client,在发出请求和返回数据时记录请求,zipkin等工具需要知道每个请求的请求时间、返回码、路径等等。
  • 将server的请求头tracing数据传递到客户端

传统微服务(非istio)

工具方法

NodeJs web项目集成调用链追踪

 

express 服务器路由集成zipkin

 

由于nodejs是主线程为单线程的服务器语言,高并发由异步消息队列完成。所以保证从服务器端传递tracing信息和客户端tracing信息在同一个“上下文”,不能简单地采用一个全局变量来保存tracing信息。此处的isolateZipkinContextByRequest至关重要,

 

axios客户端集成zipkin

 

详见:https://github.com/openzipkin/zipkin-js/tree/master/packages/zipkin-instrumentation-axiosjs

 

istio

相比传统的K8S架构,由于service mesh使用sidecar的方式代理了pod的所有网络请求,构造请求头、和记录请求路径、请求返回码等操作可以在sidebar等istio组件上实现。

所以在istio语境下我们只需要实现HTTP header中的tracing信息从服务端到客户端的传递。同样的原因,nodejs是单线程语言,不能通过一个thread级别隔离的全局变量来保存tracing信息,同时通过层层函数调用栈的方式来传递request的tracing信息则过于麻烦。express库本身没有提供类似于spring或者PHP中的session的会话对象,这里会引入一个“express-http-context”的npm库完成request之间的数据“隔离”。

获取请求中的tracing header

express的集成代码:

client的集成代码:

 

参考资料

 

  • zipkin链路追踪原理:https://www.cnblogs.com/iiiiiher/p/10256676.html
 
关注我的微信

关注我的微信,获取文章更新

如果你觉得这篇文章对你有用,可以点击下面的“赞助作者”打赏作者!

转载注明原文出处:王柏元的博客>>https://wangbaiyuan.cn/nodejs-web%e9%a1%b9%e7%9b%ae%e9%9b%86%e6%88%90%e8%b0%83%e7%94%a8%e9%93%be%e8%bf%bd%e8%b8%aa.html

关于
记录生活,镌刻心路;泼洒文墨,分享技术!王柏元的博客致力于IT经验交流,并原创翻译引进外文文章,打开IT国际化视野

发表评论

格式

暂无评论

登录

忘记密码 ?

您也可以使用第三方帐号快捷登录

切换登录

注册