日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dubbo Monitor 分析

發布時間:2023/12/18 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 分析的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。