1. 程式人生 > >Dubbo呼叫過程監控

Dubbo呼叫過程監控

MonitorFilter 主要對呼叫過程進行監控,

public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException { 
    if(invoker.getUrl().hasParameter(Constants.MONITOR_KEY)) {
        //  供方必須在 invoke()之前獲取 context 資訊
        RpcContext context = RpcContext.getContext();
        long start = System.currentTimeMillis(); // 記錄起始時間戮 
        getConcurrent(invoker, invocation).incrementAndGet(); // 併發計數 
        try {
            Result result = invoker.invoke(invocation); // 讓呼叫鏈往下執行 
            collect(invoker, invocation, result, context, start, false);
            return result;
        } catch (RpcException e) {
            collect(invoker, invocation, null, context, start, true);
            throw e; 
        } finally {
            getConcurrent(invoker, invocation).decrementAndGet(); // 併發計數 
        }
    } else {
        return invoker.invoke(invocation);
    } 
}

其核心程式碼是 collect()方法,該方法會將監控的資料通過 Monitor monitor 進 行收集,收集後存放在本地記憶體,每隔固定的時間(預設是 60 秒)上傳到監控 節點上。  Monitor 的預設實現是 com.alibaba.dubbo.monitor.dubbo 包下的 DubboMonitor 類,DubboMonitor 中會定義一個 ConcurrentHashMap 的物件用於儲存監控資訊, MonitorFilter 的 collect 方法在執行時會將監控資料儲存到該 ConcurrentHashMap 中;另外,DubboMonitor 預設會開啟一個基於執行緒池的定時任務執行器 ScheduledExecutorService,並且在建構函式中會啟動一個週期性執行的任務將 ConcurrentHashMap中的資料傳送到監控節點上,傳送邏輯在send()方法中實現, 傳送的週期是 60000 毫秒(即一分鐘)。