虽然Java官方有loom项目来实现协程,但是实在等不住了。既然fanx支持async/await,所以就尝试和异步IO结合,来实现高性能网络框架。
代码见这里:fanx-dev/fanxServer。
架构类似于netty的reactor模式,像这样:
示例代码:
class TestServer : Handler {
override async Void onService(Socket socket) {
buf := NioBuf.makeMem(1024)
n := await socket.read(buf, 1)
buf.flip()
echo("=====server receive: $buf: "+buf.readAllStr)
buf.clear
buf.printLine("HelloWorld")
buf.flip
n2 := await socket.write(buf)
echo("=====send: "+n2)
}
static Void main() {
Server {
port = 8080
handler = TestServer#
}.start
}
}
代码中,当运行到await的时候当前任务暂停,并交给selector线程去监听IO事件,当前线程没有阻塞而是去继续处理其他连接任务。当selector发现事件就绪后通知恢复运行任务。由于采用线程池机制await前后可能运行在不同的线程中。
是不是代码看起来比netty的回调好多了。
支持基本的Http协议:
class HttpTestServer : HttpHandler {
override async Void onHttpService(HttpReq req, HttpRes res) {
echo("Server receive: "+req.headers)
res.headers["Content-Type"] = "text/html; charset=utf-8"
buf := NioBuf.makeMem(1024)
buf.printLine("<html>
<body>Hello World</body>
</html>")
buf.flip
//await res.writeFixed(buf)
await res.writeChunk(buf)
}
static Void main() {
Server {
port = 8080
handler = HttpTestServer#
}.start
}
}
性能方面没有测试,估计肯定比阻塞IO好。
Java基于协程的IO框架还可以使用kilim,本项目也参考了kilim的代码。
有疑问加站长微信联系(非本文作者)