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

本文将介绍如何实现一个基于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 发送数据
  • 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 项目体验

2、介绍webSocket

2.1 webSocket 是什么

WebSocket 协议在2008年诞生,2011年成为国际标准。所有浏览器都已经支持了。

它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种。

  • HTTP和WebSocket在通讯过程的比较
    HTTP协议和WebSocket比较

  • HTTP和webSocket都支持配置证书,ws:// 无证书 wss:// 配置证书的协议标识
    HTTP协议和WebSocket比较

2.2 webSocket的兼容性

  • 浏览器的兼容性,开始支持webSocket的版本

浏览器开始支持webSocket的版本

  • 服务端的支持

golang、java、php、node.js、python、nginx 都有不错的支持

  • Android和IOS的支持

Android可以使用java-webSocket对webSocket支持

iOS 4.2及更高版本具有WebSockets支持

2.3 为什么要用webSocket

    1. 从业务上出发,需要一个主动通达客户端的能力

目前大多数的请求都是使用HTTP,都是由客户端发起一个请求,有服务端处理,然后返回结果,不可以服务端主动向某一个客户端主动发送数据

服务端处理一个请求

    1. 大多数场景我们需要主动通知用户,如:聊天系统、用户完成任务主动告诉用户、一些运营活动需要通知到在线的用户
    1. 可以获取用户在线状态
    1. 在没有长连接的时候通过客户端主动轮询获取数据
    1. 可以通过一种方式实现,多种不同平台(H5/Android/IOS)去使用

2.4 webSocket建立过程

    1. 客户端先发起升级协议的请求

客户端发起升级协议的请求,采用标准的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

  • 7
    点赞
  • 69
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值