例如當前我們的消費者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