欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-03-04 15:41:23
...

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

早在五六年前初识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。

相关标签: java aio nio2