前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >go-websocket 分布式IM

go-websocket 分布式IM

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

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

依赖包

代码语言:txt
复制
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
复制
git clone https://github.com/guyan0319/go-websocket.git

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

2、运行系统
代码语言:txt
复制
go run main.go
3、配置nginx
代码语言:txt
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 依赖包
  • 架构图
  • 一对一发消息
  • 群发消息
  • 快速搭建
    • 1、拉取代码
      • 2、运行系统
        • 3、配置nginx
          • 4、测试一对一聊天
            • 5、测试群聊天
              • 相关资料:
              相关产品与服务
              即时通信 IM
              即时通信 IM(Instant Messaging)基于腾讯二十余年的 IM 技术积累,支持Android、iOS、Mac、Windows、Web、H5、小程序平台且跨终端互通,低代码 UI 组件助您30分钟集成单聊、群聊、关系链、消息漫游、群组管理、资料管理、直播弹幕和内容审核等能力。适用于直播互动、电商带货、客服咨询、社交沟通、在线课程、企业办公、互动游戏、医疗健康等场景。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档