前言
不管是在多语言或者多租户的场景下,我见过常见的实现方案都是前端传标识,然后后端通过ThreadLocal去接收,根据不同的类型进行相应的业务处理。之前总结过阿里SOFATracer的各类场景,可以粗略的看下。
多租户的情景
同样是通过前端传入不同的类型的参数来控制数据库进行不同租户的操作。
注意点
因为是在分布式环境,所以要考虑的情况会多些。
1. ThreadLocal不适用的情况
比如多线程,父子线程,分布式调用的传递等等场景,ThreadLocal是不能起作用的,因为他跟当前线程挂钩的,离开当前线程就获取不到值。
那么这里我们使用的是之前博客总结过的TTL,TransmittableThreadLocal;
TransmittableThreadLocal
它继承InheritableThreadLocal,InheritableThreadLocal可以实现父子线程的变量传递,但是解决不了像线程池里头的变量传递。所以有了TransmittableThreadLocal。
2. 线程池场景
private final Executor executor = TtlExecutors.getTtlExecutor(ThreadUtil.newExecutor(5));
3.Fegin分布式调用,如何保存租户的信息
在之前SOFATracer讲解中也提到Fegin场景的实现,其实就是拦截器去给request头部加参数。
然后再通过拦截器,将请求头的head参数处理。
声明
为了保护公司的代码隐私,我已经将重要的代码进行打码,公司是我家,安全靠大家,哈哈。
小广告
Redis 面试精讲