Spring Cloud 之 Hystrix 跨线程传递数据

欢迎访问陈同学博客原文

本文以一个技术场景来学习 Hystrix 跨线程传递数据的知识。将先简述ThreadLocal、InheritableThreadLocal跨父子线程传递数据,再进入主题。

基于Spring Boot 2.0.6.RELEASE, Spring Cloud Finchley.SR1

技术场景

服务A 通过 Feign + Hystrix 调用服务B,服务间调用时需传递 JWT Token,希望在Feign发起的所有请求中都自动加上token以在各服务中传递环境信息。JWT Token 一是用于确保访问的安全,二是存储用户context信息。

请求进入服务A时,首先通过 Filter 验证 JWT token,接着把 token 存到当前线程(tomcat工作线程)。调用 Service B时,tomcat工作线程将把任务交给 Hystrix 线程池处理,这是本文主题:如何将token从tomcat工作线程传递到hystrix线程池线程?

Hystrix 线程池

先提一下Hystrix线程池。当 Hystrix 隔离策略为线程池时,在上述场景中:

假设服务B的应用名为 Service-B,在服务A中,Hystrix 会专门创建线程池用于执行对 Service-B的调用,上图中的 hystrix-Service-B-n 就是其线程池中的线程。

通过这种方式,应用A对依赖进行了隔离。默认对每个依赖的服务分配10个线程。隔离的好处例举几个:

  • 请求太多,10个线程处理不过来?=> 那就拒绝请求,保护应用
  • 依赖服务调用出错?失败?=> 那就降级 或 快速失败
  • 依赖服务调用延时?=> 想耍流盲,占用资源不放,那就利用超时监控机制,干掉流氓任务

父子线程如何传递数据

跨线程传递数据的场景有:父子线程和其他任意线程之间。

先看下ThreadLocal,定义两个ThreadLocal类型的对象:TOKEN 和 USER,假定用1024、1025分别代表这两个对象。

static final ThreadLocal<String> TOKEN = new ThreadLocal<>(); // 1024
static final ThreadLocal<String> USER = new ThreadLocal<>();  // 1025

在Thread1中执行: TOKEN.set(“1”); USER.set(“1”)

在Thread2中执行: TOKEN.set(“2”); USER.set(“2”)

数据存储情况如下:

每个线程都有个ThreadLocalMap类型的属性 threadLocals,它用于存储线程私有数据,ThreadLocal对象只是充当检索数据的Key,本身不存储任何信息。

再看下 InheritableThreadLocal 怎么在父子线程之间传递数据,如下例子:

static final ThreadLocal<String> TOKEN = new InheritableThreadLocal<>(); 

Thread有两个属性,threadLocals

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值