排查日志:apm在网关webflux变量丢失

个人博客:👉进入博客,关注下博主,感谢~

🌈所有博客均在上面博客首发,其他平台同步更新
🏆大家一起进步,多多指教~

在这里插入图片描述

前言

在自研apm项目中,发现网关traceId会被篡改
具体逻辑,有拦截器,然后在请求处理前,set tarceId,然后set到对应threadlocal里面,然后在mono返回的时候,从threadlocal拿出值,打印日志。

场景

a请求,traceId为123,b请求,traceId为666.在链路监控里头,会发现a的请求traceId被b覆盖了变成666

排查过程

  1. threadlocal本身就会导致变量丢失
    打印对应的日志查看线程名称,发现都是同个线程reactor-http-nio,那不会导致变量丢失
    在这里插入图片描述

  2. gateway 采用webflux实现,看下其他开源中间件怎么实现
    TLog 框架,总结:通过exchange来传递变量
    https://gitee.com/dromara/TLog/blob/master/tlog-webflux/src/main/java/com/yomahub/tlog/webflux/common/TLogWebFluxCommon.java
    在这里插入图片描述
    https://gitee.com/dromara/TLog/blob/master/tlog-gateway/src/main/java/com/yomahub/tlog/gateway/filter/TLogGatewayFilter.java
    在这里插入图片描述
    Sleuth框架:通过context来传递

https://github.com/spring-cloud/spring-cloud-sleuth/issues/1748
在这里插入图片描述

  1. webflux知识充电
    reactor线程模型,多线程模型,是不是跟netty很像
    在这里插入图片描述
    怎样理解阻塞非阻塞与同步异步的区别? - 知乎

在这里插入图片描述

https://mp.weixin.qq.com/s/HJ9Kwqw9Bp5zRuWTFWn8Pw

  1. webflux怎么添加上下文
    在这里插入图片描述
    在这里插入图片描述

结论

其实上面已经给出解决方案,通过exchange或者context来传递mono变量
其次的话通过第四点,可以看到mono采用背压式来处理数据,有发布者,处理器,订阅者。就像mq一样,整个流程是不会被阻塞的,异步的话主要通过线程池来实现。

导致的原因:其实我还没找到,我觉得比较好的解释是:mono跟背压模式差不多,就是有发布者,处理器,订阅者,但是他们是同个线程。
比如说请求要处理a->b->c步骤,发送到处理器,消费者开始消费,拿一个a处理完,再拿b。另外一个请求进来,他不需要等第一个请求处理完,直接往处理器丢他的a->b->c,这样可以实现非阻塞
那这样的话就有可能造成一个线程变量被其他线程覆盖,注意非阻塞,意思是同个线程可以处理不同的请求!!!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值