解决方案:Dubbo原理解析-监控
优采云 发布时间: 2022-12-09 07:27解决方案: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容器启动注册中心更多
它们都是基于dubbo的spi扩展机制。
SpringContainer容器启动就是加载classpath*:META-INF/spring/*.xml spring的配置文件
"monitorService" class="com.alibaba.dubbo.monitor.simple.SimpleMonitorService">
"statisticsDirectory" value="${dubbo.statistics.directory}"/>
"chartsDirectory" value="${dubbo.charts.directory}"/>
"${dubbo.application.name}"owner="${dubbo.application.owner}"/>
"${dubbo.registry.address}"/>
"dubbo"port="${dubbo.protocol.port}"/>
"com.alibaba.dubbo.monitor.MonitorService"ref="monitorService"delay="-1"/>
"registryService" interface="com.alibaba.dubbo.registry.RegistryService"/>
2.简单监控服务
监控中心配置监控服务SimpleMonitorService的实现,作为一个普通的dubbo服务暴露给注册中心,供服务提供者和服务消费者调用,并将服务提供者和服务消费者的调用数据保存到监控中心.
监控服务接口定义
publicinterfaceMonitorService {
/**
*监控数据采集。
* 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 如果是消费者发送的数据,则添加提供者地址参数,否则添加源消费者地址参数。
* 1.3 success,faulure,elapsed records from last 采集,调用成功次数,调用失败次数,调用成功总耗时,平均耗时除以总耗时成功调用的次数。
*
*@paramstatistics
*/
voidcollect(网址统计);
/**
*监控数据查询。
* 1.支持按天查询:count://host/interface?application=foo&method=foo&side=provider&view=chart&date=2012-07-03
* 1.1 host, application, interface, group, version, method查询host,application,interface,method的匹配条件,缺失条件代表全部,host用0.0.0.0代表全部。
* 1.2 side=consumer,provider 查询哪一端采集数据被调用,默认两者都查询。
* 1.3 默认为view=summary,返回全天的汇总信息,支持view=chart,表示返回全天的趋势图图片的URL地址,可以展示在其他嵌入的页面上系统。
* 1.4 date=2012-07-03 指定查询数据的日期,默认为今天。
*
*@paramquery
*@returnstatistics
*/
列表查找(URL查询);
}
注:查找在开源过程中可能依赖阿里的系统,没有具体实现。如果需要这个功能,需要根据接口定义自己实现
MonitorService的dubbo默认实现了SimpleMonitorService
远程调用Collect方法后,将数据url(传过来的url收录监控需要的数据)保存在一个阻塞队列BlockingQueue中
启动定时任务记录统计日志到本地,
字符串文件名=${user.home}/monitor/statistics
+"/"+天
+"/"+统计。获取服务接口()
+"/"+统计。获取参数(方法)
+"/"+消费者
+"/"+ 供应商
+"/"+ 输入 +"."+ 键
这是文件在本地存储的格式
文件内容保存如图,保存方法比较耗时
3.启动定时任务,使用JFreeeChart绘制图表并保存路径
${user.home}\monitor\charts\date\interfaceName\methodName
生成监控数据
注册中心对外暴露了MonitorService服务。谁调用的,监控中心的数据来自哪里?下面看看服务提供者和服务的消费方式是如何介入监控中心的。
在服务提供者和消费者的dubbo配置中添加如下配置
通过注册表
或直接连接
在构建服务的调用链时,有上述基于监控的扩展。下面我们来看看这个类。
@Activate(group = {Constants.PROVIDER, Constants.CONSUMER})
//这个过滤器在服务提供者和服务消费者应用中被激活,即起作用
公共类 MonitorFilter 实现 Filter {
私人监视器工厂监视器工厂;
公共结果调用(Invokerinvoker,调用调用)抛出 RpcException {
if(invoker.getUrl().hasParameter(Constants.MONITOR_KEY)) {
//有备注监控中心处理
1.获取调用者的调用上下文
2.记录开始时间戳
3.并发数加一
尝试 {
4.调用调用链中的下一步
5. 采集来电信息
} 最后 {
6.并发数减一
}
} 别的 {
//没有配置监控中心,直接调用
返回 invoker.inovke(调用);
}
}
关于上述第 5 点的信息 采集
1.计算调用耗时
2.获取并发数
3.获取服务名称
4.获取方法名
5.判断是服务消费者还是服务提供者*敏*感*词*
6.从工厂类monitorFactory.getMonitor(监控url)获取DubboMonitor对象,
构造Url调用监控中心服务,url收录监控中心需要的监控信息
monitor.collect(newURL(常量.COUNT_PROTOCOL,
NetUtils.getLocalHost(), 本地端口,
服务+“/”+方法,
监控服务。申请,申请,
监控服务。界面、服务、
MonitorService.METHOD,方法,
远程键,远程值,
错误?MonitorService.FAILURE:MonitorService.SUCCESS,“1”,
MonitorService.ELAPSED, String.valueOf(elapsed),
MonitorService.CONCURRENT,String.valueOf(并发),
Constants.INPUT_KEY,输入,
常数。OUTPUT_KEY, 输出));
DubboMonitor是对调用监控中心的服务的封装。之所以不直接调用监控中心,而是通过DubboMonitor来调用,是因为监控是一个附加功能,不应该影响主链路,不应该破坏主链路的新性能。DubboMonitor采集收到数据后,通过任务定时调用监控中心服务,将数据提交给监控中心。
注册表容器
监控中心指的是注册中心对外暴露的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、系统相关信息。同时提供了一系列的方法供注册中心调用和查询。
Jetty容器
监控中心将采集收到的信息通过内置的jetty展示给用户。这里为了不依赖jsp、velocity、freemarker等技术编写web应用,将html、css、js打印在servlet中
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添加到集合中,供HomePageHandler生成首页和各页面的uri
PageServet的doGet和doPost接收浏览器请求,请求是xx.hml的形式,xx是PageHandler扩展的key,找到对应的PageHandler绘制对应的页面返回给浏览器。
@Menu(name = "主页", desc = "主页", order = Integer.MIN_VALUE)
//注解的name和desc属性在页面上显示给用户
公共类 HomePageHandler 实现 PageHandler {
公共页面句柄(URL url){
列表> 行 = 新的 ArrayList>();
for (PageHandler handler :PageServlet.getInstance().getMenus()) {
String uri =ExtensionLoader.getExtensionLoader(PageHandler.class).getExtensionName(handler);//这个uri其实就是PageHandler扩展配置的key,用于页面请求选择特定的handler进行绘制 //特定页面
菜单 menu =handler.getClass().getAnnotation(Menu.class);
列表行 = newArrayList();
row.add("" + menu.name() +"");
row.add(menu.desc());
行。添加(行);
}
return new Page("Home", "Menus", new String[]{"Menu Name", "Menu Desc"}, rows);//一个Page实体是一个页面,收录了主HomePage的所有页面内容
}
}
com.alibaba.dubbo.container.page.PageHandler文件中PageHandler的扩展配置
index=com.alibaba.dubbo.container.page.pages.HomePageHandler
providers=com.alibaba.dubbo.monitor.simple.pages.ProvidersPageHandler
消费者=com.alibaba.dubbo.monitor.simple.pages.ConsumersPageHandler
. . . .
下面截图看看dubbo提供了哪些扩展
下面截图几张,看看监控中心页面。
解决方案:论文替换词软件
论文代写软件
写作文同义词替换软件有费大儒同义词
飞达路同义词替换工具最新版是一款可以帮助用户替换同义词的软件。飞达路同义词替换工具正式版可以让您的替换更加DIY,更加个性化。是站长朋友更新网站数据的好帮手。飞达路同义词替换工具最新版界面简洁,操作简单,简单易用,用户可以放心使用。
1.支持伪原创各种文章,只需要输入旧的文章内容,一键生成原创,然后伪原创
2. 支持伪原创的多种方式,包括同义词替换、加扰文章、生成原创
3. 支持多种文章混排选项,包括清除换行、清除空格、添加新的关键词
4.支持词库管理,添加新词,替换原词,下载词库
5.支持批量伪原创,输入批量生成地址和网络提交地址,即可批量伪原创本地源目录或网络下载列表
有什么好的编辑论文的软件吗?
PaperEasy论文修改助手。
使用操作简单,一键修改,无需复杂操作,无需立即下载使用,绿色支持免费试用。大学生修改论文,降低论文重复率的神器!界面清爽,无广告。
PaperEasy论文编辑助手可以有效解决论文重复率高和无词无词的困境,可以快速将重复的原句改成新的原创内容。快速、智能、高效!
中华人民共和国国家标准VDC 001.81和GB 7713-87将学术论文定义为:
学术论文是对某一学科在实验、理论或观察方面有新的科学研究成果或创新见解的知识和科学记录;或在实践中应用已知原理所取得的新进展的科学总结。提供书面文件供学术会议阅读、交流或讨论;或在学术期刊上发表;或用于其他目的。
在社会科学领域,人们通常把表达科学研究成果的论文称为学术论文。
学术论文具有四个特点:①学术性、②科学性、③创造性、④理论性。
1.学术
学术论文的学术性要求作者在论证时不得有个人好恶,不得主观臆断。他实际上必须从客观现实出发,并从中得出现实的结论。在证据方面,要尽可能多地掌握信息,以最充分、最确凿、最有力的论据作为论证的依据。论证时,一定要慎重思考,论证严谨。
二、科学
学术论文在形式上是议论文,但不同于一般的议论文。他们必须有自己的理论体系,而不仅仅是材料清单。要对大量的事实和材料进行分析研究,提高感性认识。到理性认识。
一般来说,学术论文都带有议论文的色彩,或者说带有议论文的色彩。论文内容必须符合历史唯物主义和唯物辩证法,符合“实事求是”、“有针对性”、“分析与综合”相结合的科学研究方法。
3.创意
科学研究是对新知识的探索。创造力是科学研究的生命。学术论文的创造性在于作者必须有自己独到的见解,能够提出新的观点和新的理论。
这是因为科学的本质是“革命的、非正统的”,“科学方法主要是发现新现象和形成新理论的手段,旧的科学理论必然不断被新理论推翻”。(Stephen Mason) 因此,没有创造力,学术论文就没有科学价值。
4.理论
它是指需要用通俗易懂的语言来表达科学原理,不仅要流畅,而且要准确、清晰、和谐、生动。
有哪些好用的论文翻译软件?(二)
6.海词在线词典
海词在线词典由在美国印第安纳大学留学的中国*敏*感*词*范建淼所创。于2003年11月27日(美国感恩节)正式使用。词汇主要由电脑生成,准确率弱于iciba,但提供大量例句,并有发音,可以帮助纠正发音问题。海词还提供了大量的小工具,您可以将它们添加到您的博客或个人网站中,以增加更多丰富多彩的功能。
7.百度词典
百度词典的定义来自一点通,并没有做太大的改进。没有拼写提示也没有发音,基本没有特点。类似于手册的参考书。
8.免费翻译
国外的一个免费翻译工具,感觉这个工具的翻译结果还是比较满意的。翻译时可以选择“人工翻译”和“自动翻译”,“人工翻译”为付费服务。
9. 生物医学词典
生物医学词典为生物医学领域的专业人士提供写作、阅读和翻译的便利,最终实现了一部自我编辑、自我完善的公共词典。用户可以使用简体中文、英文、繁体中文和缩略语的任意组合进行模糊查询。目前,收录的字数已超过120万,并且还在不断增加中。