Dubbo Monitor 分析
DubboRCP調用次數和調用時間的監控,以 Statistics 為中心,擴展接口為 MonitorFactory、Monitor、MonitorService.
?
?
?
MonitorService 主要提供兩個接口,收集和查找監控數據.
/*** Collect monitor data* 1. support invocation count: count://host/interface?application=foo&method=foo&provider=10.20.153.11:20880&success=12&failure=2&elapsed=135423423* 1.1 host,application,interface,group,version,method: record source host/application/interface/method* 1.2 add provider address parameter if it's data sent from consumer, otherwise, add source consumer's address in parameters* 1.3 success,failure,elapsed: record success count, failure count, and total cost for success invocations, average cost (total cost/success calls)** @param statistics*/void collect(URL statistics);/*** Lookup monitor data* 1. support lookup by day: count://host/interface?application=foo&method=foo&side=provider&view=chart&date=2012-07-03* 1.1 host,application,interface,group,version,method: query criteria for looking up by host, application, interface, method. When one criterion is not present, it means ALL will be accepted, but 0.0.0.0 is ALL for host* 1.2 side=consumer,provider: decide the data from which side, both provider and consumer are returned by default* 1.3 default value is view=summary, to return the summarized data for the whole day. view=chart will return the URL address showing the whole day trend which is convenient for embedding in other web page* 1.4 date=2012-07-03: specify the date to collect the data, today is the default value** @param query* @return statistics*/List<URL> lookup(URL query);?
Monitor 接口繼承 Node 和 MonitorService. 也就是說是以 Monitor 提供對外服務.
?
MonitorFactory 創建 Monitor 的工廠.
?
BuiltinServiceDetector 加載內置服務,例如 EchoService、GenericService、MetricsService、MonitorService
?
AbstractMonitorFactory 創建 Monitor 的工廠. 抽象了 createMonitor 方法.
protected abstract Monitor createMonitor(URL url);
?
MonitorFilter 會按照 MonitorSerivce 中方法定義的格式,將調用情況封裝成 url. 它作用于服務端和客戶端.
1.在 invoke 方法中 concurrent + 1
2.在 onResponse 中 concurrent - 1,上報成功
3.在 onError 中 concurrent - 1,上報失敗
4.url:count://host:port/serviceName/methodName?application=xxx&interface=xxx&method=xxx&provider=xxx:yyy&failure=xxx&success=xxx&elapsed=xxx&concurrent=xxx&input=xxx&output=xxx&group=xxx&version=xxx
new URL(COUNT_PROTOCOL, NetUtils.getLocalHost(), localPort, service + PATH_SEPARATOR + 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), INPUT_KEY, input, OUTPUT_KEY, output, GROUP_KEY, group, VERSION_KEY, version);
DubboMonitor 會將 URL 封裝成 Statistics 對象.
看了上面的 url,是否可以做一些刪減了?比如前面部分的 serviceName/methodName 是否必須?
?
Statistics(url、application、service、method、group、version、server、client) 為統計信息. 那么它專注那些信息了?
1.url
2.application
3.service
4.method
5.group
6.version
7.server
8.client
?
public class Statistics implements Serializable {
?
????private static final long serialVersionUID = -6921183057683641441L;
?
????private URL url;
?
????private String application;
?
????private String service;
?
????private String method;
?
????private String group;
?
????private String version;
?
????private String client;
?
????private String server;
?
????public Statistics(URL url) {
????????this.url = url;
????????this.application = url.getParameter(MonitorService.APPLICATION);
????????this.service = url.getParameter(MonitorService.INTERFACE);
????????this.method = url.getParameter(MonitorService.METHOD);
????????this.group = url.getParameter(MonitorService.GROUP);
????????this.version = url.getParameter(MonitorService.VERSION);
????????this.client = url.getParameter(MonitorService.CONSUMER, url.getAddress());
????????this.server = url.getParameter(MonitorService.PROVIDER, url.getAddress());
????}
}
?
?
DubboMonitor 實現 Monitor 接口,每隔 60s 上報一次. 主要是收集和查找監控數據.
?
update[0] :調用成功的次數
update[1] :調用失敗的次數
update[2] :總調用流量(請求包的總大小)。
update[3] :總響應流量(響應包的總大小)。
update[4] :總響應時長(總服務調用開銷)。
update[5] :一次收集周期的平均TPS。
update[6] :最大請求包大小。
update[7] :最大響應包大小。
update[8] :最大響應時間。
update[9] :最大TPS。
?
?
?
DubboMonitorFactory(protocol、proxyFactory) 繼承?AbstractMonitorFactory 接口,創建 DubboMonitor 的工廠.
?
private Protocol protocol;
?
?
????private ProxyFactory proxyFactory;
?
?
MetricsFilter 實現 Filter 接口,待定。
?
?
Dubbo monitor 監控信息上報到那了?
?
流程是咋樣的?
?
從網上 copy 了下:
?
dubbo-monitor-simple
基本用法
-
啟動com.alibaba.dubbo.monitor.simple.MonitorStarter#main
-
需要進行監控的服務,在xml中配置<dubbo:monitor protocol="registry"/>
-
打開監控頁面http://localhost:8080可以看到服務調用相關的統計
實現原理
dubbo-monitor-simple
-
dubbo-monitor-simple啟動的時候,發布服務:com.alibaba.dubbo.monitor.MonitorService(實現類:com.alibaba.dubbo.monitor.simple.SimpleMonitorService),只實現了collect方法,將RPC調用過來的URL存到queue里面
-
com.alibaba.dubbo.monitor.simple.SimpleMonitorService啟動了兩個線程,分別執行write和draw方法,write從queue里面取出URL進行統計分析,結果寫文件,draw方法把這些結果畫成折線圖,存本地圖片文件
-
com.alibaba.dubbo.monitor.simple.pages.ChartsPageHandler和com.alibaba.dubbo.monitor.simple.pages.StatisticsPageHandler負責在頁面上渲染展示這些數據
Dubbo應用
-
Dubbo服務在配置了<dubbo:monitor protocol="registry"/>標簽后,調用經過com.alibaba.dubbo.monitor.support.MonitorFilter時,會進行結果收集操作。
-
最終在調用到com.alibaba.dubbo.monitor.dubbo.DubboMonitor#collect,該方法將調用過程中的統計信息存放在statisticsMap中。并且,有另一個線程定期(默認為60秒)調用dubbo-monitor-simple暴露的com.alibaba.dubbo.monitor.MonitorService服務,將這些信息發送給monitor。
Dubbo-montitor-simple實現的過程借助了dubbo服務調用:Monitor端暴露服務,Dubbo應用通過配置去消費這些服務,消費的過程就是自身服務數據上報的過程。
?
Dubbo-monitor-simple的代碼在本項目的master分支
?
通過摘抄自 wiki 的描述,我們能很清晰看到 dubbo 的服務監控是如何做的.
?
1.服務在被調用之前,進過 MonitorFilter,在 MonitorFilter 中獲取 DubboMonitor 完成監控數據的收集.
2.在 DubboMonitorFactory 中完成 MonitorService 服務的引用. Protocol 得到 Invoker,proxyFactory 完成透明化調用.
?? ??? ?Invoker<MonitorService> monitorInvoker = protocol.refer(MonitorService.class, urlBuilder.build());
????????MonitorService monitorService = proxyFactory.getProxy(monitorInvoker);
3.在 DubboMonitor 中的 send 方法中,完成每個 60s 上報一次監控數據.
4.也就是說 dubbo 的服務監控,也是通過 dubbo 服務,將服務端和消費端的調用數據自動上報到 dubbo-monitor-simple 應用服務.
?
dubbo 接入 trace 原理:https://segmentfault.com/a/1190000018515411
?
?
參考:
①?https://blog.csdn.net/prestigeding/article/details/82254649
②?https://blog.csdn.net/weixin_38308374/article/details/106157243
? ? ?http://dubbo.apache.org/zh/docs/v2.7/user/simple-monitor/
? ? ?https://github.com/apache/dubbo-admin/wiki/dubbo-monitor-simple
?
總結
以上是生活随笔為你收集整理的Dubbo Monitor 分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 并发编程-Semaphore,Cycli
- 下一篇: 关于网络安全QA