Netty-WebSocket长连接推送服务

Netty-WebSocket长连接推送服务 


November 25, 2015


推送服务 推送服务

几种消息推送技术比较
AJAX轮询 轮询:缺点,糟糕的用户体验;对服务器压力很大,并造成带宽的极大浪费。
Comet:长连接机制,同样由浏览器端主动发起,但Server端以一种很慢的方式给出回应,优点是实时性好,缺点,长时间占用链接,丧失了无状态高并发的缺 点
Flash XML Socket,需客户端安装java虚拟机,Chrome浏览器新版本已经默认屏蔽Flash
DWR开源框架,将java代码转为js文件,引入js文件路径不能更改,原理也是轮询,
WebSocket,HTML5定义,不支持html5的可以使用socket.io,高效节能,简单易用,配合netty可以达到百万级的链接推送。
NIO,java1.4版本,非阻塞IO

netty,基于原生NIO实现的高并发框架,配合websocket实现消息推送,netty会单独开一个websocket端口处理请求,并不会占用中间件的连接数,而且一 个线程可以处理几万个链接 


NIO是什么 


NIO 是New IO 的简称,在jdk1.4 里提供的新api 。Sun 官方标榜的特性如下:
为所有的原始类型提供 为所有的原始类型提供(Buffer)缓存支持 缓存支持。字符集编码解码解决方案。
Channel :一个新的原始I/O 抽象。 支持锁和内存映射文件的文件访问接口。 提供多路(non-bloking) 非阻塞式的高伸缩性网络I/O 。
Channel 通道、Buffer 缓冲区、Selector 选择器
其中Channel对应以前的流 对应以前的流,Buffer不是什么新东西,Selector是因为nio可以使用异步的非堵塞模式才加入的东西。以前的流总是堵塞的,一个线程只要 对它进行操作,其它操作就会被堵塞,也就相当于水管没有阀门,你伸手接水的时候,不管水到了没有,你就都只能耗在接水(流)上。nio的Channel的加 入,相当于增加了水龙头(有阀门),虽然一个时刻也只能接一个水管的水,但依赖轮换策略,在水量不大的时候,各个水管里流出来的水,都可以得到妥善接 纳,这个关键之处就是增加了一个接水工,也就是Selector,他负责协调,也就是看哪根水管有水了的话,在当前水管的水接到一定程度的时候,就切换一 下:临时关上当前水龙头,试着打开另一个水龙头(看看有没有水)。当其他人需要用水的时候,不是直接去接水,而是事前提了一个水桶给接水工,这个水桶 就是Buffer。也就是,其他人虽然也可能要等,但不会在现场等,而是回家等,可以做其它事去,水接满了,接水工会通知他们 
Java NIO 实现百万连接( 这 段 代 码 只 会 接 受 连 过 来 的 连 接 , 不 做 任 何 操 作 ) 


ServerSocketChannel ssc = ServerSocketChannel.open();
Selector sel = Selector.open(); 
ssc.configureBlocking(false);
ssc.socket().bind(new InetSocketAddress(8080));
SelectionKey key = ssc.register(sel, SelectionKey.OP_ACCEPT); 
while(true) {
    sel.select();
    Iterator it = sel.selectedKeys().iterator();
    while(it.hasNext()) {
        SelectionKey skey = (SelectionKey)it.next();
        it.remove();
        if(skey.isAcceptable()) {
            ch = ssc.accept();
        }
    }
}

 Netty是什么


Netty: http://netty.io/ Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients 


官方解释已经够清楚的了,其中最吸引人的就是高性能 高性能了。
 1,普通的服务器10000个连接需要10000个线程,服务器可能就直接卡住了,但对于netty服务器可能几个线程就够了
2,netty是一套在 是一套在java NIO的基础上封装的便于用户开发网络应用程序的 的基础上封装的便于用户开发网络应用程序的api. 应用场景很多,诸如阿里的消息队列(RocketMQ),分布式rpc(Dubbo)通 信层都使用到了netty(dubbo可以用服务发现自由选择通信层)
3,netty是非阻塞事件驱动框架 是非阻塞事件驱动框架, 并结合线程组(group)的概念,可以很好的支持高并发,慢连接的场景
4,编程接口非常容易,并且也较好的解决了TCP粘包/拆包的问题.netty提供了自己的ByteBuf和channel,相比于jdk的ByteBuffer和channel来说更简便灵 活操作, 并提供了pipeline的概念,并针对每个contextHandler都可以由用户定义, 方便直接.
5,有一些web框架已经开始直接使用netty做为底层通信服务,诸如play. 这样play就不用依赖于容器去进行部署,在没有nginx做反向代理的情况下也能支持 高并发.编解码器可以随意扩展,今天是个web,明天就可以是一个ftp或email服务器,个人觉得比较灵活。
6,相对于Tomcat这种Web Server(顾名思义主要是提供Web协议相关的服务的),Netty是一个 是一个Network Server,是处于Web Server更下层的网络框 架,也就是说你可以使用Netty模仿Tomcat做一个提供HTTP服务的Web容器。简而言之,Netty通过使用NIO的很多新特性,对TCP/UDP编程进行了简化和封 装,提供了更容易使用的网络编程接口,让你可以根据自己的需要封装独特的HTTP Server活着FTP Server等.
Netty更多的链接 更多的链接
非阻塞IO
其实无论是用Java NIO 还是用Netty,达到百万链接都没有任何难度,因为他们都是非阻塞的IO,不需要为每个链接创建一个线程了。
预知详情,可以搜索一下BIO,NIO,AIO的相关知识。

Netty 实现百万连接( 这 段 代 码 只 会 接 受 连 过 来 的 连 接 ) 


NioEventLoopGroup bossGroup =  new NioEventLoopGroup();
NioEventLoopGroup workerGroup= new NioEventLoopGroup();
ServerBootstrap bootstrap = new ServerBootstrap();
bootstrap.group(bossGroup, workerGroup); 
bootstrap.channel( NioServerSocketChannel.class); 
bootstrap.childHandler(new ChannelInitializer<SocketChannel>() {
    @Override protected void initChannel(SocketChannel ch) throws Exception {
        ChannelPipeline pipeline = ch.pipeline();
        //todo: add handler
    }});
bootstrap.bind(8080).sync(); 


WebSocket是什么


WebSocket是HTML5出的东西(协议),也就是
  • 4
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值