内容简介:经过几个星期的苦战,终于迎来了第一个完整版,支持http,udp,websocket。 将一开始的规划都补齐了,后面将持续迭代。 本次的更新点如下 一、内部实现原理做了修改 一开始用的AIO来实现异步,后来因为回调太多,...
经过几个星期的苦战,终于迎来了第一个完整版,支持http,udp,websocket。 将一开始的规划都补齐了,后面将持续迭代。
本次的更新点如下
一、内部实现原理做了修改
一开始用的AIO来实现异步,后来因为回调太多,编程复杂度比较高,而且不好控制线程数量,所以给换掉了,换成了NIO。
NIO 比较流行的一个做法是使用Selector,它类似于一个队列,请求来了都会注册进去,然后由一个线程去遍历消费这些请求。 这就带来了一个问题,当请求数量多了以后,无法最大化的利用cpu的多核算力, 而且在消费的过程中如果遇到了 比较耗时的任务,将会堵死整个循环。
所以,我没有采用Selector,而是直接用的accept,在一个while里 调用accept,当有请求来了以后,accept会返回一个channel,这个channel会被丢到一个队列里。
可以看下面这张图
当服务启动的时候,会先初始化几个线程出来,具体初始几个可以自己配置,每个线程都会监控一个队列。
当队列里进来了任务,线程就会开始干活,依次消费自己管辖的这个队列里的任务。
整体模型大概是这样的
当客户端发起一个请求到服务端,服务端就会以轮询的方式给其中一个线程的队列添加一个任务,然后继续监控accept。
线程发现队列不为空,就会消费自己管辖的队列,去调用后面的业务逻辑。
这么做的好处
- 线程数量是可控的,不会出现请求多了以后 导致线程数过多 而对资源造成极大的压力
- 他是异步的,请求来了直接丢队列里即可,不用等在这消耗时间,而是直接去接收下一个请求。
- 请求分配给线程 是用的轮询算法,可以保证每个线程的压力均匀。
二、支持websocket了(现在还不是很成熟,连接如果很多,慎用)
创建handler
/**
* WebSocket
*/
public class DemoSocketHandler implements WebSocketHandler {
/**
* 有连接进来时调用
*/
@Override
public void onOpen(WebSocketSession webSocketSession) {
System.out.println("连接了websocket");
}
/**
* 连接断开时调用
*/
@Override
public void onClose(WebSocketSession webSocketSession) {
System.out.println("关闭了websocket");
}
/**
* 有消息进来时调用
*/
@Override
public void onMessage(String message, WebSocketSession webSocketSession) {
System.out.println("收到了消息"+message);
try{
webSocketSession.send("我收到了");
} catch (Exception e){
e.printStackTrace();
}
}
}
在创建http服务的时候,把handler添加进去
Magician.createHttpServer()
.threadSize(5)
.httpHandler("/", new DemoRequestHandler())
// 注意这句
.webSocketHandler("/websocket", new DemoSocketHandler())
.bind(8080, 1000).start();
三、支持UDP了
创建handler
public class DemoUDPHandler implements MagicianUDPHandler {
@Override
public void receive(ByteArrayOutputStream byteArrayOutputStream) {
}
}
创建UDP服务
Magician.createUdpServer()
.bind(8088)
.handler(new DemoUDPHandler())
.start();
更多信息,可以访问官网
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- cURL 7.70.0 发布,原生支持 JSON、实验性支持 MQTT
- hi-nginx-1.5.2 发布,优化 cpp 支持,添加 groovy 支持
- hi-nginx-1.5.2 发布,优化 cpp 支持,添加 groovy 支持
- Spring Tools 4.3.0 发布,支持 Eclipse Theia 并弃用 Atom 支持
- Spring Tools 4.3.0 发布,支持 Eclipse Theia 并弃用 Atom 支持
- Tiki 20 发布,支持 markdown 语法
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。