MpushClient架构设计
1. 架构图

2. 说明
MpushClient主要是为Android客户端设计,作为Android底层通信组件MpushClient实现了所有Mpush的协议,也包加密,压缩等特性MpushClient对SDK只暴露了3个对象:Client、ClientConfig、ClientListenerClientConfig提供了所有支持对配置设置项,所有的配置都必须使用此对象设置Client主要暴露一些往服务端上行的方法,常用的有:public interface MPushProtocol { boolean healthCheck();//健康检查,读写超时检查,发送心跳 void fastConnect();//快速重连 void handshake();//握手交互密钥 void bindUser(String userId);//绑定用户到链接 void unbindUser();//解绑 Future<HttpResponse> sendHttp(HttpRequest request);//发送HTTP代理亲求 }
所有服务端下行的消息都直接转交给
ClientListener来处理:public interface ClientListener { void onConnected(Client client); void onDisConnected(Client client); void onHandshakeOk(Client client, int heartbeat); void onReceivePush(Client client, byte[] content); void onKickUser(String deviceId, String userId); }
定时发送心跳部分的定时功能,
MpushClient没有去实现,因为Android有比Timer更好的实现AlarmManager, 所以定时功能由SDK收到onHandshakeOk事件时去触发。内部组件主要有:
Connection、PacketReader、PacketWriter、PacketDispatcher、MessageHandler、ExecutorManager、AllotClient等Connection负责TCP链接创建、维护、关闭、重连及校验读写超时时间等AllotClient负责从AllotServer获取最新的MpushServer IP地址列表PacketReader负责数据包的解码及沾包、半包的处理,独占一个线程负责消息的读取。PacketWriter负责数据发送数据内部维护一个只有一个线程的线程池,如果发送失败,会尝试重发直到超时。PacketReader、PacketWriter内部还分别维护了一个ByteBuf使用的是堆外内存(allocateDirect)该buffer只分配一次后续一直重复使用,避免反复的分配内存和垃圾回收,这点对于客户端还是非常有意义的。PacketDispatcher负责根据Packet的Command把包分发到相应的MessageHander。MessageHandler主要负责把Packet反序列化为业务Message包括解码和解压,并处理相应的业务逻辑,比如触发下一步的请求,或通知Listener。ExecutorManager负责整个客户端的线程、线程池的分配和销毁。