知识大全 基于Spring AOP实现对外接口的耗时监控

Posted

篇首语:那些惊艳了你时光的人,不一定能温柔你的岁月。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 基于Spring AOP实现对外接口的耗时监控相关的知识,希望对你有一定的参考价值。

基于Spring AOP实现对外接口的耗时监控  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  AOP是Spring的核心 Spring不但自身对多种框架的集成是基于AOP 并且以非常方便的形式暴露给普通使用者 以前用AOP不多 主要是因为它以横截面的方式插入到主流程中 担心导致主流程代码不够清晰 定位问题不够方便 而在计费二期的项目里需要一个很适合用AOP来做的功能 就是要把对外接口和所调用的外部接口的耗时时间给记录下来 这个需求主要来自于计费一期的联调 常常发生系统间交互不够顺畅的情况 这就需要看每个接口调用时间来判定是谁的问题

  计费中心是整个后台系统的中间环节 与其他系统交互很多 这样的接口也很多 如果在每个接口的调用前后加时间记录比较繁琐 也影响主流程代码的美观 因此比较优雅的方式是用AOP 在不侵入原有代码的情况下 加上对接口调用的监控 并且可以在不需要的时候很容易移除 今天尝试了一下 感觉还挺好用 下面讲述一下实施步骤

   )引入包依赖

  本项目基于maven构建 因此加上包依赖比较方便 我需要的AOP依赖库有以下三个

  [x]

  <dependency>

  <groupId> springframework</groupId>

  <artifactId>spring aop</artifactId>

  <version> </version>

  </dependency>

  <dependency>

  <groupId> aspectj</groupId>

  <artifactId>aspectjweaver</artifactId>

  <version> </version>

  </dependency>

  <dependency>

  <groupId> aspectj</groupId>

  <artifactId>aspectjrt</artifactId>

  <version> </version>

  </dependency>

  <dependency>

  <groupId> springframework</groupId>

  <artifactId>spring aop</artifactId>

  <version> </version>

  </dependency>

  <dependency>

  <groupId> aspectj</groupId>

  <artifactId>aspectjweaver</artifactId>

  <version> </version>

  </dependency>

  <dependency>

  <groupId> aspectj</groupId>

  <artifactId>aspectjrt</artifactId>

  <version> </version>

  </dependency>

   )加上AOP的Spring配置文件

  billing spring aop xml:

  [x]

  <?xml version= encoding= UTF ?>

  <beans xmlns=

  xmlns:xsi= instance

  xmlns:aop=

  xmlns:tx=

  xsi:schemaLocation= beans xsd

   aop xsd

   tx xsd >

  <bean id= openApiLogAspect class= bu billing framework aop OpenApiLogAspect >

  </bean>

  <aop:config>

  <! 配置aspect切面类 >

  <aop:aspect ref= openApiLogAspect >

  <! 配置pointcut 即切入点 对哪些类的哪些方法起到AOP的作用 >

  <aop:pointcut id= EsbPriceService

  expression= execution(* product EsbPriceService *()) />

  <aop:pointcut id= EsbProductService

  expression= execution(* product EsbProductService *()) />

  <aop:pointcut id= IAuthorizeControllerService

  expression= execution(* alibaba bss pc server remoting IAuthorizeControllerService *()) />

  <aop:pointcut id= IOpenApiOrderItemService

  expression= execution(* llect IOpenApiOrderItemService *()) />

  <aop:pointcut id= IOpenApiBillingCollectService

  expression= execution(* llect IOpenApiBillingCollectService *()) />

  <aop:pointcut id= IOpenApiInvoiceService

  expression= execution(* bu billing api invoice IOpenApiInvoiceService *()) />

  <aop:pointcut id= IOpenApiChargeProductInfoService

  expression= execution(* llect IOpenApiChargeProductInfoService *()) />

  <! 配置advice 这里采用在业务方法执行前后进行拦截 >

  <aop:around method= logExecuteTime pointcut ref= EsbPriceService />

  <aop:around method= logExecuteTime pointcut ref= EsbProductService />

  <aop:around method= logExecuteTime pointcut ref= IAuthorizeControllerService />

  <aop:around method= logExecuteTime pointcut ref= IOpenApiOrderItemService />

  <aop:around method= logExecuteTime pointcut ref= IOpenApiBillingCollectService />

  <aop:around method= logExecuteTime pointcut ref= IOpenApiInvoiceService />

  <aop:around method= logExecuteTime pointcut ref= IOpenApiChargeProductInfoService />

  </aop:aspect>

  </aop:config>

  </beans>

  <?xml version= encoding= UTF ?>

  <beans xmlns=

  xmlns:xsi= instance

  xmlns:aop=

  xmlns:tx=

  xsi:schemaLocation= beans xsd

   aop xsd

   tx xsd >

  <bean id= openApiLogAspect class= bu billing framework aop OpenApiLogAspect >

  </bean>

  <aop:config>

  <! 配置aspect切面类 >

  <aop:aspect ref= openApiLogAspect >

  <! 配置pointcut 即切入点 对哪些类的哪些方法起到AOP的作用 >

  <aop:pointcut id= EsbPriceService

  expression= execution(* product EsbPriceService *()) />

  <aop:pointcut id= EsbProductService

  expression= execution(* product EsbProductService *()) />

  <aop:pointcut id= IAuthorizeControllerService

  expression= execution(* alibaba bss pc server remoting IAuthorizeControllerService *()) />

  <aop:pointcut id= IOpenApiOrderItemService

  expression= execution(* llect IOpenApiOrderItemService *()) />

  <aop:pointcut id= IOpenApiBillingCollectService

  expression= execution(* llect IOpenApiBillingCollectService *()) />

  <aop:pointcut id= IOpenApiInvoiceService

  expression= execution(* bu billing api invoice IOpenApiInvoiceService *()) />

  <aop:pointcut id= IOpenApiChargeProductInfoService

  expression= execution(* llect IOpenApiChargeProductInfoService *()) />

  <! 配置advice 这里采用在业务方法执行前后进行拦截 >

  <aop:around method= logExecuteTime pointcut ref= EsbPriceService />

  <aop:around method= logExecuteTime pointcut ref= EsbProductService />

  <aop:around method= logExecuteTime pointcut ref= IAuthorizeControllerService />

  <aop:around method= logExecuteTime pointcut ref= IOpenApiOrderItemService />

  <aop:around method= logExecuteTime pointcut ref= IOpenApiBillingCollectService />

  <aop:around method= logExecuteTime pointcut ref= IOpenApiInvoiceService />

  <aop:around method= logExecuteTime pointcut ref= IOpenApiChargeProductInfoService />

  </aop:aspect>

  </aop:config>

  </beans>

  我是基于配置完成AOP接入 这样做的好处是不需要对原有主流程代码有任何浸入 并且也比较容易移除本AOP的拦截 这段代码主要就是配置aspect pointcut和advice

   )编写监控耗时的advice

  OpenApiLogAspect:

  [java]

  public class OpenApiLogAspect

  private static LoggerService logger = LoggerFactory getLogger(OpenApiLogAspect class);

  public Object logExecuteTime(ProceedingJoinPoint joinPoint) throws Throwable

  Date start = new Date();

  try

  return joinPoint proceed(joinPoint getArgs());

  catch(Exception err)

  throw err;

  finally

  Date end = new Date();

  ( OpenApiExecuteTime: +joinPoint getSignature() getName()+ takes +(end getTime() start getTime())+ ms );

  

  

  

  public class OpenApiLogAspect

  private static LoggerService logger = LoggerFactory getLogger(OpenApiLogAspect class);

  public Object logExecuteTime(ProceedingJoinPoint joinPoint) throws Throwable

  Date start = new Date();

  try

  return joinPoint proceed(joinPoint getArgs());

  catch(Exception err)

  throw err;

  finally

  Date end = new Date();

  ( OpenApiExecuteTime: +joinPoint getSignature() getName()+ takes +(end getTime() start getTime())+ ms );

  

  

  

  此段代码就是基于around的方式来拦截接口调用 在实际调用的前后加上时间记录 并最后在日志里打印出时间差 其中joinPoint proceed(joinPoint getArgs());是对实际接口的调用

   )使监控可以配置化

  此功能只会在调试阶段使用 并不需要在生产环境中运行 因此需要可以配置是否监控接口 实施这个配置化很简单 只需要通过配置决定是否把aop spring的配置文件加入到容器里就可以了 因此在总容器applicationContext xml vm里加上如下代码

  #if($monitor_openapi_showTime== true )

  <import resource= classpath*:bean/billing spring aop xml />

  #end

  在编译打包过程中会根据变量monitor_openapi_showTime来决定是否把billing spring aop xml引入进来

   )运行效果

  在监控开启的情况下 若发生接口调用 能从日志里看到如下记录

   : : [OpenApiLogAspect java: ] [bu billing framework aop OpenApiLogAspect] INFO bu billing framework aop OpenApiLogAspect :: OpenApiExecuteTime:installOrderItem takes ms

   : : [OpenApiLogAspect java: ] [bu billing framework aop OpenApiLogAspect] INFO bu billing framework aop OpenApiLogAspect :: OpenApiExecuteTime:installOrderItem takes ms

cha138/Article/program/Java/ky/201311/28361

相关参考

知识大全 Spring AOP 详解

SpringAOP详解  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  此前对于AOP的使用仅限于

知识大全 浅析Spring.net中的Aop使用

浅析Spring.net中的Aop使用  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &

知识大全 Spring事务处理及其AOP框架的内幕

Spring事务处理及其AOP框架的内幕  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  ***注

知识大全 开源技术分析:AOP和Spring事务处理

开源技术分析:AOP和Spring事务处理  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一为什

知识大全 Spring3.0中的AOP配置方法

Spring3.0中的AOP配置方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  第一种配置方

知识大全 spring aop中单独代理和自动代理的设置

  spring的aop机制提供两类方式实现类代理一种是单个代理一种是自动代理  单个代理通过ProxyFactoryBean来实现自动代理通过BeanNameAutoProxyCreator或者De

知识大全 Spring AOP的一些概念

SpringAOP的一些概念  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  切面(Aspect)

知识大全 用Spring AOP实现开发中松散耦合

用SpringAOP实现开发中松散耦合  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!引言  AOP

知识大全 用Spring AOP实现松散耦合

用SpringAOP实现松散耦合  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nbs

知识大全 Spring AOP之Hello World

SpringAOP之HelloWorld  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  我们使用