1. 程式人生 > >dubbo服務治理和監控相關

dubbo服務治理和監控相關

dubbo作為一個成熟的分散式服務框架,自然提供了服務監控和服務治理的相關功能。
服務治理:dubbo-admin
服務監控:dubbo-monitor

incubator-dubbo-ops

官方提供的專案,部署很簡單
git clone https://github.com/apache/incubator-dubbo-ops.git
選擇master分支。
裡面會有dubbo-admin(服務治理),dubbo-monitor(服務監控),這兩個需要單獨部署。

**

dubbokeeper

**
非官方,集服務治理和服務監控於一體,,服務監控資料提供了lucene、mysql、mongodb等三種儲存方式。部署時,需要單獨部署一個war包還有一個服務監控資料儲存的服務。
git地址:

https://github.com/dubboclub/dubbokeeper.git

**

dubbokeeper-mqs

**
dubbokeeper的快速啟動版,只需啟動一個應用就可以了。
git地址: https://github.com/zylele/dubbokeeper-mqs.git

注:
對於服務治理來講dubbokeeper的功能並沒有完全覆蓋dubbo-admin但是基本上也夠用了,而且監控功能比dubbo-monitor強很多(主要是前端頁面好很多。。)
dubbokeeper剛搭建的時候,服務監控那沒有資料,需要有呼叫才能有資料。

**

服務監控原理分析:

**
所謂的監控中心,其實也是一個標準的dubbo服務,實現的是dubbo包裡的
com.alibaba.dubbo.monitor.MonitorService;
是誰呼叫這個服務的呢?

	dubbo可設定很多filter,對於監控這塊來講就是 MonitorFilter;
	翻開原始碼可以看到
// intercepting invocation
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        if (invoker.getUrl().hasParameter(Constants.MONITOR_KEY)) {
            RpcContext context = RpcContext.getContext(); // provider must fetch context before invoke() gets called
            String remoteHost = context.getRemoteHost();
            long start = System.currentTimeMillis(); // record start timestamp
            getConcurrent(invoker, invocation).incrementAndGet(); // count up
            try {
                Result result = invoker.invoke(invocation); // proceed invocation chain
                collect(invoker, invocation, result, remoteHost, start, false);
                return result;
            } catch (RpcException e) {
                collect(invoker, invocation, null, remoteHost, start, true);
                throw e;
            } finally {
                getConcurrent(invoker, invocation).decrementAndGet(); // count down
            }
        } else {
            return invoker.invoke(invocation);
        }
    }
	上面是MonitorFilter裡的呼叫方法,可以看到很明顯的是
invoker.getUrl().hasParameter(Constants.MONITOR_KEY)

dubbo並不是所有的呼叫都會監控的,在應用中需要配置
<dubbo:monitor protocol=“registry”/>
只有加上這個配置,才會有之後發生的事情。
繼續看程式碼。
呼叫完成後收集相關的呼叫資訊。具體方法

 collect(invoker, invocation, result, remoteHost, start, false);

這裡面通過 DubboMonitorFactory 獲取 DubboMonitor然後收集好呼叫資訊,執行DubboMonitor的collect這個方法將呼叫資訊放到map中,然後隔一段時間就將map裡的所有監控資訊呼叫MonitorService提供的服務。

大概意思就是這樣,十月一要下班了不想寫了。想知道就看原始碼,debug一下就都知道了。。

願祖國繁榮昌盛,大家平安喜樂!!!