Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >go-websocket 分布式IM

go-websocket 分布式IM

原创
作者头像
孤烟
发布于 2022-03-19 07:09:10
发布于 2022-03-19 07:09:10
1.4K0
举报
文章被收录于专栏:golang开发笔记golang开发笔记

基于golang实现的分布式聊天系统,支持一对一聊天,聊天室等功能。为了测试方便发送消息数据暂未存入数据库,后期会加入数据库,也可自行加入数据库,方便永久存储聊天内容,以及支持消息必达等功能。

依赖包

代码语言:txt
AI代码解释
复制
github.com/go-redis/redis
github.com/gin-gonic/gin
github.com/gorilla/websocket
github.com/smallnest/rpcx

包说明:

redis :用于缓存ws服务器信息,用心跳形式维护ws服务器信息。

gin:实现web服务

websocket: 实现websocket协议

rpcx:服务器建rpc通信

架构图

一对一发消息

  • 客户端 发送建立长连接请求,经过nginx负载均衡分配给其中一台ws服务器(这里假设分配的是A服务器)处理。
  • A服务器响应长连接请求,并缓存客户端地址和用户连接,用户id等信息。
  • 客户端收到服务端响应建立websocet连接。
  • 客户端发送信息,nginx负载均衡分配给其中一台ws服务器(这里假设是B服务器)。
  • B服务器从发送的信息中解析接收用户(假设为a)信息,先验证a用户是否和B服务器建立websocet连接,若建立则直接发送消息给a用户。否则通过redis缓存中获取ws服务器信息列表,通过rpc方式发送消息到ws服务器列表中除B服务器之外的每台ws服务器,这些接收到发送信息的ws服务器,先验证和a用户是否建立连接,建立则发送信息给a用户,否则丢弃。

群发消息

  • 客户端 发送建立长连接请求,经过nginx负载均衡分配给其中一台ws服务器(这里假设分配的是A服务器)处理。
  • A服务器响应长连接请求,并缓存客户端地址和用户连接,用户id等信息。
  • 客户端收到服务端响应建立websocet连接。
  • 客户端发送信息,nginx负载均衡分配给其中一台ws服务器(这里假设是B服务器)。
  • B服务器从发送的信息中解析出群信息,根据群信息获取用户列表,遍历用户发送信息(发送方式跟一对一类似)。
  • 先验证用户是否和B服务器建立websocet连接,若建立则直接发送消息给用户。否则通过redis缓存中获取ws服务器信息列表,通过rpc方式发送消息到ws服务器列表中除B服务器之外的每台ws服务器,这些接收到发送信息的ws服务器,先验证和用户是否建立连接,建立则发送信息给用户,否则丢弃。

快速搭建

1、拉取代码
代码语言:txt
AI代码解释
复制
git clone https://github.com/guyan0319/go-websocket.git

注:这里代码版本控制使用go modules

2、运行系统
代码语言:txt
AI代码解释
复制
go run main.go
3、配置nginx
代码语言:txt
AI代码解释
复制
upstream  go-http
{
    server 127.0.0.1:8282 weight=1 max_fails=2 fail_timeout=10s;
    keepalive 16;
}

upstream  go-ws
{
    server 127.0.0.1:8089 weight=1 max_fails=2 fail_timeout=10s;
    keepalive 16;
}

server {
        listen        80;
        server_name  ws.test;
        root   "D:/phpstudy/WWW/";
          location /ws {
        proxy_set_header Host $host;
        proxy_pass http://go-ws;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection $connection_upgrade;
        proxy_set_header Connection "";
        proxy_redirect off;
        proxy_intercept_errors on;
        client_max_body_size 10m;
    }

    location /
    {
	    proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header Host $host;
        proxy_pass http://go-http;
    }
}
4、测试一对一聊天

浏览器打开两个窗口访问

http://ws.test/home/index?uid=1&to_uid=2

http://ws.test/home/index?uid=2&to_uid=1

5、测试群聊天

浏览器打开两个窗口访问

http://ws.test/home/room?uid=1

http://ws.test/home/room?uid=2

相关资料:

github.com/gorilla/websocket

https://my.oschina.net/u/4231722/blog/3168223

https://doc.rpcx.io/

https://github.com/link1st/gowebsocket

https://segmentfault.com/a/1190000018712908

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于websocket单台机器支持百万连接分布式聊天(IM)系统
使用golang实现websocket通讯,单机可以支持百万连接,使用gin框架、nginx负载、可以水平部署、程序内部相互通讯、使用grpc通讯协议。
link1st
2019/09/19
7.6K0
基于websocket单台机器支持百万连接分布式聊天(IM)系统
WebSocket 介绍以及配合 STOMP 的使用
由于近期需要使用 WebSocket 的部分功能,然而在工作过程中,发现自己对这部分知识点不是很了解,而且对于后台同学提出的 WebSocket 和 STOMP 的组合,不知如何下手。经过相关资料查证,分享与大家,如有纰漏,希望不吝指出。 本文行文为三个部分,分别讲述:Socket 是什么,WebSocket 是什么,STOMP 是什么,如何结合后两者投入使用。
零式的天空
2022/03/25
3.2K0
一文吃透 WebSocket 原理
一.前言 踩着年末的尾巴,提前布局来年,为来年的工作做个好的铺垫,所以就开始了面试历程,因为项目中使用到了 WebSocket ,面试官在深挖项目经验的时候,也难免提到 WebSocket 相关的知识点,因为之前并没有考虑这么深,所以,回答的还是有所欠缺,因此,赶紧趁热再熟悉熟悉,也借此机会,整理出来供大家咀嚼,每个项目都有其值得挖掘的闪光点,要用有爱的眼睛👁去发现。 二.什么是 WebSocket WebSocket 是一种在单个TCP连接上进行全双工通信的协议。WebSocket 使得客户端和服务器之
ConardLi
2021/11/16
4.4K0
聊聊 分布式 WebSocket 集群解决方案
最近做项目时遇到了需要多用户之间通信的问题,涉及到了WebSocket握手请求,以及集群中WebSocket Session共享的问题。 期间我经过了几天的研究,总结出了几个实现分布式WebSocket集群的办法,从zuul到spring cloud gateway的不同尝试,总结出了这篇文章,希望能帮助到某些人,并且能一起分享这方面的想法与研究。 以下是我的场景描述 资源:4台服务器。其中只有一台服务器具备ssl认证域名,一台redis+mysql服务器,两台应用服务器(集群) 应用发布限制条件:由于场景
程序猿DD
2022/06/16
1.9K0
聊聊 分布式 WebSocket 集群解决方案
WebSocket新手入门指南
WebSocket 是 HTML5 新增的在单个 TCP 连接上进行全双工通讯(不受限的双向通信)的协议,能更好的节省服务器资源和带宽,并且能够更实时地进行通讯。
蛮三刀酱
2022/01/05
1.7K0
websocket
拉的方式比较耗费资源,因为http是无状态且单向的通讯协议,后端无法主动xia向前端发送信息,一般拉为前端不间断的向服务端发送http请求,这种方式前端和后端都比较头疼。没有特殊需求的话,一般使用推的方式。HTML5开始提供websocket解决方式,基于TCP实现客户端与服务端全双工通信。websocket只使用了一个连接,避免了连接的多次建立;且只有连接初次建立比较复杂,后期通信成本较低。
wo.
2021/06/15
1.4K0
分布式 WebSocket 集群解决方案
来源 | blog.csdn.net/weixin_34194702/article/details/88701309
程序猿DD
2021/11/10
2.1K1
SpringBoot2整合WebSocket,实现后台向前端推送信息
WebSocket 协议是基于 TCP 的一种新的网络协议。它实现了浏览器与服务器全双工(full-duplex)通信——允许服务器主动发送信息给客户端。
Li_XiaoJin
2022/06/12
2.8K0
SpringBoot2整合WebSocket,实现后台向前端推送信息
Nginx支持WebSocket反向代理-学习小结
WebSocket是目前比较成熟的技术了,WebSocket协议为创建客户端和服务器端需要实时双向通讯的webapp提供了一个选择。其为HTML5的一部分,WebSocket相较于原来开发这类app的方法来说,其能使开发更加地简单。大部分现在的浏览器都支持WebSocket,比如Firefox,IE,Chrome,Safari,Opera,并且越来越多的服务器框架现在也同样支持WebSocket。
洗尽了浮华
2018/08/22
3K0
Nginx支持WebSocket反向代理-学习小结
开源高性能PHP应用容器workerman一对一聊天多人聊天
Workerman 是一款纯 PHP 开发的开源高性能 PHP 应用容器,它突破了传统 PHP 应用的限制,能够开发高性能的实时网络应用。它不是传统的 MVC 框架,而是一个底层通用的服务框架,支持 TCP、UDP、HTTP、WebSocket 等多种协议,适用于开发即时通讯、物联网、游戏服务器、高性能 HTTP 服务等多种应用。
Tinywan
2025/02/27
1340
开源高性能PHP应用容器workerman一对一聊天多人聊天
八问WebSocket协议:为你快速解答WebSocket热门疑问
WebSocket是一种比较新的协议,它是伴随着html5规范而生的,虽然还比较年轻,但大多主流浏览器都已经支持。它使用方面、应用广泛,已经渗透到前后端开发的各种场景中。
JackJiang
2019/04/25
1.3K0
Nginx Websocket 配置
WebSocket 是一种基于 TCP 连接的全双工通信的协议,其工作在应用层,建立连接的时候通过复用 Http 握手通道,完成 Http 协议的切换升级,即切换到 WebSocket 协议,协议切换成功后,将不再需要客户端发起请求,服务端就可以直接主动向客户端发送数据,实现双向通信。
Se7en258
2021/05/18
5.5K0
Nginx Websocket 配置
WebSocket协议 8 问
WebSocket是一种比较新的协议,它是伴随着html5规范而生的,虽然还比较年轻,但大多主流浏览器都已经支持。它使用方便、应用广泛,已经渗透到前后端开发的各种场景中。
xjjdog
2019/09/24
9400
WebSocket协议 8 问
workerman的websocket的wss实例
Workerman不是重复造轮子,它不是一个MVC框架,而是一个更底层更通用的服务框架,你可以用它开发tcp代理、梯子代理、做游戏服务器、邮件服务器、ftp服务器、甚至开发一个php版本的redis、php版本的数据库、php版本的nginx、php版本的php-fpm等等。Workerman可以说是PHP领域的一次创新,让开发者彻底摆脱了PHP只能做WEB的束缚。
OwenZhang
2022/05/30
3.7K7
workerman的websocket的wss实例
语音评测之——websocket
前段时间小编收到一份测试任务要求对搜狗输入法的语音功能进行评测。评测任务主要拆分为评测语料的选取和整理,硬件的调研和采购,评测工具的开发以及评测的执行和结果整理。小编负责评测工具服务端的开发工作,主要使用了websocket的技术,此次与大家做一个简单的分享。
用户5521279
2020/03/03
3.7K0
语音评测之——websocket
Comet,SSE,WebSocket前后端的实现
Comet(服务器推送)的两种方式 短轮询 页面定时向服务器发送请求, 步骤为:建立连接——数据传输——关闭连接...建立连接——数据传输——关闭连接 //前端js var xhr = new XMLHttpRequest(); setInterval(()=>{ xhr.onreadystatechange = function () { if (xhr.readyState == 4) { let result = xhr.responseText
chuchur
2022/10/25
8660
websocket协议
websocket是html5中提出的一个协议规范,它允许浏览器与服务器中相互主动通信.
仙士可
2020/12/15
2.4K0
聊聊分布式下的WebSocket解决方案
最近王子自己搭建了个项目,项目本身很简单,但是里面有使用WebSocket进行消息提醒的功能,大体情况是这样的。
HUC思梦
2020/09/24
3.2K1
SpringBoot整合webSocket
小伙伴们,周一快乐。悄悄告诉大家一个好消息,还有四天就放假了。。惊不惊喜 意不意外
猿码优创
2019/07/27
4.3K1
Websocket 基础篇
喵小贱
2017/05/12
3.7K0
Websocket 基础篇
相关推荐
基于websocket单台机器支持百万连接分布式聊天(IM)系统
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档