EventMesh源码解析系列之tcp的pub/sub

本文详细介绍了EventMesh SDK Java中如何通过TCP协议实现pub和sub功能,包括客户端与Runtime的连接、消息发布与订阅、心跳包和断连机制。通过实例代码展示了如何使用SimplePubClient和SimpleSubClient进行消息的发送与接收操作。

pub和sub的实现-tcp

Eventmesh-sdk-java作为客户端,与eventmesh-runtime通信,用于完成消息的发送和接收。

那么pub和sub作为客户端,在eventmesh中是怎么实现的?

结构

我们首先看到sdk-java中tcp这一部分的结构:common部分定义了tcp协议下广播消息、异步消息都会用到的公共方法,impl是对tcp的pub和sub的真正实现。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Lh9gNtDL-1633765330465)(../../images/blog/structure.png)]

下面来具体介绍一下三个实现类的功能,下面是对应的类图:

  • DefaultEventMeshClient:实现了EventMeshClient接口,用来定义一个具备pub和sub功能的客户端。
  • SimplePubClientImpl:实现了SimplePubClient接口,同时还继承了TcpClient ,用来定义一个具备pub功能的客户端。
  • SimpleSubClientImpl:实现了SimpleSubClient接口,同时也继承了TcpClient ,用来定义一个具备sub功能的客户端。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HvqpnLMh-1633765330467)(../../images/blog/Impl-class-diagram.png)]

代码

  • 对于client的实现,首先是要和runtime进行连接,也就是和服务器进行连接,连接的过程是:client发送心跳包给server,server对心跳包进行回应,然后client发送连接请求,接收到server的回应之后,客户端和服务器连接成功。在EventMeshClient接口中,它是这样定义连接的:
void init() throws Exception;
void heartbeat() throws Exception;
  • 在DefaultEventMeshClient中具体的实现如下:
public void init() throws Exception {
   
   
        this.subClient.init();
        this.pubClient.init();
}
public void heartbeat() throws Exception {
   
   
        this.pubClient.heartbeat();
        this.subClient.heartbeat();
}
  • 也就是说,一个客户端和服务器的连接被分成了两个部分,一个是pub客户端的连接,一个是sub客户端的连接。那我们具体来看到两个客户端的实现,因为两个客户端实现有点类似,所以我们这里以SimpleSubClientImpl为例进行说明:

    client和server的握手过程

    HELLO_REQUEST(2), //client发给server的握手请求
    HELLO_RESPONSE(3), //server回复client的握手请求

//SimpleSubClientImpl
public void init() throws Exception {
   
   
        //指向server的启动入口
        open(new Handler());
    	//设置了hello的header和body部分,client和server进行握手
        hello();
        logger.info("SimpleSubClientImpl|{}|started!", clientNo);
}

client和server的发送心跳包过程

HEARTBEAT_REQUEST(0), //client发给server的心跳包

HEARTBEAT_RESPONSE(1), //server回复client的心跳包

//SimpleSubClientImpl
public void heartbeat() throws Exception {
   
   
    task = scheduler.scheduleAtFixedRate(new Runnable() {
   
   
        @Override
        public void run() {
   
   
            try {
   
   
                //如果不是处于活跃状态,就重新连接
                if (!isActive()) {
   
   
                    SimpleSubClientImpl.this.reconnect();
                }
                //client向server发送心跳包
                Package msg = MessageUtils.heartBeat();
                SimpleSubClientImpl.this.io(msg, EventMeshCommon.DEFAULT_TIME_OUT_MILLS);
            } catch (Exception ignore) {
   
   
            }
        }
    }, 
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值