场景
在微服务架构中,有比较的服务,如果我们需要把一个参数在多个服务中传递,如:auth信息、语言信息、请求ID等等,那么我们可以通过下面的方式进行处理
相关技术
- ThreadLocal
- Filter
- RequestInterceptor
实战
一、封装请求相关数据保存工具
我们可以利用ThreadLocal来保存数据,这里推荐使用InheritableThreadLocal
,因为这个类可以让子线程以及子子线程同样可以拿到数据,而且即使主线程已经做了移除,也不影响。
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.beanutils.BeanUtils;
@Slf4j
public class RequestDataThreadLocal {
private static final InheritableThreadLocal<ThreadBindData> threadLocal = new InheritableThreadLocal<>();
/**
* 设置数据
* @param data
*/
public static void set(ThreadBindData data) {
threadLocal.set(newData);
}
/**
* 删除数据
*/
public static void remove() {
threadLocal.remove();
}
/**
* 获取数据
* @return
*/
public static ThreadBindData get(){
return threadLocal.get();
}
}
其中ThreadBindData是用来保存数据的实体类,具体根据自己的需要来处理既可以,比如我这里要放入语言信息和auth信息,则内容如下:
/**
* 线程绑定的数据
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ThreadBindData {
/**
* 语言
*/
private String lang;
/**
* auth信息
*/
private String authorization;
}
二、获取并保存请求参数
我们可以通过Filter把所有请求的参数获取起来,然后保存在ThreadLocal之中,供后续使用。同时在请求结束的时候移除掉数据。
package com.megvii.aipark.common.web;
import com