前言提到WebSocket
相信大家都听说过 , 它的初衷是为了解决客户端浏览器与服务端进行双向通信 , 是在单个TCP
连接上进行全双工通讯的协议 。在没有WebSocket之前只能通过浏览器到服务端的请求应答模式比如轮训 , 来实现服务端的变更响应到客户端 , 现在服务端也可以主动发送数据到客户端浏览器 。WebSocket
协议和Http
协议平行 , 都属于TCP/IP四层模型
中的第四层应用层 。由于WebSocket
握手阶段采用HTTP
协议,所以也需要进行跨域处理 。它的协议标识是ws
或wss
对应了常规标识和安全通信协议标识 。本文重点并不是介绍WebSocket
协议相关 , 而是提供一种基于ASP.NET Core原生WebSocket的方式实现集群的实现思路 。关于这套思路其实很早之前我就构思过了 , 只是之前一直没有系统的整理出来 , 本篇文章就来和大家分享一下 , 由于主要是提供一种思路 , 所以涉及到具体细节或者业务相关的可能没有体现出来 , 还望大家理解 。
实现咱们的重点关键字就是两个WebSocket
和集群
, 实现的框架便是基于ASP.NET Core
,我也基于golang
实现了一套,本文涉及到的相关源码和golang版本的实现都已上传至我的github,具体仓库地址可以转到文末自行跳转到#示例源码中查看 。既然涉及到集群 , 这里咱们就用nginx
作为反向代理 , 来搭建一个集群实例 。大致的示例结构如下图所示

文章插图
redis
在这里扮演的角色呢 , 是用来处理Server
端的消息相互传递用的 , 主要是使用的redis的pub/sub
功能来实现的 , 这里便涉及到几个核心问题- 首先 , 集群状态每个用户被分发到具体的哪台服务器上是不得而知的
- 其次 , 处在不同
Server
端的不同用户间的相互通信是需要一个传递媒介 - 最后 , 针对不同的场景比如单发消息、分组消息、全部通知等要有不同的处理策略
这里需要考虑的是 , 如果需要搭建实时通信服务器的话 , 需要注意集群的隔离性 , 主要是和核心业务进行隔离 , 毕竟上面提到了WebSocket
需要保持长链接、且消息的大小需要评估 。
redis
的主要功能就是用来传递消息用的 , 毕竟每个server服务器是无状态的 。这当然不是必须的 , 任何可以进行消息分发的中间件都可以 , 比如消息队列rabbitmq、kafka、rocketmq、mqtt等 , 甚至只要能把要处理的消息存储起来都可以比如缓存甚至是关系型数据库等等 。这压力使用redis主要是因为操作起来简单、轻量级、灵活 , 让大家关注点在思路上 , 而不是使用中案件的代码上 。nginx配置通过上面的图我们可以看到 , 我们这里构建集群示例使用的nginx , 如果让nginx支持WebSocket的话 , 需要额外的配置 , 这个在网上有很多相关的文章介绍 , 这里就来列一下咱们示例的nginx配置 , 在配置文件
nginx.conf
里//上游服务器地址也就是websocket服务的真实地址upstream wsbackend {server 127.0.0.1:5001;server 127.0.0.1:5678;}server {listen5000;server_namelocalhost;location ~/chat/{//upstream地址proxy_pass http://wsbackend;proxy_connect_timeout 60s;proxy_read_timeout 3600s;proxy_send_timeout 3600s;//记得转发避免踩坑proxy_set_header Host $host;proxy_http_version 1.1;//http升级成websocket协议的头标识proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "Upgrade";}}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 关于童年回忆的美词美句 描写童年句子唯美
- 中元节不能洗澡吗
- 关于晚睡的文案短句 无奈熬夜的说说心情
- 关于熬夜的俏皮话 适合熬夜发朋友圈的句子伤感
- 关于入门深度学习mnist数据集前向计算的记录
- 2022年11月11日购物节是黄道吉日吗
- 梅西淘宝直播在哪里看几点开始
- 《ASP.NET Core技术内幕与项目实战》精简集-目录
- 华为开发者大会HDC2022:HMS Core 持续创新,与开发者共创美好数智生活
- 上 学习ASP.NET Core Blazor编程系列十——路由