spring cloud 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,启动起来试一试

访问一波
在这里插入图片描述
客户端 -》控制台打印的信息
在这里插入图片描述
成功收到消息

一个简单的消息总线定义就完成了,后面自己扩展吧

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值