web推送 搭建百万连接服务 使用netty完成websocke的推送

栏目:体育 2021-09-20 12:58:29
分享到:

使用websocket

介绍

WebSocket协议是一种基于TCP的新型网络协议。他的出现实现了网络和浏览器之间的全双工通信,并允许服务器主动向客户端发送信息。客户端向服务器发送消息是半双工,服务器向客户端发送消息是全双工。

多客户端、多语言、多浏览器支持:浏览器、php、Java、ruby、nginx、python、Tomcat、erlang、。net等等。

websocket的实现

服务器通过websocket协议和内部传输协议与客户端进行通信,除了协议不同之外,与普通socket没有什么不同。

Websocket示例

绑定9001,由浏览器js完成,可以收发消息,生成一个随机数userId。设计此功能时,考虑推送消息时是否需要先登录。登录后,跳转到成功登录,成功后获取用户标识。您可以在建立websocket连接时携带userId,最终知道它是哪个用户。

Java代码示例服务器端

服务器端通道类。绑定完成相关业务逻辑处理,

1.解析http协议编解码器

2.最大解析数据包拦截

3.msg对象是通过自己的业务处理获得的,成为一个请求对象。

测试中心类

服务器处理程序服务

解析处理程序,http解码失败。如果不是升级websocket协议的请求,我们正在开发websocket服务器。对于所有不符合我要求的请求,我们都无法管理。这与开发springmvc有关。需要联系的不是url、http协议底层和请求的头协议。如果不满足,它将返回400。如果是,它将返回到当前处理,我可以接收它。正常开始沟通,握手并返回响应状态码。先处理websocket的握手,再处理websocket的消息。握手意味着你同意和我交往,

上面是通过html的客户端,这里的websocket客户端是用java的netty编写的

对应于客户端的处理程序,先通过http获取消息,然后服务器将消息发送给客户端,由客户端接收。如果是http消息,可能不会被解析。如果是websocket消息,则会打印该消息。客户端接收消息并打印出消息的内容。

源代码的Pom文件

谈谈netty是如何实现数百万连接的

介绍

建立一个100w的连接需要多少台机器,肯定是很多的。在测试过程中,完成一百万个连接不需要数百台服务器。需要注意的是,服务器支持的端口数量可以支持很多,但是如何实现两台服务器之间的百万连接需要考虑一个TCP级别的限制,两台服务器之间建立的连接数是有限的。网络翻两番。

同一IP的端口数不超过65,535,这是一个限制。每个连接不仅在服务器上打开一个端口,还在客户端上打开一个端口。每个TCP连接都涉及到端口数量的限制,客户端只有6万多个端口。

当服务器只有一个端口时,同一个客户端只能向其发起60,000多个连接。每次客户端发起请求,都需要打开一个端口。如果客户端没有端口,它就不能发起请求。

解决办法

服务器打开多个端口,网络上有区别的机器用网络四重标记。尽管客户端的端口有限,但它可以重用内部的端口。

例如,客户端端口20000已经连接到服务器端口9001。端口20000正在连接到服务器端的另一个端口9002。操作系统将自动处理客户端指定的端口重用。

Netty启用了地址重用。客户端还会打开多路复用。参数都是TCP参数。渠道发展。SO_REUSEADDR

客户机和服务器以循环方式增加了多个端口的绑定。

要在客户端和服务器端修改的代码

WebSocketClient

WebSocketServer

linux下的数百万种配置

环境配置

测试环境:双centos7 jdk8 4核8G

Centos服务器配置

最大进程文件打开添加参数最大限制

全局限制cat /proc/sys/fs/file-nr

服务设置

问题摘要

Centos服务器配置

开始

百万连接配置描述

为什么一台机器可以支持数百万个连接感觉有点科幻,但感觉不可能。首先,我们需要了解NIO的概念。如果NIO不做任何处理,网络就不需要java程序来处理。当java程序在连接中不发出任何噪音时,java就不会生成事件。只有当事件确实发生时,选择器才会通知您,在大规模连接期间,只要没有消息推送,消息就可以发送到服务器,无论有多少请求,都可以接受。这是NIO的特点。与BIO不同,当请求是打开连接时,它不是无限增长。这么多连接,首先消耗的是内存资源,最大的是内存。操作系统底层有TCP关联,java的netty里有通道,需要保持连接。连接产生相应的对象。这个对象虽然不处理,但是会占用内存,不是cpu管理的,但是java程序的处理占用cpu和内存。

很多联系都有一个误区。数以百万计的连接需要许多机器。百万连接的关键是NIO网络的机制。当对NIO没有直观的认识时,就不知道NIO能带来什么。在真实的生产环境中,服务器不需要那么多端口,而是开放100个端口。为了让测试服务器连接,服务器上有一个发送消息的命令。一旦涉及到数百万个连接和消息,就必须设计成消耗大量资源。netty调用handler和channel,所有这些都会消耗资源,服务器cpu资源也会挂起。最大cpu是400%的4核linux top的方式。

PS:最好自己通过代码来尝试一下,了解下百万连接的想法。按照正常的分布式架构,单机总是有瓶颈的。如果有一百万用户连接,单机8g4核很容易。分布式系统应该用分布式消息队列、负载平衡和注册中心的概念来设计。netty是解决系统开发、pipline和拆包问题的便捷方式,而不是自己编写socket程序。netty底层基于NIO,NIO底层基于复用机制。复用机制取决于操作系统。数以百万计的连接意味着操作系统参数。java代码使用NIO。如果不是NIO,对不起你够不到。设置一些系统操作配置。