如何实现ASP.NETCoreWebSocket集群的详细长尾词?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1696个文字,预计阅读时间需要7分钟。
目录+前言+实现+nginx配置+一对一发送+群组发送+发送所有人+整合到一起+一对一处理+群组处理+全员消息处理+示例源码+总结+前言+提到+WebSocket+相信大家都听说过,它的初衷是为了解决客户端与服务器之间的实时通信问题。
目录
- 前言
- 实现
- nginx配置
- 一对一发送
- 群组发送
- 发送所有人
- 整合到一起
- 一对一处理
- 群组处理
- 全员消息处理
- 示例源码
- 总结
前言
提到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 { listen 5000; server_name localhost; location ~/chat/{ //upstream地址 proxy_pass wsbackend; proxy_connect_timeout 60s; proxy_read_timeout 3600s; proxy_send_timeout 3600s; //记得转发避免踩坑 proxy_set_header Host $host; proxy_github.com/softlgl/WebsocketCluster
golang源码示例github.com/softlgl/websocket-cluster仓库里还涉及到本人闲暇之余开源的其他仓库,由于本人能力有限难登大雅之堂,就不做广告了,有兴趣的同学可以自行浏览一下。
总结
本文基于ASP.NET Core框架提供了一个基于WebSocket做集群的示例,由于思想是通用的,所以基于这个思路楼主也实现了golang版本。其实在之前就想自己动手搞一搞关于WebSocket集群方面的设计,本篇文章算是对之前想法的一个落地操作。其核心思路文章已经做了相关介绍,由于这些只是博主关于构思的实现,可能有很多细节尚未体现到,还希望大家多多理解。其核心思路总结一下
- 首先是,利用可以构建WebSocket服务的框架,在当前服务实例中保存当前客户端用户和WebSocket的连接关系
- 如果消息的目标客户端不在当前服务器,可以利用redis频道、消息队列相关、甚至是数据库类的共享回话发送的消息,由目标服务器获取目标是否属于自己的ws会话
- 本文设计的思路使用的是无状态的方式,即WebSocket服务实例之间不存在直接的消息通信和相互的服务地址存储,当然也可以利用redis等存储在线用户信息等,这个可以参考具体业务自行设计
读万卷书,行万里路。在这个时刻都在变化点的环境里,唯有不断的进化自己,多接触多尝试不用的事物,多扩展自己的认知思维,方能构建自己的底层逻辑。毕竟越底层越抽象,越通用越抽象。面对未知的挑战,自身作为自己坚强的后盾,可能才会让自己更踏实。
以上就是ASP.NET Core WebSocket集群实现思路详解的详细内容,更多关于ASP.NET Core WebSocket的资料请关注自由互联其它相关文章!
本文共计1696个文字,预计阅读时间需要7分钟。
目录+前言+实现+nginx配置+一对一发送+群组发送+发送所有人+整合到一起+一对一处理+群组处理+全员消息处理+示例源码+总结+前言+提到+WebSocket+相信大家都听说过,它的初衷是为了解决客户端与服务器之间的实时通信问题。
目录
- 前言
- 实现
- nginx配置
- 一对一发送
- 群组发送
- 发送所有人
- 整合到一起
- 一对一处理
- 群组处理
- 全员消息处理
- 示例源码
- 总结
前言
提到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 { listen 5000; server_name localhost; location ~/chat/{ //upstream地址 proxy_pass wsbackend; proxy_connect_timeout 60s; proxy_read_timeout 3600s; proxy_send_timeout 3600s; //记得转发避免踩坑 proxy_set_header Host $host; proxy_github.com/softlgl/WebsocketCluster
golang源码示例github.com/softlgl/websocket-cluster仓库里还涉及到本人闲暇之余开源的其他仓库,由于本人能力有限难登大雅之堂,就不做广告了,有兴趣的同学可以自行浏览一下。
总结
本文基于ASP.NET Core框架提供了一个基于WebSocket做集群的示例,由于思想是通用的,所以基于这个思路楼主也实现了golang版本。其实在之前就想自己动手搞一搞关于WebSocket集群方面的设计,本篇文章算是对之前想法的一个落地操作。其核心思路文章已经做了相关介绍,由于这些只是博主关于构思的实现,可能有很多细节尚未体现到,还希望大家多多理解。其核心思路总结一下
- 首先是,利用可以构建WebSocket服务的框架,在当前服务实例中保存当前客户端用户和WebSocket的连接关系
- 如果消息的目标客户端不在当前服务器,可以利用redis频道、消息队列相关、甚至是数据库类的共享回话发送的消息,由目标服务器获取目标是否属于自己的ws会话
- 本文设计的思路使用的是无状态的方式,即WebSocket服务实例之间不存在直接的消息通信和相互的服务地址存储,当然也可以利用redis等存储在线用户信息等,这个可以参考具体业务自行设计
读万卷书,行万里路。在这个时刻都在变化点的环境里,唯有不断的进化自己,多接触多尝试不用的事物,多扩展自己的认知思维,方能构建自己的底层逻辑。毕竟越底层越抽象,越通用越抽象。面对未知的挑战,自身作为自己坚强的后盾,可能才会让自己更踏实。
以上就是ASP.NET Core WebSocket集群实现思路详解的详细内容,更多关于ASP.NET Core WebSocket的资料请关注自由互联其它相关文章!

