【工作问题】Netty与WebSocket奇遇记之“初遇”

「这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」。

技术人的进步,都是因为技术人对业务近乎苛刻的要求(一个个需求push出来的)。最近公司有个需求,需要将告警信息即时推送到前端页面。不是吹牛*,我在产品没开口的时候就知道他的所思所想了,当时差点儿直接开口说:“这个做不了,你行你来!”(当然了,我肯定是没敢说出口的)。在一通思想的激烈竞争后,我说:“好的,这就给您去做”。下面给大家汇报下我的研究报告。

正文

在开始正式汇报之前,我需要大家能了解什么是WebSocket,它有什么特点。 从名字看,这是一个与web交互的socket,它是从08年提出,11年成为国际标准,所有的浏览器都支持了WebScoket协议。在WebSocket出来之前,后台无法主动的向前端进行数据推送(这也是Http的一大缺陷),前端只能通过轮询的方式隔段时间就向后台进行请求来查询最新的数据信息。而WebSocket是一种建立在TCP协议之上,同时握手使用的是Http协议,这也决定了它在握手阶段不会被各种Http服务器所拦截。WebScoket在连接建立后,前端后台能进行双向通信,后台能主动向前端推送数据,这也是我们业务需求所需要的能力。 下面我先给大家分析下WebScoket连接创建的过程。先来张交互图。

image.png 解释下上图的一个交互流程啊

  1. 首先,前端向服务端发起WebSocket连接的握手请求,这是通过http发送的,两个作用一是为了建立连接前的握手,二是要求升级协议,就是说连接建立后使用的是WebSocket协议。

下面这是一个标准的握手请求包的header,这是一个标准的http请求头,其中Upgrade(后续需要升级的协议)、Sec-WebSocket-Key(连接效验码)和Sec-WebSocket-Version(WebSocket版本)是WebSocket协议专属的字段

--- request header ---
GET /chat HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: 127.0.0.1:8001
Origin: http://127.0.0.1:8001
Sec-WebSocket-Key: hj0eNqbhE/A0GkBXDRrYYw==
Sec-WebSocket-Version: 13
复制代码
  1. 服务端再收到握手请求后,会对前端发送的握手请求头相关信息进行确认(判断Upgrade和效验Sec-WebSocket-Key以及确定Sec-WebSocket-Version之类的),这是WebSocket协议标准化的效验,确认没有问题后,会回复一个握手相应包给前端。(我们就可以在握手阶段加上点自己的效验功能

下面这是一个握手响应的header

HTTP/1.1 101 Switching Protocols
Content-Length: 0
Upgrade: websocket
Sec-Websocket-Accept: ZEs+c+VBk8Aj01+wJGN7Y15796g=
Server: TornadoServer/4.5.1
Connection: Upgrade
Date: Wed, 21 Jun 2017 03:29:14 GMT
复制代码
  1. WebSocket连接建立,开始收发消息(WebSocket在连接创建中间会有很多种事件,连接建立事件,连接关闭事件之类的,大家就可以在各种事件中间穿插自己的业务)

4.连接关闭

需求分析

上面是建立WebSocket连接的大致流程,那我们的需求呢?为了保证使用WebSocket连接的用户都已经正常登陆系统了,所以我需要对客户的登陆状态进行效验(验证token)。

我脑海中有两套方案:

  1. 在连接建立后,前端主动给我推送一条消息,告诉我当前登陆用户的token,然后我对token进行效验,不通过我就断开连接,通过的话我就记录下该用户的状态,同时把后台的数据推送给该用户。(我觉得这方案不行,我不喜欢)
  2. 在握手阶段去进行token的效验,握手的http请求中带上token信息,我在握手的时候加一个效验登陆功能,不通过就不让连接,这样对服务端的资源也是一种节约。

由于我使用的是Netty,所以我需要对Netty中如何处理WebSocket握手和协议升级的处理进行研究。但是呢,这篇博客就不对Netty的源码进行分析了,下篇Netty与WebSocket奇遇记之熟识篇会讲解这部分内容的。今天就对什么是WebSocket和协议的握手连接进行分析。

总结

工作中会遇到很多的问题,作为技术人,对问题以及技术的思考要多问几个为什么?有没有更优解?你只有接触的多,才能积攒更多的经验。别人采访阿里多隆,问:你的技术怎么这么牛逼的,有什么学习方法吗?多隆:就是解决问题嘛。一句简单的话,其实包含了很多的心酸和辛苦的。 加油吧~打工人,老板年底又想换车了,我们要加油啊。

求波关注,公众号:java精进天路

猜你喜欢

转载自juejin.im/post/7069402534590283783