dubbo源碼閱讀ContextFilter&ConsumerContextFilter的消費者和提供者簡單傳遞Attachment

例如當前我們的消費者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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章