本文将介绍如何实现一个基于websocket分布式聊天(IM)系统。
使用golang实现websocket通讯,单机可以支持百万连接,使用gin框架、nginx负载、可以水平部署、程序内部相互通讯、使用grpc通讯协议。
本文内容比较长,如果直接想clone项目体验直接进入项目体验 goWebSocket项目下载 ,文本从介绍webSocket是什么开始,然后开始介绍这个项目,以及在Nginx中配置域名做webSocket的转发,然后介绍如何搭建一个分布式系统。
目录
- 1、项目说明
- 1.1 goWebSocket
- 1.2 项目体验
- 2、介绍webSocket
- 2.1 webSocket 是什么
- 2.2 webSocket的兼容性
- 2.3 为什么要用webSocket
- 2.4 webSocket建立过程
- 3、如何实现基于webSocket的长连接系统
- 3.1 使用go实现webSocket服务端
- 3.1.1 启动端口监听
- 3.1.2 升级协议
- 3.1.3 客户端连接的管理
- 3.1.4 注册客户端的socket的写的异步处理程序
- 3.1.5 注册客户端的socket的读的异步处理程序
- 3.1.6 接收客户端数据并处理
- 3.1.7 使用路由的方式处理客户端的请求数据
- 3.1.8 防止内存溢出和Goroutine不回收
- 3.2 使用javaScript实现webSocket客户端
- 3.2.1 启动并注册监听程序
- 3.2.2 发送数据
- 3.1 使用go实现webSocket服务端
- 4、goWebSocket 项目
- 4.1 项目说明
- 4.2 项目依赖
- 4.3 项目启动
- 5、webSocket项目Nginx配置
- 5.1 为什么要配置Nginx
- 5.2 nginx配置
- 5.3 问题处理
- 6、压测
- 6.1 Linux内核优化
- 6.2 压测准备
- 6.3 压测数据
- 7、如何基于webSocket实现一个分布式Im
- 7.1 说明
- 7.2 架构
- 7.3 分布式系统部署
- 8、回顾和反思
- 8.1 在其它系统应用
- 8.2 需要完善、优化
- 8.3 总结
- 9、参考文献
1、项目说明
1.1 goWebSocket
本文将介绍如何实现一个基于websocket聊天(IM)分布式系统。
使用golang实现websocket通讯,单机支持百万连接,使用gin框架、nginx负载、可以水平部署、程序内部相互通讯、使用grpc通讯协议。
- 一般项目中webSocket使用的架构图
1.2 项目体验
- 项目地址 gowebsocket
- IM-聊天首页 或者在新的窗口打开 http://im.91vh.com/home/index
- 打开连接以后进入聊天界面
- 多人群聊可以同时打开两个窗口
2、介绍webSocket
2.1 webSocket 是什么
WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。
它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。
-
HTTP和WebSocket在通讯过程的比较
-
HTTP和webSocket都支持配置证书,
ws://
无证书wss://
配置证书的协议标识
2.2 webSocket的兼容性
- 浏览器的兼容性,开始支持webSocket的版本
- 服务端的支持
golang、java、php、node.js、python、nginx 都有不错的支持
- Android和IOS的支持
Android可以使用java-webSocket对webSocket支持
iOS 4.2及更高版本具有WebSockets支持
2.3 为什么要用webSocket
-
- 从业务上出发,需要一个主动通达客户端的能力
目前大多数的请求都是使用HTTP,都是由客户端发起一个请求,有服务端处理,然后返回结果,不可以服务端主动向某一个客户端主动发送数据
-
- 大多数场景我们需要主动通知用户,如:聊天系统、用户完成任务主动告诉用户、一些运营活动需要通知到在线的用户
-
- 可以获取用户在线状态
-
- 在没有长连接的时候通过客户端主动轮询获取数据
-
- 可以通过一种方式实现,多种不同平台(H5/Android/IOS)去使用
2.4 webSocket建立过程
-
- 客户端先发起升级协议的请求
客户端发起升级协议的请求,采用标准的HTTP报文格式,在报文中添加头部信息
Connection: Upgrade
表明连接需要升级
Upgrade: websocket
需要升级到 websocket协议
Sec-WebSocket-Version: 13
协议的版本为13
Sec-WebSocket-Key: I6qjdEaqYljv3+9x+GrhqA==
这个是base64 encode 的值,是浏览器随机生成的,与服务器响应的 Sec-WebSocket-Accept
对应
# Request Headers
Connection: Upgrade
Host: im.91vh.com
Origin: http://im.91vh.com
Pragma: no-cache
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Sec-WebSocket-Key: I6qjdEaqYljv3+9x+GrhqA==
Sec-WebSocket-Version: 13
Upgrade: websocket