解决Java异步场景下丢失线程上下文的方法

Posted 沛沛老爹

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了解决Java异步场景下丢失线程上下文的方法相关的知识,希望对你有一定的参考价值。

背景

你不是做单纯的内部管理系统。

只是服务着内部这群人。

你的用户是整个网络上冲浪的人。

他们向你扑面而来,这个时候使用常规的操作手法你会发现程序变得越来越慢,

于是,你不停的增加硬件,扩大带宽...

但是你发现,程序还是不得不变慢的现实情况摆在了你的桌上。

于是,微服务、多线程等各种高性能方案就不得不加入到了解放大军中。

但是每个新加入的成员,引入的次生风险也是同步存在着....

例如,我们今天谈到的上下文丢失的情况。

问题出现的原因场景

大家都在追求高性能,所以很多底层的东西都是共用的,例如ThreadLocal。

你用一直爽,官方、第三方也在用着它...

当你在代码中使用高性能的异步解决方案时,你会发现一个不得不面对的现实问题:

web上下文丢失了.... 

web上下文丢失了....

web上下文丢失了....

然后一句国粹从你口中脱口而出....

但是为了碎银几两,你又不得不继续苦灯奋战...

web上下文丢失的场景分为多种情况:

1、子线程情况,需要重置上下文..

2、@Async注解导致的异步情况

3、Future计算下的情况

... ..

你发现问题场景太多,总有很多意想不到的情况在等着你。

特别是你还带着一帮不太靠谱的小弟的情况下,出了问题还要帮他们搽搽屁股。

这个时候你会感觉非常的疲惫...

 或许这个时候,它能帮到你

Nepxion Discovery Agent 

Nepxion Discovery Agent 号称能解决一切JAVA异步场景下上下文丢失的情况。

Discovery【探索】微服务框架,基于Spring Cloud & Spring Cloud Alibaba,Discovery服务注册发现、Ribbon负载均衡、Feign和RestTemplate调用、Spring Cloud Gateway和Zuul过滤等组件全方位增强的企业级微服务开源解决方案,更贴近企业级需求,更具有企业级的插件引入、开箱即用特征

官方介绍能够解决以下面临的疑难杂症:

① 微服务框架支持的基本功能

  • 支持阿里巴巴Spring Cloud Alibaba中间件生态圈
  • 支持阿里巴巴Nacos、Eureka、Consul和Zookeeper四个服务注册发现中心
  • 支持阿里巴巴Nacos、携程Apollo、Redis和Zookeeper四个远程配置中心
  • 支持阿里巴巴Sentinel和Hystrix两个熔断限流降级权限中间件
  • 支持OpenTracing和OpenTelemetry规范下的调用链中间件,Jaeger、SkyWalking和Zipkin等
  • 支持Prometheus Micrometer和Spring Boot Admin两个指标中间件
  • 支持Java Agent解决异步跨线程ThreadLocal上下文传递
  • 支持Spring Spel解决蓝绿灰度参数的驱动逻辑
  • 支持Spring Matcher解决元数据匹配的通配逻辑
  • 支持Spring Cloud Gateway、Zuul网关和微服务三大模块的蓝绿灰度发布等一系列功能
  • 支持和兼容Spring Cloud Edgware版、Finchley版、Greenwich版和Hoxton版

② 微服务框架支持的应用功能

  • 全链路蓝绿灰度发布

    • 全链路版本、区域、 IP地址和端口匹配蓝绿发布
    • 全链路版本、区域、 IP地址和端口权重灰度发布
    • 全链路蓝 | 绿 | 兜底、蓝 | 兜底的蓝绿路由类型
    • 全链路稳定、灰度的灰度路由类型
    • 全链路网关、服务端到端混合蓝绿灰度发布
    • 全链路域网关、非域网关部署
    • 全链路条件驱动、非条件驱动
    • 全链路前端触发后端蓝绿灰度发布
    • 全局订阅式蓝绿灰度发布
    • 全链路自定义网关、服务的过滤器、负载均衡策略类触发蓝绿灰度发布
    • 全链路动态变更元数据的蓝绿灰度发布
    • 全链路Header、Parameter、Cookie、域名、RPC Method等参数化规则策略驱动
    • 全链路本地和远程、局部和全局无参数化规则策略驱动
    • 全链路条件表达式、通配表达式支持
    • 全链路内置Header,支持定时Job的服务调用蓝绿灰度发布
  • 全链路蓝绿灰度发布编排建模和流量侦测

    • 全链路蓝绿发布编排建模
    • 全链路灰度发布编排建模
    • 全链路蓝绿发布流量侦测
    • 全链路灰度发布流量侦测
    • 全链路蓝绿灰度发布混合流量侦测
  • 全链路蓝绿灰度发布容灾

    • 发布失败下的版本故障转移
    • 并行发布下的版本偏好
  • 服务下线场景下全链路蓝绿灰度发布,实时性的流量绝对无损

    • 全局唯一ID屏蔽
    • IP地址和端口屏蔽
  • 异步场景下全链路蓝绿灰度发布

    • 异步跨线程Agent插件
    • Hystrix线程池隔离插件
  • 全链路数据库和消息队列蓝绿发布

    • 基于多Datasource的数据库蓝绿发布
    • 基于多Queue的消息队列蓝绿发布
  • 全链路规则策略推送

    • 基于远程配置中心的规则策略订阅推送
    • 基于Swagger和Rest的规则策略推送
    • 基于图形化桌面端和Web端的规则策略推送
  • 全链路环境隔离和路由

    • 全链路环境隔离
    • 全链路环境路由
  • 全链路可用区亲和性隔离和路由

    • 全链路可用区亲和性隔离
    • 全链路可用区亲和性路由
  • 全链路服务隔离和准入

    • 消费端服务隔离
    • 提供端服务隔离
    • 注册发现隔离和准入
  • 全链路服务限流熔断降级权限

    • Sentinel基于服务名的防护
    • Sentinel基于组的防护
    • Sentinel基于版本的防护
    • Sentinel基于区域的防护
    • Sentinel基于环境的防护
    • Sentinel基于可用区的防护
    • Sentinel基于IP地址和端口的防护
    • Sentinel自定义Header、Parameter、Cookie的防护
    • Sentinel自定义业务参数的防护
    • Sentinel自定义组合式的防护
  • 全链路监控

    • 蓝绿灰度埋点和熔断埋点的调用链监控
    • 蓝绿灰度埋点和熔断埋点的日志监控
  • 全链路服务侧注解

  • 全链路服务侧API权限

  • 元数据流量染色

    • Git插件自动化的元数据流量染色
    • 服务名前缀的元数据流量染色
    • 运维平台参数化的元数据流量染色
    • 注册中心动态化的元数据流量染色
    • 用户自定义的元数据流量染色

 根据官方的解释来看,基本上这些问题都没了,还能支持灰度发布。相信你的生活可以简单一些了。

开发者涨薪指南 48位大咖的思考法则、工作方式、逻辑体系

以上是关于解决Java异步场景下丢失线程上下文的方法的主要内容,如果未能解决你的问题,请参考以下文章

Spring Cloud Feign 参数上下文设计

Tomcat - 针对异步请求的WELD解决方法

java同步和异步的区别

java 多线程请求头丢失

Spring Boot 异步任务 -- @EnableAsync 详解

java异步线程内存可见性实验