例如当前我们的消费者Customer为Controller,需要通过登录者主键去访问后台信息,但是我们的登陆者信息单点登录现在是存在消费者这一端,那我们可以使用Dubbo的setAttachMents去存储我们所需要的信息,提供者就通过getAttachMents后获取我们所需要的附件信息,调用我们在后面会提供方法
实例:
消费者Customer
public class DubboConsumerParamsFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
Map<String, String> context = new HashMap<>();
String userId;
try {
//登录用户信息我们存在了UserManager中
userId = UserManager.getLoginUser().getUserId();
}catch (Exception e){
userId = "SYSTEM" ;
}
// 获取userID UserController 获取session
//key我们定义的常量
context.put(Constans.DUBBO_USERID_KEY, userId);
RpcContext.getContext().setAttachments(context);
return invoker.invoke(invocation);
}
}
提供者Provider
public class DubboProviderParamsFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
String userId = RpcContext.getContext().getAttachment(Constans.DUBBO_USERID_KEY);
//获取当前线程id
//我们设定了一个DubboUserMananger去操作当前线程
DubboUserManager.setDubboUserId(userId);
return invoker.invoke(invocation);
}
}
操作当前线程并且是安全的,我们这里选择的是分段Map
public class DubboUserManager {
private static ConcurrentHashMap<String, String> dubboUsersMap = new ConcurrentHashMap<String, String>() ;
public DubboUserManager() {
}
public static void setDubboUserId(String userId){
dubboUsersMap.put(String.valueOf(Thread.currentThread().getId()),userId);
}
public static String getDubboUserId(){
return dubboUsersMap.get(String.valueOf(Thread.currentThread().getId()));
}
}
调用我们直接在消费者端使用
DubboUserManager.getDubboUserId()就可以获取我们需要的userId