借助aop为javaweb应用记录性能数据-java开发java经验技巧

借助aop为javaweb应用记录性能数据-java开发java经验技巧

ID:28375010

大小:72.00 KB

页数:3页

时间:2018-12-09

借助aop为javaweb应用记录性能数据-java开发java经验技巧_第1页
借助aop为javaweb应用记录性能数据-java开发java经验技巧_第2页
借助aop为javaweb应用记录性能数据-java开发java经验技巧_第3页
资源描述:

《借助aop为javaweb应用记录性能数据-java开发java经验技巧》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

1、借助AOP为JavaWeb应用记录性能数据-编程开发技术借助A0P为JavaWeb应用记录性能数据原文出处:潘家邦作为开发者,应用的性能始终是我们最感兴趣的话题Z-O然而,不是所冇的开发者都对口己维护的应用的性能有所了解,更别说快速定位性能瓶颈并实施解决方案了。今年北京Velocity的赞助商大多从事APM领域,提供性能剖析、可视化甚至优化的解决方案。这些厂商的产品看起来能够很好地帮助屮小企业的开发者解决应用性能上的缺陷,但是这些产品儿乎都有着一个致命的缺陷:极强的侵入性。开发者需要在业务生产代码中嵌入APM厂商提供的埋点代码,才能够使用APM厂商提供的Saas服务。

2、在瞬息万变的技术大潮屮,这种代码级别的侵入和绑定,总是让开发者忧心忡忡。如果我作为架构师,在自建APM还是使用SaasAPM上,我也会谨慎考虑。然而无论自建APM述是使用Saas服务,其底层模型无非就是海量日志的实时处理,数据来源就是应用产生的性能日志了。Tfwehavedata,let/slookatdata.Tfal1wehaveareopinions,let"sgowithmine.JimBarksdale这是一个数据为王的时代,夸张一点说,数据可以指导一切!言归止传,如果我们不希望使用APM尝试提供的强侵入的服务,我们就只能口建服务了,比如以AOP的方式采集线

3、程内调用树以及调用开销并输岀日志,然后使用ELK(Elasticsearch,Logstash,andKibana)去采集口志并提供搜索、可视化等功能。如果采集的日志仅作为离线计算使用,可以直接用Flume把日志写入HDFSo随着系统流量越来越大,上述的方案渐渐就扛不住了,然后就需要自己实现高性能的日志采集Agent,把采集到的日志--股脑写入Kafuka之类的能扛大量堆积消息的MQ里面,然后使用Storm/JStorm做实时的流式计算。前些日了我简单搞了一个基于A0P來抓取调用树和开销的尝试,感觉有点意思,分享一下。抓取调用树和时间开销在Java里面获取代码块的时间

4、开销最常见的手段就是?System.currentTimeMi11is()oApache和Guava等流行类库都有对获取时间开销这一功能的封装类StopWatcho捕获调用树就没有什么常见的封装了。一种推荐的做法,是在一次调用中,给每个要剖析的代码块一个唯一的标记,这个标记要能够体现代码块Z间的嵌套、顺序等关系。举个栗子,我们有如下调用关系。fund+-func2

5、+-func3

6、-func4-func5为了体现调用之间的嵌套和顺序,我们给fund标记0,给func2标记0.1,给func3标记0.1.1,给func4标记0.1.2,给func5标记0.2。如此一

7、来,我们便能够轻易地根据标记重建出调用树。我们可以把调用树的抓取和记录毎个代码块的时间开销的功能以线程安全的手法封装起来,给这个封装起一个类似于Profiler的名字。Profiler提供2个静态方法,enter在进入代码块之前调用,exit在代码块结束之后调用。在实现Profiler的时候,需要给每个线程维护一个调用栈,以及剖析结果列表。基本上可以实现为enter压栈,exit退栈并把结果放入结果列表,当调用栈退空后,输出完整的剖析结果。A0P与方法拦截器Profiler有一个需要严格执行的约定,就是enter和exit必须成对调用,就像C++里而new和delet

8、e必须成对岀现一样,否则内存会被直接打爆,远不是内存泄露这么简单。这种约定如果写到业务代码中,会死的很难看,各种tryfinally硬生生的把业务逻辑打断,本來业务代码就已经很恶心了,这么一搞简直没法维护。所以我们需要一种比较科学的方式,以无入侵的方式实现对Profiler的正确调用。A0P是一种合适的工具。这里以SpringA0P为例,实现一个简单的例子。首先引入SpringAOP的依赖,或者包含org.aopalliance.intercept.Methodinterceptor的包。org.springframework

9、spring-aop2.5.6如果需要代码能够运行,还需要引入Cglib的依赖。cglibcglib-nodep〈/artifactld>2.2方法拦截器的参考实现如下,使用tryfinally这样的codepattern去保证Profiler被正确使用。publiccl

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。