网站可免费做,深圳龙华区好玩的地方,网站备案是在哪里查,免费ppt模板下载简约Dubbo发布代码中#xff0c;自带了一个简易的监控中心实现。对于一般的小业务这个监控中心应该能够满足需求#xff0c;对于那些大业务量的大公司一般都会有自己的监控中心#xff0c;更加丰富的功能如常用的报警短信通知等等。这章讲解分析使得读者能够了解一般的监控中心实… Dubbo发布代码中自带了一个简易的监控中心实现。对于一般的小业务这个监控中心应该能够满足需求对于那些大业务量的大公司一般都会有自己的监控中心更加丰富的功能如常用的报警短信通知等等。这章讲解分析使得读者能够了解一般的监控中心实现也使得有自己接入监控中心需求的大概知道如何集成自己的监控中心实现。下面我们就以dubbo自带的监控中心开始讲解。 监控中心 1. 监控中心启动我们先看下dubbo的属性文件 dubbo.containerlog4j,spring,registry,jetty dubbo.application.namesimple-monitor dubbo.application.owner dubbo.registry.addresszookeeper://127.0.0.1:2181 dubbo.protocol.port7070 dubbo.jetty.port8080 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的配置文件 beanidmonitorServiceclasscom.alibaba.dubbo.monitor.simple.SimpleMonitorService propertynamestatisticsDirectoryvalue${dubbo.statistics.directory}/ propertynamechartsDirectoryvalue${dubbo.charts.directory}/ /bean dubbo:applicationname${dubbo.application.name}owner${dubbo.application.owner}/ dubbo:registryaddress${dubbo.registry.address}/ dubbo:protocolnamedubboport${dubbo.protocol.port}/ dubbo:serviceinterfacecom.alibaba.dubbo.monitor.MonitorServicerefmonitorServicedelay-1/ dubbo:referenceidregistryServiceinterfacecom.alibaba.dubbo.registry.RegistryService/ 2. SimpleMonitorService 监控中心配置了监控服务的实现SimpleMonitorService, 并且作为一个普通的dubbo服务暴露到注册中心供服务的提供者和服务的消费方调用将服务提供者和服务的消费方的调用数据保存到监控中心。 监控服务的接口定义 public interface MonitorService { /** * 监控数据采集. * 1. 支持调用次数统计count://host/interface?applicationfoomethodfooprovider10.20.153.11:20880success12failure2elapsed135423423 * 1.1host,application,interface,group,version,method记录监控来源主机应用接口方法信息。 * 1.2 如果是消费者发送的数据加上provider地址参数反之加上来源consumer地址参数。 * 1.3 success,faulure,elapsed 记录距上次采集调用的成功次数失败次数成功调用总耗时平均时间将用总耗时除以成功次数。 * * paramstatistics */ void collect(URLstatistics); /** * 监控数据查询. * 1. 支持按天查询count://host/interface?applicationfoomethodfoosideproviderviewchartdate2012-07-03 * 1.1host,application,interface,group,version,method查询主机应用接口方法的匹配条件缺失的条件的表示全部host用0.0.0.0表示全部。 * 1.2 sideconsumer,provider 查询由调用的哪一端采集的数据缺省为都查询。 * 1.3 缺省为viewsummary返回全天汇总信息支持viewchart表示返回全天趋势图表图片的URL地址可以进接嵌入其它系统的页面上展示。 * 1.4 date2012-07-03指定查询数据的日期缺省为当天。 * * param query * returnstatistics */ ListURL lookup(URL query); } 注: lookup方面可能在开源过程中依赖了阿里的什么系统并没有具体的实现如果使用着需要此功能则需要根据接口定义自己实现 MonitorService的dubbo默认实现SimpleMonitorService Collect方法被远程调用后将数据url(传过来的url包含监控需要的数据)保存到一个阻塞队列中BlockingQueueURL 启动定时任务将统计日志记录到本地, 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 protocolregistry / 或者直连 dubbo:monitor address127.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, velocityfreemarker等一些编写web应用的技术采用在servlet中将htmlcssjs打印出来 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) { ListListString rows new ArrayListListString(); 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); ListString row newArrayListString(); 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文件中的扩展配置 indexcom.alibaba.dubbo.container.page.pages.HomePageHandler providerscom.alibaba.dubbo.monitor.simple.pages.ProvidersPageHandler consumerscom.alibaba.dubbo.monitor.simple.pages.ConsumersPageHandler 。。。。 下面截图看下dubbo大概提供了哪些扩展 下面截几张图看看监控中心的页面。 转载于:https://www.cnblogs.com/duyinqiang/p/5696319.html