叶 峰
摘要:传统监控软件在模块化和灵活性方面存在固有的缺陷,面向方面编程(AOP)是为了解决传统监控软件而提出来,它能够较为理想的解决横切关注点的问题,使系统获得更好的模块化。
关键词: 监控软件;AOP;模块化
1引言
传统的应用软件监控系统中,监控功能在整个系统中表现为一个模块,但由于被监控的对象分布在系统的各个模块中,所以用于实现监控的代码(主要是监控代理的代码)也就分散于需要监控的各个模块中。当系统变化时,这种方式既难维护,也很难深入的进行修改。这造成日后要求对性能需求有更好理解的时候,添加或修改监控程序的代码变得困难。简单地说,系统监控是经典的横切关注点,因此任何非模块化的实现都会让它混乱。针对传统监控软件模块化和灵活性的不足,本文利用面向方面编程的思想提出一种更加模块化、易扩展且易使用的软件监控系统的原型,并进行技术探讨。
2常用的应用监控
2.1常用应用监控
对Tomcat服务器的监控内容主要有:可用性、应答时间明细、内存利用率、线程明细、响应概要、应用的概要和明细、每分钟对于Tomcat服务器的请求、每分钟每JSP的请求及应答时间等。对WebLogic服务器的监控内容主要有:JVM堆栈使用情况、服务器应答时间、所有web应用的指标、用户会话及相关信息、EJB(Enterprise JavaBean), EJB Pool统计量、EJB Cache统计量、Servlet, Thread pool, Java Database Connectivity (JDBC)Pool、等待连接的时间、正在使用的数据库连接所占比例、自定义应用MBean (JMX)属性等。
对WebSphere服务器的监控内容主要有:JVM内存使用率、服务器应答时间、CPU利用率、所有web应用的指标、用户会话及相关信息、Enterprise JavaBeans(EJBs), Thread Pool, Java Database Connectivity (JDBC) Pool、自定义应用MBean(JMX)属性等。
数据库的监控。Oracle数据库的主要监控内容:应答时间、活动用户、状态、表空间使用率、表空间明细、表空间状态、SGA性能、明细、状态、Data文件的性能、会话明细、回退段的信息等。
系统监控。系统监控的对象包括Microsoft Windows系列监控的内容类似,主要是以下四个方面:
CPU利用,监控CPU利用率。检查CPUGnu/Linux和Sun Solaris等,是否被完全利用,或利用不足;内存利用,避免系统因内存溢出而出现问题;并在内存利用率过高(或故障性过低)时获得通知;磁盘利用率,维持一部分空白磁盘空间,如果磁盘空间低于这一界限就会发出通知。当超出闽值时,可以运行自己的程序或脚本来清理磁盘;进程监控,监控系统中的重要进程,并在某一特定进程出现故障时获得通知。
网络服务监控。一般是针对网络中某个TCP端口(如FTP-21, Telnet-23)上运行的不同服务提供可用性和性能监控,主要任务包括:可用性,提供服务的可用性;应答时间,提供服务的应答时间Web服务器监控。Apache服务器的主要监控内容:被访问的次数、负载、正常运行的持续时间、每分钟的请求数量、每秒传输的字节数量、每个请求传输的字节数量、活动线程数、非激活的线程数等。IIS服务器的主要监控内容:服务器的可用性、服务器的应答时间。PHP服务器的主要监控内容:服务器的可用性、服务器的应答时间。
2.2监控分类
在对软件的监控过程中,人们感兴趣的监控任务按其监控的对象可以分为如下几类:时间相关的信息,包括系统的启动时刻、停止时刻、请求的延时、操作的耗时、服务持续的时间等。配置情况,系统一般都有一些可配置的选项,如是否启动某项功能等。性能数据,系统中的关键组件的性能一般都是监控的重点,性能一般是指时间和状态信息的相关组合。历史数据,统计某种服务或操作的次数,某些对象的总数等互操作信息,包括各个组件间建立的连接,连接的状态和连接上的请求的相关信息(如请求者、被请求者、请求延时等),通过其它方式实现的服务请求的信息等。状态数据,包括系统的负载,各个组件是否可用等信息。从系统的角度划分监控任务。由于我们考察的监控对象都是应用软件,所以有必要从软件系统的角度来对这些监控对象进行分析和总结。
各种软件的实现方法各不相同,大部分的内部结构也可能错综复杂,但是这些软件一般都可以看成是一组核心服务和相关周边服务组成的、能对外提供某种应用接口的功能实体。其监控内容可以按如下方式划分对核心服务的监控;对周边服务组件的监控;对核心服务与其他组件互操作请求的监控;从统计数据类别划分监控任务。大多数监控任务在获得原始的监控数据之后,还需要将几个不同的对象的值或者同一个对象不同时刻的值进行统计分析,以获取人们感兴趣的信息。对于多个不同的对象,常见的统计类型有:最常出现、最少出现、每种对象出现的概率、总数等;对于同一个对象,常见的统计类型有:总数、最大值、最小值、平均值等。
从监控手段划分监控任务。虽然监控的对象千差万别,但监控软件使用的监控手段并不是很多,主要有直接的和间接的两种。直接的方法比较简单,一般是通过系统调用直接获取待监视系统的状态或直接读取其中某个变量的值。如系统的CPU负载和内存使用率的监控就是直接调用系统的相关函数得到的。间接的方法主要用于监控对象间请求和操作。例如要监控某个请求,常用的方法是拦截这个请求,对其上下文进行分析,然后再按原路径继续这个请求。
2AOP的技术优势
AOP作为一种程序设计方法学,关注于提高软件的抽象程度和模块性,从而在很大程度上改善了软件的可扩展性、可重用性、易理解性和易维护性。
可扩展性。AOP提供系统的扩展机制是通过扩展aspect(如继承)或增加aspect来实现的。由于方面模块根本不知道横切关注点,所以很容易通过建立新的方面加入新的功能。
可重用性。可重用性是指某个应用系统中的元素被应用到其他系统的能力。AOP中的系统模块包括系统组件和影响这些组件的系统特性,通过将实现基本功能的组件和特定于应用的系统特性分离,并把每个系统特性实现为独立的方面模块,使得组件的重用性得到提高,并使不能封装为类或函数的系统特性的重用成为可能。
易理解性和易维护性。AOP用最小的祸合处理每个关注点,使得横切关注点也是模块化的,从而避免了传统开发方法中由于对横切关注点的解决而导致的代码混乱和代码分散,提高了程序的易理解性。而且,对一个aspect的修改可以通过编织器影响到系统相关的各个部分,大大提高了系统的易维护性。
3实现AOP的关键技术
编织(weaving)是实现AOP的一个重要机制,利用方面编织器将方面代码织入到核心功能代码中,可以构建最终系统。
3.1静态编织和动态编织
静态编织是指在核心功能代码中的适当位置,比如某段代码调用前后将方面代码织入,从而形成混合的编码;而动态编织可以在程序运行时,根据上下文决定调用的方面和它们的先后顺序以及增加或删除一个方面等。利用静态编织的工具有Aspect), AspectC一等;其他一些使用反射技术或运行时代码织入技术的体系结构都属于动态编织,这样的工具有AspectWerkz, Jboss, Spring AOP, AOP/ST等。
3.2不同时刻的编织
编译时编织。编译时编织可以在编译前进行预处理,将两种代码自动混合,将方面中的代码自动插入到功能模块代码的合适位置处,也可在编译后,对编译后的代码进行操作。
载入时编织。载入时编织是在代码载入时,实现代码的编织。利用对字节码的修改实现方面的织入,通过引入一个被称为方面容器的间接层以及对字节码的转化来实现动态AOP的要求。
运行时编织。运行时编织是指在运行时根据对方法的调用执行适当的方面代码以实现编织。运行时编织可能是所有编织方式中最为灵活的,程序在运行过程中可以为单个的对象指定是否需要编织特定的Aspect。运行时编织采用的编织技术有反射、动态代理和拦截器。
参考文献
[1]周立萍,陈平.逆向工程发展现状研究[J].计算机工程与设计,2004.
[2]周之英,现代软件工程(中)[M].北京:科学出版社,2000.
[3]宋亚奇. 基于代码混淆的软件保护技术研究 [D]. 西安:西北大学.2005.