当前位置: 首页 > 科技观察

居然可以这样监控,你学会了吗?

时间:2023-03-18 15:35:49 科技观察

前面提到,要让自定义注解生效,需要写一段驱动代码,那么驱动代码的启动执行方式是什么才合适呢?您可能知道答案:应用程序启动时。回到具体的代码实现,假设应用(客户端或服务端)依赖RPC框架,使用Spring环境,熟悉Spring的应该都知道,Spring会在启动时初始化bean,是否可以执行初始化bean后的驱动程序代码?答案是肯定的。查阅相关资料后,Spring监听器可以实现上述请求。Spring监听器监听器在使用过程中可以监听某些感兴趣的事件,当检测到事件时可以做出响应。Spring事件监听系统包括事件监听器、事件、事件广播器三个核心组件,如下图所示:提前在活动广播中注册。事件所有动作都可以定义为一个事件。事件发生后,事件广播者通知所有的监听器,监听器根据情况做出响应。Spring定义了一个事件基类:ApplicationEvent,看下源码:publicabstractclassApplicationEventextendsEventObject{/**事件发生的时间*/privatefinallongtimestamp;/***创建实例*@paramsource事件源*/publicApplicationEvent(Objectsource){super(source);this.timestamp=System.currentTimeMillis();}...省略其他代码}ApplicationEvent继承JDK定义的事件基类:EventObject,publicclassEventObjectimplementsjava.io.Serializable{/***最初发生Event的对象。*/protectedtransientObjectsource;...省略其他代码}ApplicationEvent是一个抽象类,如果需要自定义事件,需要继承这个类:publicclassMyEventextendsApplicationEvent{......省略其他代码}当然,Spring本身已经定义了很多events:ContextRefreshedEvent:这个事件在ApplicationContext初始化或刷新时发布。初始化意味着所有的Bean被成功加载,后处理Bean被检测和激活,所有的SingletonBeans被预实例化,ApplicationContext容器准备好使用了。ContextStartedEvent:此事件在ApplicationContext启动时发布。ContextStoppedEvent:此事件在ApplicationContext停止时发布。ContextClosedEvent:该事件在ApplicationContext关闭时发布。以上只是几个常用的Spring事件。根据上面分析的业务需求,我们希望所有的bean在初始化之后都开始执行自定义注解驱动代码,所以我们感兴趣的事件是ContextRefreshedEvent。看看源码:publicclassContextRefreshedEventextendsApplicationContextEvent{publicContextRefreshedEvent(ApplicationContext源){超级(源);}}看起来很简单,继承ApplicationContextEvent,继续追源码发现ApplicationContextEvent继承了我们上面说的ApplicationEvent。事件监听器所有的事件监听器都注册在事件广播器中,它就像观察者模式中的观察者。在Spring中,ApplicationListener是事件监听器的顶层接口,继承自JDK的EventListener,所有的监听器都必须实现这个接口。publicinterfaceApplicationListenerextendsEventListener{/***处理事件*@paramevent要响应的事件*/voidonApplicationEvent(Eevent);//...省略其他代码}定义了一个onApplicationEvent方法,当有感兴趣的事件发生后执行该方法进行处理。实现自定义监听器以上介绍了Spring监听系统的一些基础知识,并使用了一些源码来辅助介绍。这些代码不是由RPC框架编写的。RPC框架目前需要做的是实现一个自定义监听器来监听兴趣。事件。根据业务需求分析:自定义一个监听器,监听Spring内置的ContextRefreshedEvent事件。publicclassDefaultRpcListenerimplementsApplicationListener{publicDefaultRpcListener(){}@OverridepublicvoidonApplicationEvent(ContextRefreshedEventevent){//TODO实现业务逻辑//1服务器逻辑处理//2客户端逻辑处理}}自定义监听器实现ApplicationListener接口并重写了onApplicationEvent方法。方法中要实现的业务逻辑是最重要的。在要实现的业务逻辑中,需要处理@ServiceExpose和@ServiceReference这两个注解。@ServiceExpose对应服务端,@ServiceReference对应客户端,所以基本上分为两部分:服务端逻辑处理和客户端逻辑处理。注意,本文所说的服务端或客户端是从功能的角度出发的,不能片面理解。一个应用(服务或微服务)既可以是服务端也可以是客户端:SpringListener-Part如第2页上图所示,微服务A调用微服务B,微服务B调用微服务C,微服务B既是客户端又是客户端整个调用链中的服务器。代码结构自定义监听器DefaultRpcListener放在监听器包下。目前RPC框架代码工程结构如下:├──easy-rpc-spring-boot-starter├──pom.xml├──src│└──main│├──java││└──com││└──雷小帅││└──easyrpc││├──注解││├──ServiceExpose.java││└──ServiceReference.java││└──listener│ener│ja?List─.└──resources└──target总结这一节首先学习了Spring监控的基本机制,了解到监控系统有三个关键要素:事件监听器,事件,事件广播器,事件监听器会被注册到事件广播器中提前,事件广播器会在感兴趣的事件发生时通知事件监听器,以便事件监听器根据业务场景进行响应。Spring提供了事件的基类,可以自定义事件,当然也可以直接使用Spring内置的事件,结合RPC框架的业务特点,我们发现ContextRefreshedEvent事件更符合我们的诉求.Spring定义了事件监听器ApplicationListener的顶层接口。我们只需要实现这个接口来自定义一个监听器,重写监听器中的onApplicationEvent方法即可实现相应的业务逻辑。自定义监听器的主要业务逻辑包括服务端和客户端两部分。服务器端逻辑主要处理@ServiceExpose注解,客户端逻辑主要处理@ServiceReferece注解。注释处理的逻辑将在下一节中详细说明。