Magician 1.1.5 发布,支持 UDP,WebSocket

栏目: 软件资讯 · 发布时间: 3年前

内容简介:经过几个星期的苦战,终于迎来了第一个完整版,支持http,udp,websocket。 将一开始的规划都补齐了,后面将持续迭代。 本次的更新点如下 一、内部实现原理做了修改 一开始用的AIO来实现异步,后来因为回调太多,...

经过几个星期的苦战,终于迎来了第一个完整版,支持http,udp,websocket。 将一开始的规划都补齐了,后面将持续迭代。

本次的更新点如下

一、内部实现原理做了修改

一开始用的AIO来实现异步,后来因为回调太多,编程复杂度比较高,而且不好控制线程数量,所以给换掉了,换成了NIO。

NIO 比较流行的一个做法是使用Selector,它类似于一个队列,请求来了都会注册进去,然后由一个线程去遍历消费这些请求。 这就带来了一个问题,当请求数量多了以后,无法最大化的利用cpu的多核算力, 而且在消费的过程中如果遇到了 比较耗时的任务,将会堵死整个循环。

所以,我没有采用Selector,而是直接用的accept,在一个while里 调用accept,当有请求来了以后,accept会返回一个channel,这个channel会被丢到一个队列里。

可以看下面这张图

当服务启动的时候,会先初始化几个线程出来,具体初始几个可以自己配置,每个线程都会监控一个队列。

Magician 1.1.5 发布,支持 UDP,WebSocketMagician 1.1.5 发布,支持 UDP,WebSocketMagician 1.1.5 发布,支持 UDP,WebSocket

当队列里进来了任务,线程就会开始干活,依次消费自己管辖的这个队列里的任务。

整体模型大概是这样的

Magician 1.1.5 发布,支持 UDP,WebSocket

当客户端发起一个请求到服务端,服务端就会以轮询的方式给其中一个线程的队列添加一个任务,然后继续监控accept。

线程发现队列不为空,就会消费自己管辖的队列,去调用后面的业务逻辑。

这么做的好处

  1. 线程数量是可控的,不会出现请求多了以后 导致线程数过多 而对资源造成极大的压力
  2. 他是异步的,请求来了直接丢队列里即可,不用等在这消耗时间,而是直接去接收下一个请求。
  3. 请求分配给线程 是用的轮询算法,可以保证每个线程的压力均匀。

二、支持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();

更多信息,可以访问官网

http://magician-io.com/


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

千夫所指

千夫所指

乔恩·罗森 / 王岑卉 / 九州出版社 / 2016-10-1 / CNY 42.80

编辑推荐: 《乌合之众》是为了跪舔权贵?《普通心理学》实验存在重大漏洞?《引爆点》的理论都是瞎掰的?社交网络时代《1984》预言的“老大哥”是否已经变成事实? 《纽约时报》年度十佳书 《GQ》杂志年度十佳书 《卫报》年度十佳书 《泰晤士报》年度十佳书 《经济学人》年度重推! 黑天鹅年度重点图书! 《乌合之众》是为了迎合权贵?《普通心理学》实验存在重大......一起来看看 《千夫所指》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器