# 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版本。
## 二、软件架构



完整流程:
发送端(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