add yoho.core事件机制及系统监控
Showing
1 changed file
with
54 additions
and
0 deletions
技术分享/com.yoho.core事件及系统监控机制的实现逻辑.md
0 → 100644
1 | +yohobuy事件及系统监控机制的实现逻辑 | ||
2 | +---- | ||
3 | +## 一、大致思路 | ||
4 | +基于spring事件机制,根据需要监控的内容(数据库操作、rabitMQ、服务调用、log、异常等)定义各类事件和监听器,通过AOP或者直接方式捕获并发布事件,各监听器处理事件并通过包装在监听器内部的EventReporter报告处理过的事件并通过InfluxDB将信息保存到数据库中,供各相关系统查询。 | ||
5 | +## 二、具体实现 | ||
6 | +### 1.spring事件机制 | ||
7 | +#### Spring事件体系包括一下组件: | ||
8 | +- 事件:ApplicationEvent | ||
9 | +- 事件监听器:ApplicationListener,对监听到的事件进行处理,具体的监听器要该接口onApplicationEvent方法。 | ||
10 | +- 事件广播器:ApplicationEventMulticaster,有保存所有事件监听器的监听器注册表,负责将Springpublish的事件广播给所有的监听器。 | ||
11 | +- 事件发布者:ApplicationEventPublisher,spring提供了默认实现AbstractApplicationContext | ||
12 | +#### 初始化: | ||
13 | +在容器启动的时候,AbstractApplicationContext会首先找有没有用户配置的事件广播器ApplicationEventMulticaster,如果有则加载进来,没有则加载默认的事件广播器SimpleApplicationEventMulticaster。然后spring会通过反射机制将所有实现了事件监听器接口ApplicationListener的bean注册到事件广播器的监听器注册表中。 | ||
14 | +#### 事件发布和处理: | ||
15 | +只要是实现了ApplicationEventPublisherAware接口的bean,spring会将事件发布者实际就是ApplicationContext设置到该bean中。 | ||
16 | +要发布事件就调用ApplicationEventPublisher的publishEvent方法,在该方法中spring会委托事件广播器发布事件。 | ||
17 | +事件广播器会遍历注册的每个监听器,并启动来调用每个监听器的onApplicationEvent方法进行事件的处理。 | ||
18 | +由于默认事件广播器SimpleApplicationEventMulticaster的taskExecutor的实现类是SyncTaskExecutor,因此,事件监听器对事件的处理,是同步进行的。要等所有监听器处理完事件才能返回。如果想用异步的,可以自己实现ApplicationEventMulticaster接口,并在Spring容器中注册id为 ##applicationEventMulticaster## 的Bean。 | ||
19 | +Spring发布一个事件之后,所有注册的事件监听器,都会收到该事件,因此,事件监听器在处理事件时,需要先判断该事件是否是自己关心的。 | ||
20 | +### 2.yohobuy的实现 | ||
21 | +- 定义CommonEvent,扩展自ApplicationEvent增加了name属性,在com.yoho.error.event包中。 | ||
22 | +- 定义了各个具体事件(DatabaseAccessEvent、GatewayAccessEvent、ServiceCallEvent等)都继承自CommonEvent。 | ||
23 | +- 定义抽象类AbstractEventHandler并实现ApplicationListener接口的onApplicationEvent方法进行各事件的公共处理。 | ||
24 | +- 针对各个事件定义对应的事件监听器(DatabaseAccessEventHandler、GatewayAccessEventHandler等)都继承自AbstractEventHandler。 | ||
25 | +- 各个需要发布事件的bean实现ApplicationEventPublisherAware接口,调用ApplicationEventPublisher.publishEvent()发布事件。 | ||
26 | +- 由于是异步的,所以要实现ApplicationEventMulticaster接口,故在spring-core-alarm.xml中定义了如下bean,id必须是##applicationEventMulticaster##: | ||
27 | +```xml | ||
28 | + <!--支持异步的事件--> | ||
29 | + <bean id="applicationEventMulticaster" | ||
30 | + class="org.springframework.context.event.SimpleApplicationEventMulticaster"> | ||
31 | + <property name="taskExecutor"> | ||
32 | + <bean class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor"/> | ||
33 | + </property> | ||
34 | + </bean> | ||
35 | +``` | ||
36 | +- 各监听器中在xml都设置了eventReporter属性,示例如下: | ||
37 | +```xml | ||
38 | + <bean id="databaseAccessEventHandler" class="com.yoho.core.common.alarm.event.DatabaseAccessEventHandler"> | ||
39 | + <property name="eventReporter" ref="eventReporter"/> | ||
40 | + <property name="tag_context" value="${web.context:default}"/> | ||
41 | + </bean> | ||
42 | +``` | ||
43 | +- eventReporter定义如下: | ||
44 | +```xml | ||
45 | + <bean id="eventReporter" class="com.yoho.core.common.alarm.InfluxDataReporter" init-method="init"> | ||
46 | + <property name="dbName" value="yoho-monitor"/> | ||
47 | + <property name="dbUrl" value="${alarm.influxdb.url:http://influxdb.yohoops.org:8086}"/> | ||
48 | + <property name="user" value="${alarm.influxdb.user:root}"/> | ||
49 | + <property name="password" value="${alarm.influxdb.password:root}"/> | ||
50 | + <property name="enable" value="${alarm.influxdb.enable:true}"/> | ||
51 | + </bean> | ||
52 | +``` | ||
53 | +- InfluxDataReporter实现了EventReporter自定义接口,在init初始化方法中创建了InfluxDB链接并设置了一些参数。 | ||
54 | +- 实现report方法,进行具体的InfluxDB写入。 |
-
Please register or login to post a comment