自研、高可用:国产通信框架的未来
首先,请大家阅读之前切莫误会本文是个标题党。自研已成实事,高可用正经历着实战检验,至于能否在未来打下一片天地,是作者对它的一份美好愿景。
早在五六年前初识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。
上一篇: File类与IO流
推荐阅读