Dubbo呼叫過程監控
阿新 • • 發佈:2018-12-11
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 毫秒(即一分鐘)。