springcloud bus + kafka 自定义事件总线
应公司要求,要和其他公司做数据对接,一边要求使用kafka,一边要求WebServicee,啊这。。。那没办法只能学
行了,话不多说,直接上
大家也都知道,客户端服务器怎么回事了,我就不赘叙了
我这边使用的是 本地kafka ,先去下载一个kafka服务器,并且启动起来吧
kafka地址:kafka服务器,这个下载完自带的Zookeeper
先去启动吧,记得在此目录结构下打开cmd
启动zookeeper
bin\windows\zookeeper-server-start.bat config\zookeeper.properties
等 zookeeper启动完成后,再启动kafka,否则可能出错
启动kafka
bin\windows\kafka-server-start.bat config\server.properties
启动完成后
ok,我们创建两个springboot项目吧,假设一方给另一方发消息
当然,创建一个springboot项目,两个启动类也可以
先从服务端开始吧(发消息)
好,先引入依赖吧
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-kafka</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
启动类加入@RemoteApplicationEventScan({“”}),来扫描我们定义的event类
@SpringBootApplication
@RemoteApplicationEventScan({"com.wlh.event"})
public class KafkaServerApplication {
public static void main(String[] args) {
SpringApplication.run(KafkaServerApplication.class, args);
}
}
欧克,定义我们的Event类吧,注意Event类是要两个项目都要有的,并且名字也要一样,否则收不到消息了
假如,我要给对面发消息说,我要添加用户。。定义个SaveEvent得了,这里只做示范
首先@JsonTypeName注解,然后继承RemoteApplicationEvent类
随便整个msg,作为我们的消息内容,然后调一下父类的有参构造
@JsonTypeName
public class SaveEvent extends RemoteApplicationEvent {
private String msg;
public SaveEvent(){
}
public SaveEvent(Object source, String msg, String originService, String destinationService) {
super(source, originService, destinationService);
this.msg = msg;
}
public String getMsg() {
return msg;
}
public SaveEvent setMsg(String msg) {
this.msg = msg;
return this;
}
}
User类
public class User implements Serializable {
private Long id;
private String userName;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public User(Long id, String userName) {
this.id = id;
this.userName = userName;
}
public User() {
}
}
定义一个Service,用来发送事件
用到fastjson将对象转换成Json字符串发送过去
@Service
public class BusService {
@Autowired
private ApplicationEventPublisher publisher;
public Object save() {
User user = new User(1L, "张三");
ApplicationEvent event = new SaveEvent(this, JSON.toJSONString(user),"server","client");
// server : 是自己的(原始地) bus id 名称
// client : 是接收方(目的地) bus id 名称
publisher.publishEvent(event);
return user;
}
}
定义一个Controller,访问时就去调用 发消息的方法
@RestController
public class BusServerController {
@Autowired
private BusService busService;
@GetMapping("/save")
public Object save() {
return busService.save();
}
}
配置文件
server.port=8081
spring.cloud.bus.id=server 定义一个bus id
spring.kafka.bootstrap-servers=127.0.0.1:9092 你的kafka服务器地址
客户端(收消息)
引入依赖
先在启动类配置@RemoteApplicationEventScan({“”}) 扫描event事件,和服务端一样
Event类和User类直接从 服务端 拷贝即可
监听类
监听SaveEvent事件
@Service
public class BusClientListener {
@EventListener
public void receive(SaveEvent event) {
System.out.println("client:save(): " + event.getMsg());
UserBean user = JSON.parseObject(event.getMsg(), UserBean.class);
System.out.println(user);
}
}
配置文件
server.port=8080
spring.cloud.bus.id=client
spring.kafka.bootstrap-servers=127.0.0.1:9092
ok,启动起来试一试
访问一波
客户端 -》控制台打印的信息
成功收到消息
一个简单的消息总线定义就完成了,后面自己扩展吧