2021SC@SDUSC
概述
Netty、Apache Mina 和其他类似高性能网络解决方案的便捷高效替代方案。用于 AsyncTcpSocket 和 AsyncUdpSocket 的 Eventloop 和 Java NIO 适配器之上的一个小抽象层
特点
- 支持 Promises 进行读写操作
- 与 CSP ChannelSupplier 和 ChannelConsumer 的兼容性 AsyncTcpSocket 可以用作具有内置背压传播的 CSP 通道,并且可以插入到 CSP/Datastream 管道及其所有功能(如缓冲、压缩、序列化/反序列化、数据转换、数据过滤、减少等)
- 广泛优化,几乎没有性能开销,广泛使用ByteBufPool
什么是Asynchronous sockets?
具有 TLS 支持的完全异步 TCP 套接字。允许向/从网络发送/接收数据。可用作创建自定义 TCP 服务器/客户端或实现自定义网络协议的构建块。 Socket 有一个非常简单和直观的 API,它由读/写方法组成。 CSP 模块可用于将套接字包装到 ChannelSupplier 或 ChannelConsumer 还有一个用于 UDP 通信的异步 UDP 套接字。
源代码如下图所示:
我们将主要展开对AbstractSever类的讨论。
AbstractServer 类作为构建事件循环感知 TCP 服务器(HTTP 服务器、RPC 服务器、TCP 文件服务等)的基础,它具有以下特点:
- 支持开始/停止语义
- 实现了 EventloopServer
- 实现了 WorkerServer 接口,所以 AbstractServer 的所有子类都可以很容易地用作工作服务器
- 支持 ServerSocketSettings 和 SocketSettings
即用型 PrimaryServer 实现,在主 Eventloops 中作为平衡器工作。它接受外部“接受”请求并将它们重新分配给 WorkerServers,然后在其相应的工作 Eventloop 线程中执行实际的“接受”请求。
它是一个在事件循环之上工作的非阻塞服务器。因此,它在 eventloop 线程中运行,并且所有事件都在该线程上触发。这只是 eventloop 调用的高级包装。
因为该类主要是对EventloopServer的实现,且其中并没有新增的方法,所以我们去查看EventloopServer接口的定义。
EventloopSever表示非阻塞服务器,它侦听新连接并异步接受它们。它在事件循环线程中操作事件循环,并使用与 Java NIO 的事件循环集成。
其代码部分如下:
public interface EventloopServer {
Eventloop getEventloop();
void listen() throws IOException;
Promise<?> close();
}
可以看到,EventloopServer接口里面一共只有三个方法。
它们的作用分别为:
-
getEventloop():获取Eveneloop;
- listen():告诉此服务器开始侦听其侦听地址。如果无法创建套接字,则抛出异常IOException;
-
close():关闭服务器。(任何开放的渠道都将关闭)
此外,除了EventloopSever接口外,还有WorkerSever接口。这是一个可以在 PrimaryServer 中使用的服务器接口。 它应该是基于事件循环的并且应该能够接受和管理客户端连接。
代码部分如下:
public interface WorkerServer {
Eventloop getEventloop();
void doAccept(SocketChannel socketChannel, InetSocketAddress localAddress, InetSocketAddress remoteAddress,
boolean ssl, SocketSettings socketSettings);
}
最后,看一下net中的两个类,PrimarySever和SimpleSever
PrimarySever:
它是一个简单的平衡器服务器,它将其连接分派到其 WorkerServer。
当传入连接发生时,它使用循环算法将请求转发给其中之一。
SimpleSever:这是 AbstractServer类 的基本实现,它只是将每个客户端连接(AsyncTcpSocket acync)分派给给定的消费者。