监控中心
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容器启动
它们都是基于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查询主机,应用,接口,方法的匹配条件,缺失的条件的表示全部,host用0.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
这是文件在本地存储的格式
文件内容如图保存时间方法消费耗时
3. 起定时任务利用JFreeeChart绘制图表,保存路径
${user.home}\monitor\charts\date\interfaceName\methodName
产生监控数据
注册中心暴露了MonitorService服务,它是被谁调用的呢,监控中心的数据是从哪里来呢,下面我们看下服务提供方与服务的消费方式如何介入监控中心的。
在服务的提供方跟消费方的dubbo配置加入如下配置
通过注册中心<dubbo:monitor protocol="registry" />
或者直连 <dubbo:monitor address="127.0.0.1:7070" />
在构建服务的调用链的时候有如上基于监控的扩展,下面我们就来看下这个类
@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)
//有注解 name跟desc属性都是在页面中展示给用户看的
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大概提供了哪些扩展
下面截几张图看看监控中心的页面。
http://blog.csdn.net/quhongwei_zhanqiu/article/details/41896667
http://blog.csdn.net/quhongwei_zhanqiu/article/details/41896943
相关推荐
7. **源码解析**:深入研究dubbox和springBoot的源码,理解它们的工作原理,这对于优化服务性能和解决故障至关重要。 8. **实战演练**:通过实际操作,如搭建环境、编写服务提供者和消费者、配置监控中心,将理论...
本文将深入探讨基于Apache Incubator Dubbo的Ops项目,特别是通过`incubator-dubbo-ops-master.zip`文件中的内容,来解析Dubbo Admin的实现原理和使用方法。 首先,`incubator-dubbo-ops-master.zip`是Dubbo官网...
《Dubbo监控简易实现详解——基于dubbo-monitor-simple-3.0.0-...了解并掌握其工作原理和功能,对于管理和维护Dubbo服务至关重要。随着版本的迭代,Dubbo的监控能力将持续提升,为开发者带来更便捷、高效的监控体验。
《Dubbo Demo Consumer 2.1.5:深入解析与应用》 在分布式服务框架领域,Dubbo无疑是中国阿里巴巴集团贡献的一款重量级开源产品。它以其高性能、易用性、可扩展性和丰富的生态赢得了广大开发者们的青睐。"dubbo-...
《Dubbo实战:基于dubbo-samples-master的深度解析》 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,一直以来都是Java开发者在分布式服务领域的首选工具。本教程将深入探讨`dubbo-samples-master`...
《Dubbo Maven版实战解析》 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的Java分布式服务框架,深受广大开发者喜爱。本示例项目“dubbo-demo-maven版”是基于Maven构建的,旨在帮助开发者快速理解并掌握Dubbo的...
dubbo-monitor-simple的源码分析有助于深入理解其实现原理。其主要由以下几个部分组成: 1. **Controller层**:处理HTTP请求,提供RESTful API,如`/services`用于获取所有服务信息,`/statistics`用于获取调用统计...
《Dubbo Monitor Simple 2.5.6:一键运行与深度解析》 在现代企业级应用开发中,服务治理框架的重要性不言而喻,而Dubbo作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,备受开发者青睐。本文将详细介绍Dubbo...
《Dubbo Spring Boot Autoconfigure 2.7.8:深入解析与应用》 在Java开发领域,Dubbo作为一款高性能、轻量级的开源服务框架,早已被广大开发者所熟知。而Spring Boot作为Spring框架的简化版,通过自动配置极大地...
本篇将深入解析Dubbo-admin-2.6.0的源码,帮助读者理解其核心机制和工作原理。 1. **项目结构与依赖管理** Dubbo-admin基于Maven构建,通过pom.xml文件管理项目依赖。Maven是Java项目管理工具,负责下载库、构建...
《Dubbo-Go 3.0.5:新一代高性能服务框架源码解析》 Dubbo-Go 3.0.5 是阿里巴巴开源的一款基于 Go 语言实现的高性能、轻量级的服务治理框架,它是 Dubbo 在 Go 语言环境中的延伸,旨在提供一套完整的微服务解决方案...
《Dubbo监控统计中心:深度解析与实践》 在分布式系统中,监控是不可或缺的一环,它能够帮助我们了解系统的运行状态,及时发现并解决问题。Dubbo,作为阿里巴巴开源的一款高性能、轻量级的Java远程服务框架,同样...
《Dubbo核心概念与实战解析》 Dubbo是一款高性能、轻量级的开源Java RPC框架,由阿里巴巴开源并在社区持续维护。"dubbo-demo"是一个基础的Dubbo演示项目,旨在帮助开发者快速理解和掌握Dubbo的基本操作和核心概念。...
而"api详细解释"则表明文档中对Dubbo的各种API进行了深入解析,包括服务提供者、消费者、注册中心、监控中心等组件的接口和使用方法。 【标签】"dubbo"进一步确认了这个压缩包的内容专注于Dubbo框架,可能涉及到的...
《Dubbo 2.5.10管理平台代码解析》 Dubbo,作为阿里巴巴开源的一款高性能、轻量级的Java服务治理框架,已经成为分布式系统开发中的重要组件。它提供了服务注册、服务发现、调用链跟踪、负载均衡、容错等核心功能。...
《Dubbo服务管理端——深度解析与实践指南》 Dubbo是阿里巴巴开源的一款高性能、轻量级的服务治理框架,它提供了服务注册、服务发现、负载均衡、熔断降级等核心功能,极大地提升了分布式系统开发的效率和稳定性。在...
8. **监控与管理**:学习使用Dubbo的监控中心,如Dubbo Admin,进行服务的监控和管理,包括服务的注册与发现、调用统计、健康检查等功能。 9. **实战演练**:通过一个完整的案例,演示如何使用Dubbo构建一个微服务...
《DubboOps:Dubbo运维平台的深度解析》 DubboOps,全称为Apache Dubbo Operations,是基于Apache Dubbo构建的一个运维管理平台,旨在提供全面的监控、管理和配置服务,帮助开发者和运维人员更有效地管理和维护...