自研、高可用:国产通信框架的未来

首先,请大家阅读之前切莫误会本文是个标题党。自研已成实事,高可用正经历着实战检验,至于能否在未来打下一片天地,是作者对它的一份美好愿景。

早在五六年前初识Socket编程,市面上叫的上号的NIO通信框架就只有Mina、Netty,直至2018年了现状依旧。尤其是Netty,在从事通信开发的Javaer群体中,地位无可撼动。不过今后这局面会稍有变化,一款小巧精致的通信框架悄然而生。当然作者本人给予它再多的溢美之词都显得自吹自擂。既然如此我们接下来通过多维度介绍它是一款怎样的框架,至于最终能否引发读者的关注与支持,我们随缘。

代码量

一个项目优质与否并不取决于代码量,但同等功能条件下却可以侧面考验一些编码技巧。这款框架的代码量仅800多行,版本号已至v1.3.11,这是经历了N个版本的结果。源码文件数11个,编译后的jar包26KB,并且麻雀虽小五脏俱全,它包含了服务端、客户端开发的必要功能。这样的代码量足矣体现其学习成本之低,或许不需要提供开发手册,只要几个简单的示例再结合阅读源码便可轻松掌握。

接口设计

这个框架的接口设计是很接地气的,翻遍Java23种设计模型,作者也不知道它应该对应着哪一个,设计接口之时心里就想着两个字:简单。话不多,直接上图:

性能

既然是一款通信框架,它的性能表现也是个非常关键的考核因素。不过这种测试很大程度上考验的是硬件性能,所以在此我们不会给出明确的数值。但是,可以肯定的是这款框架对硬件资源的发挥可以达到99%(CPU与带宽的协调),工程中附带测试代码,认可我们测试方式的可自行验证。

还有两点补充一下,这款框架对于内存和线程的使用也追求精细化,单机验证数万个连接内存消费比较低(不跑业务)。至于线程方面,因为运用了Java AIO技术,框架开设的线程池直接用于业务处理,用户对于IO线程0感知。

实战

下面通过简单的示例演示如何使用这款框架。

1、通过maven引入框架

<dependency>
    <groupId>org.smartboot.socket</groupId>
    <artifactId>aio-core</artifactId>
    <version>1.3.11</version>
</dependency>

2、定义协议编解码

正常情况下服务端与客户端通信共用同一套协议规则,因此我们只需编写一份协议编解码实现即可。如下所示,协议编解码的需要实现接口Protocol。通信消息以整数类型为例:

public class IntegerProtocol implements Protocol<Integer> {

    private static final int INT_LENGTH = 4;

    @Override
    public Integer decode(ByteBuffer data, AioSession<Integer> session, boolean eof) {
        if (data.remaining() < INT_LENGTH)
            return null;
        return data.getInt();
    }

    @Override
    public ByteBuffer encode(Integer s, AioSession<Integer> session) {
        ByteBuffer b = ByteBuffer.allocate(INT_LENGTH);
        b.putInt(s);
        b.flip();
        return b;
    }
}

3、定义消息处理器

服务端

public class IntegerServerProcessor implements MessageProcessor<Integer> {
    @Override
    public void process(AioSession<Integer> session, Integer msg) {
        Integer respMsg = msg + 1;
        System.out.println("接受到客户端数据:" + msg + " ,响应数据:" + (respMsg));
        try {
            session.write(respMsg);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void stateEvent(AioSession<Integer> session, StateMachineEnum stateMachineEnum, Throwable throwable) {

    }
}

客户端

public class IntegerClientProcessor implements MessageProcessor<Integer> {
    private AioSession<Integer> session;

    @Override
    public void process(AioSession<Integer> session, Integer msg) {
        System.out.println("接受到服务端响应数据:" + msg);
    }

    @Override
    public void stateEvent(AioSession<Integer> session, StateMachineEnum stateMachineEnum, Throwable throwable) {
        switch (stateMachineEnum) {
            case NEW_SESSION:
                this.session = session;
                break;
            default:
                System.out.println("other state:" + stateMachineEnum);
        }

    }

    public AioSession<Integer> getSession() {
        return session;
    }
}

4、启动服务

服务端

public class IntegerServer {
    public static void main(String[] args) throws IOException {
        AioQuickServer<Integer> server = new AioQuickServer<Integer>(8888, new IntegerProtocol(), new IntegerServerProcessor());
        server.start();
    }
}

客户端

public class IntegerClient {
    public static void main(String[] args) throws Exception {
        IntegerClientProcessor processor = new IntegerClientProcessor();
        AioQuickClient<Integer> aioQuickClient = new AioQuickClient<Integer>("localhost", 8888, new IntegerProtocol(), processor);
        aioQuickClient.start();
        processor.getSession().write(1);
        Thread.sleep(1000);
        aioQuickClient.shutdown();
    }
}


总结

通过上述示例便完成简单的通信功能开发,各个环节相信无论何种框架都必须具备。尽管这款框架具备的功能,其他框架也肯定有,甚至功能更加丰富。但是在学习成本,开发效率,运行性能等方面,还是自信可以一较高下。并且最最重要的是,这是一款有国人开发的通信框架,开发这套框架不是为了重复造轮子,而是要造一款转的更快、跑的更远、体验更稳的轮子。看到这里,如果您对这款框架该兴趣,请百度:smart-socket。

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页