socket.io的部分使用及部署

1,388 阅读4分钟

虽然天天在掘金简书摸鱼,但还是第一次写文章记录一下日常的一些解决问题的过程,哈哈哈,就当回馈一下社区!专业性么肯定是没有的,不过实用性还是有一点。因为个人解决问题的思路原因,文章只讲了解决问题的思路,没有大段大段的代码,可能跟好多人的习惯不符。好了,一个个问题的说。

我们采用了前后端分离的架构,而我是一个用node写中间层的小钉子,没错,要处理贼麻烦的业务,要给后端的restful API组装数据,给前端一个看起来十分好用的数据。日常就是,喂喂喂,那个谁,你看下你这个接口怎么报错了,然后开始矜矜业业的排查哈哈哈。

先讲一下问题的起源,之前我们公司的网站前后端交互都是走http的,这个过程难免前端的同学就要起定时器进行轮询请求部分需要实时刷新的数据,一开始做我还是一个刚实习的啥也不懂的萌新,也没觉得怎么样,后来跟朋友瞎玩的时候自己简单的写过socket,然后就觉得,为什么我们不用呢,不过暂时也还没跟leader提。然后前端终于等来了一个对我们来说算是厉害的人物,他看到我们的页面这么多定时轮询后提出,我们用websocket吧!

然后踏上了我的研究之路。

先说,socket.io并不是websocket,但他可以支持websocket,而且之前跟朋友联调时也用的这个,所以不自觉的就用上了socketio。

一开始那个叫快啊,秒秒钟就打了个架子,虽然啥都没考虑,就按官网的例子直接写了,合并到了原来的代码里,还被夸了一顿效率很高啊,其实是原来就写过哈哈哈。

然后几天后碰到了第一个问题,服务端断开之后客户端如何处理? 经过一通翻官方的文档,socketio2.0是自动断开重连的,发现客户端有一个reconnect的事件,再重连的事件里进行再次的业务处理就好了。

然后,leader说你这个socket没做安全认证啊,那不是谁都可以连了,去考虑一下安全认证的问题。

然后搜索发现了socketio-jwt这个库,原来我们平台的权限验证也是token,完美符合有没有,而且不得不说现在的第三方库简直就是开箱即用,不要太方便,然后开始思考啥时候自己也能写出这种东西。

最近两天,一个项目是直接前端和后端java交互的,后端大佬一看,你们这个库跟原生的websocket不一样啊,怎么先发三个http请求的,ws请求呢??

因为原来前端的架子也是我搭的,遂问我究竟如何,我。。我去看看哈哈哈

因为暂时在忙其他事情,然后就搁置了一下,一天后后端大佬说,你文档没看仔细,他可以在传输方式上直接指定websocket的,恍然大悟,原来socketio是支持了多种传输方式,在客户端加上指定websocket的参数即可。

想终于可以休息会了吧,然后最近网站准备加入ssl,运维同学配好nginx之后发现,页面报错。。。没错,就是那个https的网站ws连接也是不安全的,之后说是将ws转为wss即可解决问题,没玩过nginx的我只好开始看网上的各种nginx 配置,将自己的socket端口用nginx代理,然后nginx对外开放的是wss。

中途还有一个问题忘了跟大家说,服务起来是很简单,但在生产环境中就很多要考虑的了,首先就是负载均衡,你的开多个socket实例吧,暂时是用node的cluster模拟多个socket,然后就发现socketio报错,responseerror:巴拉巴拉400; 网上一查是说socket验证有问题。记得上面说的要先发三个http请求吗,对,他们就是确认socket连接的,我是用pm2部署的多个socket实例,在三个http 请求到来后如果分发到了不同的实例,就无法完成连接通道的确立。最后还是那个叫nginx的救了命,用ip_hash方法将同一个ip段的分发到同一个实例,就可以解决该问题,虽然也知道ip_hash并不是很好的负载均衡算法,可能导致一台服务器负载过大,但暂时还没想到什么其他方式。

好了,一顿逼逼叨之后说完了,这是写的第一篇文章,其实这些问题都不是什么大的问题,但还是决定记录一下。不放代码是怕丢人,就只能说思路了。希望以后可以分享更多给大家!

如果你看完了,那实在是太感谢你了