基于websocket单台机器支持百万连接分布式聊天(IM)系统

您所在的位置:网站首页 websocket服务器最大连接数 基于websocket单台机器支持百万连接分布式聊天(IM)系统

基于websocket单台机器支持百万连接分布式聊天(IM)系统

2023-07-26 22:35| 来源: 网络整理| 查看: 265

本文将介绍如何实现一个基于websocket分布式聊天(IM)系统。

使用golang实现websocket通讯,单机可以支持百万连接,使用gin框架、nginx负载、可以水平部署、程序内部相互通讯、使用grpc通讯协议。

本文内容比较长,如果直接想clone项目体验直接进入项目体验 goWebSocket项目下载 ,文本从介绍webSocket是什么开始,然后开始介绍这个项目,以及在Nginx中配置域名做webSocket的转发,然后介绍如何搭建一个分布式系统。

目录1、项目说明1.1 goWebSocket1.2 项目体验2、介绍webSocket2.1 webSocket 是什么2.2 webSocket的兼容性2.3 为什么要用webSocket2.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 发送数据4、goWebSocket 项目4.1 项目说明4.2 项目依赖4.3 项目启动5、webSocket项目Nginx配置5.1 为什么要配置Nginx5.2 nginx配置5.3 问题处理6、压测6.1 Linux内核优化6.2 压测准备6.3 压测数据7、如何基于webSocket实现一个分布式Im7.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 项目体验项目地址 gowebsocketIM-聊天首页 或者在新的窗口打开 http://im.91vh.com/home/index打开连接以后进入聊天界面多人群聊可以同时打开两个窗口2、介绍webSocket2.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服务器响应升级协议

服务端接收到升级协议的请求,如果服务端支持升级协议会做如下响应

返回:

Status Code: 101 Switching Protocols 表示支持切换协议

# Response Headers Connection: upgrade Date: Fri, 09 Aug 2019 07:36:59 GMT Sec-WebSocket-Accept: mB5emvxi2jwTUhDdlRtADuBax9E= Server: nginx/1.12.1 Upgrade: websocket升级协议完成以后,客户端和服务器就可以相互发送数据3、如何实现基于webSocket的长连接系统3.1 使用go实现webSocket服务端3.1.1 启动端口监听websocket需要监听端口,所以需要在golang 成功的 main 函数中用协程的方式去启动程序main.go 实现启动go websocket.StartWebSocket()init_acc.go 启动程序// 启动程序 func StartWebSocket() { http.HandleFunc("/acc", wsPage) http.ListenAndServe(":8089", nil) }3.1.2 升级协议客户端是通过http请求发送到服务端,我们需要对http协议进行升级为websocket协议对http请求协议进行升级 golang 库gorilla/websocket 已经做得很好了,我们直接使用就可以了在实际使用的时候,建议每个连接使用两个协程处理客户端请求数据和向客户端发送数据,虽然开启协程会占用一些内存,但是读取分离,减少收发数据堵塞的可能init_acc.gofunc wsPage(w http.ResponseWriter, req *http.Request) { // 升级协议 conn, err := (&websocket.Upgrader{CheckOrigin: func(r *http.Request) bool { fmt.Println("升级协议", "ua:", r.Header["User-Agent"], "referer:", r.Header["Referer"]) return true }}).Upgrade(w, req, nil) if err != nil { http.NotFound(w, req) return } fmt.Println("webSocket 建立连接:", conn.RemoteAddr().String()) currentTime := uint64(time.Now().Unix()) client := NewClient(conn.RemoteAddr().String(), conn, currentTime) go client.read() go client.write() // 用户连接事件 clientManager.Register


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3