Dubbo原理解析-監控

Dubbo發布代碼中,自帶了一個簡易的監控中心實現。對于一般的小業務這個監控中心應該能夠滿足需求,對于那些大業務量的大公司一般都會有自己的監控中心,更加豐富的功能如常用的報警短信通知等等。這章講解分析使得讀者能夠了解一般的監控中心實現,也使得有自己接入監控中心需求的大概知道如何集成自己的監控中心實現。下面我們就以dubbo自帶的監控中心開始講解。

?

監控中心

1.? 監控中心啟動,我們先看下dubbo的屬性文件

dubbo.container=log4j,spring,registry,jetty

dubbo.application.name=simple-monitor

dubbo.application.owner=

dubbo.registry.address=zookeeper://127.0.0.1:2181

dubbo.protocol.port=7070

dubbo.jetty.port=8080

dubbo.jetty.directory=${user.home}/monitor

dubbo.charts.directory=${dubbo.jetty.directory}/charts

dubbo.statistics.directory=${user.home}/monitor/statistics

?

相比于provider, consumer的啟動注冊中心多了registry, jetty容器啟動

bubuko.com,布布扣

它們都是基于dubbo的spi擴展機制的。

SpringContainer容器啟動就是加載classpath*:META-INF/spring/ *.xml spring的配置文件

<beanid="monitorService"class="com.alibaba.dubbo.monitor.simple.SimpleMonitorService">

???????<propertyname="statisticsDirectory"value="${dubbo.statistics.directory}"/>

???????<propertyname="chartsDirectory"value="${dubbo.charts.directory}"/>

</bean>

<dubbo:applicationname="${dubbo.application.name}"owner="${dubbo.application.owner}"/>

<dubbo:registryaddress="${dubbo.registry.address}"/>

<dubbo:protocolname="dubbo"port="${dubbo.protocol.port}"/>

<dubbo:serviceinterface="com.alibaba.dubbo.monitor.MonitorService"ref="monitorService"delay="-1"/>

<dubbo:referenceid="registryService"interface="com.alibaba.dubbo.registry.RegistryService"/>

?

2. SimpleMonitorService

監控中心配置了監控服務的實現SimpleMonitorService, 并且作為一個普通的dubbo服務暴露到注冊中心,供服務的提供者和服務的消費方調用,將服務提供者和服務的消費方的調用數據保存到監控中心。

監控服務的接口定義

public?interface?MonitorService {

????/**

???? *?監控數據采集.

???? * 1.?支持調用次數統計:count://host/interface?application=foo&method=foo&provider=10.20.153.11:20880&success=12&failure=2&elapsed=135423423

???? * 1.1host,application,interface,group,version,method記錄監控來源主機,應用,接口,方法信息。

???? * 1.2?如果是消費者發送的數據,加上provider地址參數,反之,加上來源consumer地址參數。

???? * 1.3 success,faulure,elapsed?記錄距上次采集,調用的成功次數,失敗次數,成功調用總耗時,平均時間將用總耗時除以成功次數。

???? *

???? *?@paramstatistics

???? */

????void?collect(URLstatistics);

?

????/**

???? *?監控數據查詢.?

???? * 1.?支持按天查詢:count://host/interface?application=foo&method=foo&side=provider&view=chart&date=2012-07-03

???? * 1.1host,application,interface,group,version,method查詢主機,應用,接口,方法的匹配條件,缺失的條件的表示全部,host0.0.0.0表示全部。

???? * 1.2 side=consumer,provider?查詢由調用的哪一端采集的數據,缺省為都查詢。

???? * 1.3?缺省為view=summary,返回全天匯總信息,支持view=chart表示返回全天趨勢圖表圖片的URL地址,可以進接嵌入其它系統的頁面上展示。

???? * 1.4 date=2012-07-03指定查詢數據的日期,缺省為當天。

???? *

???? *?@param?query

???? *?@returnstatistics

???? */

??? List<URL> lookup(URL query);

}

?

注: lookup方面可能在開源過程中依賴了阿里的什么系統,并沒有具體的實現,如果使用著需要此功能則需要根據接口定義自己實現

?

MonitorService的dubbo默認實現SimpleMonitorService

Collect方法被遠程調用后將數據url(傳過來的url包含監控需要的數據)保存到一個阻塞隊列中BlockingQueue<URL>

啟動定時任務將統計日志記錄到本地,

String filename =${user.home}/monitor/statistics

??????????????????????? +?"/"?+ day

??????????????????????? +?"/"?+statistics.getServiceInterface()

??????????????????????? +?"/"?+statistics.getParameter(METHOD)

??????????????????????? +?"/"?+ consumer

??????????????????????? +?"/"?+ provider

??????????????????????? +?"/"?+ type +?"."?+ key

這是文件在本地存儲的格式

bubuko.com,布布扣

文件內容如圖保存時間方法消費耗時

bubuko.com,布布扣

?

3.?起定時任務利用JFreeeChart繪制圖表,保存路徑

${user.home}\monitor\charts\date\interfaceName\methodName

bubuko.com,布布扣

?bubuko.com,布布扣

?

?

產生監控數據

注冊中心暴露了MonitorService服務,它是被誰調用的呢,監控中心的數據是從哪里來呢,下面我們看下服務提供方與服務的消費方式如何介入監控中心的。

在服務的提供方跟消費方的dubbo配置加入如下配置

通過注冊中心<dubbo:monitor protocol="registry" />

或者直連??<dubbo:monitor address="127.0.0.1:7070" />

bubuko.com,布布扣

在構建服務的調用鏈的時候有如上基于監控的擴展,下面我們就來看下這個類

@Activate(group = {Constants.PROVIDER, Constants.CONSUMER})

//此過濾器在服務的提供方,服務的消費方應用中被激活,也就是起作用

public class MonitorFilter implements Filter {

private MonitorFactory monitorFactory;

??? public Result invoke(Invoker<?>invoker, Invocation invocation) throws RpcException {

??? if(invoker.getUrl().hasParameter(Constants.MONITOR_KEY)) {

???????? //有注監控中心處理

1.??獲取invoker的調用上下文

2.??記錄起始時間戳

3.??并發計數加一

try {

4.??調用調用鏈的下一步

5.??采集調用信息

} finally {

6.??并發計數減一

}

??? } else {

???????? //沒有配置監控中心,直接往下調用

???? ??? return invoker.inovke(invocation);

?? }

}

?

上面第5點信息采集

1.?計算調用耗時

2.?獲取并發數

3.?獲取服務名稱

4.?獲取方法名

5.?判斷是服務消費方監控還是服務提供方監控

6.?由工廠類monitorFactory.getMonitor(監控url),獲取DubboMonitor對象,

構建調用監控中心服務的的Url, url中包括了監控中心所需的監控信息

monitor.collect(newURL(Constants.COUNT_PROTOCOL,

????????????????? NetUtils.getLocalHost(),localPort,

????????????????? service + "/" +method,

??????????????? ? MonitorService.APPLICATION, application,

?????????????????? MonitorService.INTERFACE,service,

?????????????????? MonitorService.METHOD,method,

?????????????????? remoteKey, remoteValue,

?????????????????? error ?MonitorService.FAILURE : MonitorService.SUCCESS, "1",

?????????????????? MonitorService.ELAPSED,String.valueOf(elapsed),

?????????????????? MonitorService.CONCURRENT,String.valueOf(concurrent),

?????????????????? Constants.INPUT_KEY, input,

??????????????????Constants.OUTPUT_KEY, output));

?

DubboMonitor是調用監控中心的服務的封裝,之所以沒有直接調監控中心而是通過DubboMonitor調用,是因為監控是附加功能,不應該影響主鏈路更不應該損害主鏈路的新能,DubboMonitor采集到數據后通過任務定時調用監控中心服務將數據提交到監控中心。

?

RegistryContainer

監控中心refer引用了注冊中心暴露的RegistryService服務,主要是被下面的RegistryContainer使用的。

?

RegistryContainer主要是到注冊中心收集服務,分組,版本信息,并注冊回調當注冊中心數據發生變化的時候更新到監控中心

下面看下RegistryContainer的start方法流程:

1. 通過SpringContainer獲取前面初始化的RegistryService, 得到其實是對注冊中心的一個遠程代理服務

2. 構建訂閱注冊中心數據的URL,看可以看出下面的url是訂閱服務提供者和服務消費者的所有服務

subscribeUrl =?newURL(Constants.ADMIN_PROTOCOL, NetUtils.getLocalHost(), 0,"",

??? ????????????Constants.INTERFACE_KEY,Constants.ANY_VALUE,//所有服務

??????????????? Constants.GROUP_KEY,Constants.ANY_VALUE,//所有分組

??????????????? Constants.VERSION_KEY, Constants.ANY_VALUE,//所有版本

??????????????? Constants.CLASSIFIER_KEY,Constants.ANY_VALUE,//所有分類

Constants.CATEGORY_KEY,Constants.PROVIDERS_CATEGORY +?","? + Constants.CONSUMERS_CATEGORY,//服務的提供者和服務的消費者

??? ?????????????Constants.CHECK_KEY,String.valueOf(false));//不檢查

3.? 調注冊中心服務registry.subscirbe(subscribeUrl,listener)訂閱所有數據, NotifyListener在監控中心暴露為回調服務,由注冊中心回調

回調接口NotifyListener實現的功能主要是按服務提供者和服務的消費者分類,收集服務名稱,服務的url,服務提供方或者消費方的系統相關信息。 同時提供了一系列方法供注冊中心調用查詢。

?

JettyContainer

監控中心將采集到的信息通過內置jetty來展現給用戶,這里為了不依賴與jsp, velocity,freemarker等一些編寫web應用的技術,采用在servlet中將html,css,js打印出來

JettyContainer的start方法啟動了內置的jettyweb容器

將監控中心訪問的本地文件目錄設置到ResourceFilter中,并設置這個filter的訪問映射到jetty中?? , ResourceFilter主要是讀取本地保存的JFreeChart繪制的圖片到瀏覽器中去。

將監控中心的前置控制器PageServlet, 以及這個servlet的訪問映射配置到jetty中。之所以叫PageServet為前置控制器,就像其他的mvc框架一樣用來分發具體的業務類

?

PageServet的init初始化方法在web容器啟動的時候加載所有的頁面處理器PageHandler, 用來根據不同的請求生成不同的頁面,前面說過這里頁面html都是通過java代碼打印出來的。

PageServet的init方法加載所有PageHandler時會判斷PageHandler上是否有@Menu注解,將有注解的PageHandler加入集合,以被HomePageHandl er用來生成主頁以及各個頁面的uri

PageServet的doGet, doPost接收瀏覽器請求,請求以xx.hml形式,xx就是PageHandler擴展的key,找到對應的PageHandler繪制對應的頁面返回給瀏覽器。

?

?

@Menu(name = "Home",desc = "Home page.", order = Integer.MIN_VALUE)

//有注解?namedesc屬性都是在頁面中展示給用戶看的

public class HomePageHandlerimplements PageHandler {

??? public Page handle(URL url) {

??????? List<List<String>> rows =new ArrayList<List<String>>();

??????? for (PageHandler handler :PageServlet.getInstance().getMenus()) {

??????????? String uri =ExtensionLoader.getExtensionLoader(PageHandler.class).getExtensionName(handler);?//這個uri其實就是PageHandler擴展配置的key頁面中用它來請求選擇具體的handler繪制?? ??//出具體的page

??????????? Menu menu =handler.getClass().getAnnotation(Menu.class);

??????????? List<String> row = newArrayList<String>();

??????????? row.add("<ahref=\"" + uri + ".html\">" + menu.name() +"</a>");

??????????? row.add(menu.desc());

??????????? rows.add(row);

??????? }

??????? return new Page("Home","Menus",? new String[]{"Menu Name", "Menu Desc"}, rows);??//一個Page實體就是一個頁面,這里包含所有主要HomePage的頁面內容

??? }

}

?

PageHandler的在com.alibaba.dubbo.container.page.PageHandler文件中的擴展配置

index=com.alibaba.dubbo.container.page.pages.HomePageHandler

providers=com.alibaba.dubbo.monitor.simple.pages.ProvidersPageHandler

consumers=com.alibaba.dubbo.monitor.simple.pages.ConsumersPageHandler

。。。。

下面截圖看下dubbo大概提供了哪些擴展

bubuko.com,布布扣

?下面截幾張圖看看監控中心的頁面。

bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣

bubuko.com,布布扣


轉載于:https://www.cnblogs.com/duyinqiang/p/5696319.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257123.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257123.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257123.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

學習筆記(04):Python網絡編程并發編程-什么是socket

立即學習:https://edu.csdn.net/course/play/24458/296233?utm_sourceblogtoedu 1.什么是網絡編程&#xff1f; 答&#xff1a;網絡編程也叫做socket編程即套接字編程&#xff0c;基于遵循socket套接字的規定進行的編程 2.什么是socket&#xff1f; 答&#xff1a;socket就是…

mysql 獲取自增主鍵

MyBatis 3.2.6插入時候獲取自增主鍵方法有二以MySQL5.5為例&#xff1a;方法1&#xff1a;<insert id"insert" parameterType"Person" useGeneratedKeys"true" keyProperty"id">insert into person(name,pswd) values(#{name},#…

虛擬主機用戶ftp和apache用戶文件互操作權限解決方法

方法1.用戶組控制方法 先給所有的虛擬主機主機中的虛擬用戶(ftp用戶)加入到apache這個組.然后設置umask為002.這樣用戶和組都有讀寫執行權限。這個是比較容易的方法.但不安全。不同的用戶可以刪除對方的文件&#xff0c;因為是同一個組,組有讀寫執行的權限. 方法2.使用linux高級…

數學的列向量內積計算方法

x(cos x1 y(-sinx1sinx1) cosx1) [x,y]cosx1*(-sinx1)sinx1*cosx1

遍歷枚舉

/// <summary> /// 卡卷類型 /// </summary> public enum CardTypeEnum {代金券 1,優惠卷 2 } foreach (int myCode in Enum.GetValues(typeof(CardTypeEnum))){string strName Enum.GetName(typeof(CardTypeEnum), myCode); //文本 keystring strValue myCode…

前端工程師必須要知道的SEO技巧(2):制作比設計還要漂亮的代碼(內容和語義化代碼)上...

前言:現在的網站設計,大多數不僅僅要求美觀,前端代碼往往發揮著重要的作用.這意味著很大一部分搜索引擎優化或搜索引擎優化責任應該落在設計師身上.然而,有大量的網頁設計師不理解這個問題以及如何在建立一個網站初期就達到是完全的搜尋引擎優化.當然,要達到這個高度,肯定離不開…

學習筆記(05):Python網絡編程并發編程-基于socket實現簡單套接字通信

立即學習:https://edu.csdn.net/course/play/24458/296234?utm_sourceblogtoedu 1.服務器端 #以打電話通訊為例子進行說明 #導入相應的模塊 import socket#1、設置套接字的類型以及協議(買手機)&#xff0c;其實就是設置一個套接字&#xff0c;phone即為一個套接字 #設置為網…

JeeSite 4.0 說說前端的那些事

2019獨角獸企業重金招聘Python工程師標準>>> 引言 一個不得不說的話題&#xff0c;經過近幾年的發展&#xff0c;Web前端開發已經不是一個新有的崗位了&#xff0c;前端技術發展非常迅速&#xff0c;技術更新換代也很快&#xff0c;對于前端工程師來說是一個很大的挑…

筆記本換固態硬盤

我換固態硬盤是讓熟人修電腦換的&#xff0c;結果跟我要100塊錢的服務費&#xff0c;在這我絕得太坑了&#xff0c;所以建議大家自己換固態硬盤 1、首先自己在網上買一塊相對較好的固態硬盤&#xff0c;盡量買大點 2、還需要買一個硬盤的托盤&#xff0c;這個是直接換筆記本上的…

Bootstrap富文本編輯器-bootstrap-wysiwyg

在進行英語試題的錄入中&#xff0c;因為英語試題經常會有類似如下的試題&#xff1a; My friend watches dragon boat races at the Dragon Boat Festival.(對劃線部分提問) ——_______ is the Double Ninth Festival? ——It is in October. 在上面的題目中&#xff0c;我們…

學習筆記(06):Python網絡編程并發編程-在簡單套接字基礎上加上通信循環

立即學習:https://edu.csdn.net/course/play/24458/296235?utm_sourceblogtoedu 1.服務器端 #以打電話通訊為例子進行說明 #導入相應的模塊 import socket#1、設置套接字的類型以及協議(買手機)&#xff0c;其實就是設置一個套接字&#xff0c;phone即為一個套接字 #設置為網…

怎么把word轉換pdf,pdf轉換word ,pdf轉換成高清圖片

方法一&#xff1a;一個成套的軟件&#xff0c;包含了&#xff0c;word -->pdf ,Pdf—>word,pdf-->圖片 迅捷PDF在線轉換器 地址在這 &#xff08;http://app.xunjiepdf.com/ &#xff09;&#xff0c; 但是上面這個有個限制&#xff0c;只能轉一定大小的文件&#x…

程序包com.sun.istack.internal不存在

添加一下依賴 <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-impl --><dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.2.11</version></dependency&…

iOS微博項目(七)發微博和定位

class a導入class b&#xff0c;class b導入class a 會出現錯誤 如果keyboard不顯示&#xff0c;應該是hardware-》connect選擇了 1. 發微博UI 2.定位 一直不回調&#xff0c;后來發現是ios8后方法更新了&#xff1a;http://blog.devzeng.com/blog/ios8-corelocation-framework…

學習筆記(07):Python網絡編程并發編程-客戶端與服務端代碼bug修復

立即學習:https://edu.csdn.net/course/play/24458/296236?utm_sourceblogtoedu 1.修復端口被占用的bug import socketphone socket.socket(socket.AF_INET,socket.SOCK_STREAM)#修復重復多次運行程序斷就被占用的bug&#xff0c;在綁定端口前設置 phone.setsockopt(socket.…

設計模式之UML類圖

在學設計模式的過程中經常碰到各式各樣的UML類圖。那些眼花繚亂的符號有什么含義呢&#xff1f; 類圖含義 類圖中的關系 從網上找來一張圖作為實例 依賴關系&#xff1a;比如動物依賴氧氣和水&#xff0c;這里如學生要依賴自行車。用虛線箭頭表示。關聯關系&#xff1a;學生和身…

tomcat啟動報:No Spring WebApplicationInitializer types detected on classpath

2019獨角獸企業重金招聘Python工程師標準>>> 對于maven項目&#xff0c;tomcat啟動不加載spring配置文件&#xff0c;是因為找不到web.xml文件 右鍵項目properties 選擇 Deployment Assembly 編輯 Web Deployment Assembly&#xff0c;注意主要是紅色線框中的路徑 …

拿到項目怎么開始整理PCB原理圖

1、用模塊拼接&#xff0c;不停的做實驗 2、網上各種搜索資料&#xff0c;確定好方案 3、最后落實PCB板原理圖&#xff0c;然后做板子出來

Java中的面向接口編程

面向接口編程是很多軟件架構設計理論都倡導的編程方式&#xff0c;學習Java自然少不了這一部分&#xff0c;下面是我在學習過程中整理出來的關于如何在Java中實現面向接口編程的知識。分享出來&#xff0c;有不對之處還請大家指正。 接口體現的是一種規范和實現分離的設計哲學&…

Linux-正則表達式學習(精)

正則表達式30分鐘入門教程 來園子之前寫的一篇正則表達式教程&#xff0c;部分翻譯自codeproject的The 30 Minute Regex Tutorial。 由于評論里有過長的URL,所以本頁排版比較混亂,推薦你到原處查看,看完了如果有問題,再到這里來提出. 一些要說的話&#xff1a; 如果你沒有正則表…