# event-bus **Repository Path**: xiaoquanidea/event-bus ## Basic Information - **Project Name**: event-bus - **Description**: 事件总线 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2019-12-20 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Event-Bus(事件总线) ## 一、介绍 为了简化后端服务之间的消息通讯,降低消息中间件的使用难度,对Spring Cloud Stream进行轻量级简化封装,借助其对RabbitMQ、Kafka消息中间件的支持,采用消息中间件对事件进行发布和监听,Event Bus 默认基于SpringBoot 2.1.6.RELEASE,基于SpringCloud Greenwich.SR2,可以在安装项目之前进行版本调整,也可以在引入启动器时在项目中管理SpringBoot、SpringCloud版本。 ## 二、软件架构 ![](doc/images/eventbus2.png) ![](doc/images/eventbus3.png) ![](doc/images/eventbus1.png) 完整流程: ​ 发送端(endpoint)构造事件event,将其publish到context上下文中(spring cloud bus有一个父上下文,bootstrap),将事件发送到channel中(json串message),接收端从channel中获取到message,将message转为事件event,然后将event事件publish到context上下文中,最后接收端(Listener)收到event,调用服务进行处理。整个流程中,只有发送/接收端从context上下文中取事件和发送事件是需要我们在代码中明确写出来的,其它部分都由框架封装完成。 缺点: (1)与spring 耦合度太高,所有东西都需要通过上下文进行传输,不能与非spring项目整合,移植性性太差。 (2)事件定义太过复杂,而且事件与消息体耦合度太高,也就意味着我一个接口就需要定义一个事件,代码维护性太差,不适合大量事件场景。 总结:没有找到合适的事件总线集成消息队列的框架,大部分都是基于内存来进行消息交互,这部分几乎可以不用考虑,改造成本太大,考虑到自行研发成本太高,带来的效益也不太明显,最终决定先借鉴spring cloud stream进行重新开发。 ## 三、安装教程 1. 安装项目到公司私服 2. 引入启动器(默认使用RabbitMQ) ```xml com.xiao.framework.boot spring-boot-starter-event-bus 1.0.0-SNAPSHOT ``` ​ 不使用RabbitMQ,使用Kafka ```xml com.xiao.framework.boot spring-boot-starter-event-bus 1.0.0-SNAPSHOT org.springframework.cloud spring-cloud-starter-stream-rabbit org.springframework.cloud spring-cloud-starter-stream-kafka ``` 3. 在application.yml中进行配置 simple.event.bus ```yaml spring: application: name: consumer rabbitmq: host: www.xiaoquan.work port: 5672 username: xxx password: xxx simple: event: bus: enable: true banner: true client-name: ${spring.application.name} group: test_group ``` 4. 在启动类上引入注解@EnableEventBus(packages = "com.xiao.framework") packages指定的是项目中事件类所在包的全路径,或者通过指定basePackageClasses事件类的class对象,会对该类所在的包及其子包进行扫描 ## 四、使用说明 1. 使用案例 https://gitee.com/xiaoquanidea/event-bus/tree/master/samples 2. 新建事件类继承至SimpleEvent(**Simple必须有空参构造用于远程消息转换**) Product服务发布事件 ```java //注入SimpleEventPublisher EventOne eventOne = new EventOne(data); EventOneCallback eventOneCallback = new EventOneCallback(); eventOneCallback.setDescription("eventOne的回调"); eventOne.setCallbackEvent(eventOneCallback); publisher.publish("consumer","test_group",eventOne); ``` Consumer监听事件 ```java @Component public class EventOneListener extends SimpleEventListener { @Override public void onSimpleEvent(EventOne simpleEvent) { System.out.println("consumer监听到了!"+simpleEvent.toString()); } } ``` ## 五、参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request