解决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异步场景下丢失线程上下文的方法的主要内容,如果未能解决你的问题,请参考以下文章