Caviar:一个基于Netty的通信框架

2018-01-03  本文已影响330人  益文的圈

自己基于Netty实现了一个通信框架,给它起名叫Caviar(https://github.com/mailzyw/caviar)。下面给出框架介绍。

一、功能设计

提供了两个通信相关的接口Client和Server

1、网络客户端Client

Client接口提供建连、登录、登出、发送请求消息(同步)、发送请求消息(异步回调)、接收服务端请求消息等功能。

public interface Client {

    /**
     * 连接服务端
     * @param host host
     * @param port port
     */
    void connect(String host, int port) throws CaviarNetworkException;

    /**
     * 关闭客户端
     * @throws IOException
     */
    void close() throws IOException;

    /**
     * 重连服务端
     */
    void reconnect();

    /**
     * 设置客户端运行状态
     * @param running running
     */
    void setRunningState(boolean running);

    /**
     * 客户端登录
     * @param loginMsg loginMsg
     * @return 登录响应
     */
    byte[] login(byte[] loginMsg) throws CaviarNetworkException;

    /**
     * 客户端登出
     * @param logoutMsg logoutMsg
     * @return
     */
    byte[] logout(byte[] logoutMsg) throws CaviarNetworkException;

    /**
     * 发送消息——同步
     * @param msg msg
     * @throws CaviarNetworkException
     */
    byte[] sendMsgSync(byte[] msg) throws CaviarNetworkException;

    /**
     * 发送消息——异步
     * @param msg msg
     * @throws CaviarNetworkException
     */
    void sendMsgAsync(byte[] msg, CaviarMsgCallback caviarMsgCallback);
}

CaviarServer为Client接口的实现类,提供CaviarServer(long timeout, CaviarServerBizListener caviarBizListener)构造方法。

2、网络服务端Server

Server接口提供bind方法和close方法。bind方法用于绑定对应服务端口并开始监听客户端连接请求,close方法为服务端关闭操作。

public interface Server {

    /**
     * 启动操作
     * @param port 监听端口
     */
    void bind(int port) throws CaviarNetworkException;

    /**
     * 关闭操作
     * @throws IOException
     */
    void close() throws IOException;
}

CaviarServer为Server接口的实现类,提供CaviarServer(long timeout, CaviarServerBizListener caviarBizListener)构造方法。

3、请求消息处理器CaviarServerBizListener/CaviarServerBizListener

服务端和客户端的请求消息处理器,定义了处理请求消息的方法。
使用者通过实现这两个接口完成对消息处理的具体业务逻辑。

public interface CaviarServerBizListener {

    /**
     * 处理客户端登录请求
     */
    void processClientLogin(RequestContext requestContext, SessionContext sessionContext, byte[] msg);

    /**
     * 处理客户端登出请求
     */
    void processClientLogout(RequestContext requestContext, SessionContext sessionContext, byte[] msg);

    /**
     * 处理客户端请求消息
     */
    void processClientMsg(RequestContext requestContext, SessionContext sessionContext, byte[] msg);

}
public interface CaviarClientBizListener {

    /**
     * 处理服务端请求消息
     */
    void processServerMsg(RequestContext requestContext, SessionContext sessionContext, byte[] msg);

}

4、连接上下文SessionContext

用于标识一个网络连接(客户端与服务端),内部维护了网络连接信息Channel,并提供了向当前连接发送请求/响应消息等接口功能。使用者使用该接口完成请求消息的发送和响应。
NettySessionContext为SessionContext的具体实现。

5、请求上下文RequestContext

用于标识一次请求,内部维护了请求唯一标识、请求消息、响应消息、响应异步回调接收器等信息。在进行请求应答时会用到,使用者一般不需要直接操作。

二、协议设计

1、消息协议

    Long        address         消息发送端IP转换为的Long
    Integer     crcCode         版本号
    Integer     msgType         消息类型
    Integer     codeType        消息体序列化方式(0:json,1:xml)
    Integer     length          消息体长度
    byte[]      body            消息体

2、消息类型

    |-请求消息
        |-CLIENT_LOGIN_REQ(1001),                 //客户端登录
        |-CLIENT_LOGOUT_REQ(1002),                //客户端登出
        |-CLIENT_MSG_SEND_REQ(1003),              //客户端请求——同步
        |-CLIENT_MSG_SEND_ASYNC_REQ(1004),        //客户端请求——异步回调
        |-SERVER_MSG_SEND_REQ(1013),              //服务端请求——同步
        |-SERVER_MSG_SEND_ASYNC_REQ(1014),        //服务端请求——异步回调
    |-响应消息
        |-CLIENT_LOGIN_RESP(2001),                //客户端登录
        |-CLIENT_LOGOUT_RESP(2002),               //客户端登出
        |-CLIENT_MSG_SEND_RESP(2003),             //客户端请求
    |-心跳消息
        |-PING(9001),                             //客户端Ping
        |-PONG(9002),                             //服务端Pong

三、可靠性设计

1、客户端连接/请求超时功能:

2、客户端断连重连:

3、心跳检测:

4、客户端重复登录保护:

5、消息缓存重发

四、性能设计

1、IO模型

Caviar框架底层基于Netty实现,继承了Netty提供的非阻塞IO模型

2、线程模型

Caviar框架底层基于Netty实现,基础了Netty的Reactor线程模型

3、序列化框架

4、同步/异步请求线程模型

同步请求线程模型 异步请求线程模型

五、使用示例

caviar框架源码中的demo包中提供了一个简单的使用示例。

上一篇 下一篇

猜你喜欢

热点阅读