Docker部署gochat聊天系统

solumatephper · · 947 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

MacOS Docker 安装 

1、使用 Homebrew 安装

macOS 我们可以使用 Homebrew 来安装 Docker。

Homebrew 的 Cask 已经支持 Docker for Mac,因此可以很方便的使用 Homebrew Cask 来进行安装:

$ brew install --cask --appdir=/Applications docker

2、手动下载安装

1、如果需要手动下载,请点击以下链接下载 Stable(https://download.docker.com/mac/stable/Docker.dmg) 或 Edge (https://download.docker.com/mac/edge/Docker.dmg)版本的 Docker for Mac。

2、如同 macOS 其它软件一样,安装也非常简单,双击下载的 .dmg 文件,然后将鲸鱼图标拖拽到 Application 文件夹即可。

3、启动终端后,通过命令可以检查安装后的 Docker 版本。

    $ docker --version

4、对于使用 macOS 的用户,在任务栏点击 Docker Desktop 应用图标 -> Perferences,在左侧导航菜单选择

DockerEngine,在右侧像下边一样编辑 json 文件。修改完成之后,点击 Apply & Restart 按钮,Docker 就会重启并应

用配置的镜像地址了。

{

  "registry-mirrors": [

    "https://hub-mirror.c.163.com",

    "https://mirror.baidubce.com"

  ]

}

5、之后我们可以通过 docker info 来查看是否配置成功。

    # docker info

至此,docker已经安装结束


使用docker一键启动gochat

执行docker相关步骤的时候,会到hub.docker.com拉取相关镜像,可能需要翻墙,具体看你的网络。

1、你可以使用我推到docker hub上的镜像:

    默认镜像中已经创建了几个测试用户:

    用户名             密码

    demo             111111

    test                111111

    admin            111111

    第一步:docker pull lockgit/gochat:latest

    第二步:git clone git@github.com:LockGit/gochat.git

    第三步:cd gochat && sh run.sh dev (该步骤需要一定时间编译各个模块,耐心等待即可,部分系统可能没有sh,如果

执行报错,把sh run.sh dev改为./run.sh dev执行)

    第四步:访问 http://127.0.0.1:8080 开启聊天室

2、如果你想自己构建一个镜像,那么只需要build docker文件下的Dockerfile

    docker build -f docker/Dockerfile . -t lockgit/gochat

    上面build过程可能需要翻墙且需要一定时间,完成后执行:

    第一步:git clone git@github.com:LockGit/gochat.git

    第二步:cd gochat && sh run.sh dev (该步骤需要一定时间编译各个模块,耐心等待即可,部分系统可能没有sh,如果

执行报错,把sh run.sh dev改为./run.sh dev执行)

    第三步:访问 http://127.0.0.1:8080 开启聊天室

3、如果你要部署在个人vps上,记得修改site/js/common.js中socketUrl与apiUrl的地址为你的vps的ip地址,

并确保vps上没有针对相关端口的防火墙限制。


gochat目录结构

├── api # api接口层,提供rest api服务,主要rpc call logic层服务,可水平扩展

├── architecture       # 架构图资源图片文件夹

├── bin                      # golang编译后的二进制文件,不参与提交至git仓库

├── config                 # 配置文件

├── connect              # 链接层,该层用于handler住大量用户长连接,实时消息推送,除此之外,主要rpc call logic层服务,可水平扩展

├── db                       # 数据库链接初始化,内部gochat.sqlite3为方便演示时使用的sqlite数据库,实际场景可替换为其他关系型数据库

├── docker                # 用于快速构建docker环境

├── go.mod              # go包管理mod文件

├── go.sum              # go包管理sum文件

├── logic                # 逻辑层,该层主要接收connect层与api层的rpc请求。如果是消息,会push到队列,最终被task层消费,可水平扩展

├── main.go              # gochat程序唯一入口文件

├── proto                # golang rpc proto 文件

├── readme.md            # 中文说明文档

├── readme.en.md        # 英文说明文档

├── reload.sh            # 编译gochat并执行supervisorctl restart重启相关进程

├── run.sh              # 快速构建一个docker容器,启动demo

├── site                # 站点层,该层为纯静态页面,会http请求api层,可水平扩展

├── task                # 任务层,该层消费队列中的数据,并且rpc call connect层执行消息的发送,可水平扩展

├── tools                # 工具方法

└── vendor              # vendor包


Websocket && Tcp消息互通

    1、tcp消息投递与接收测试代码在本项目pkg/stickpackage目录中的:stickpackage_test.go文件中的Test_TcpClient方法

    其中stickpackage.go文件主要为实现tcp拆包解包时用到,可以追踪下其中Pack与Unpack方法的调用地方。

    主要原因是tcp是基于第4层的流式协议而非应用层协议,所以才有了这个过程。

    如果是android,ios客户端来链接,那么对应的就是需要用熟悉的语言来实现这个tcp拆包解包的过程,例子中的代码是golang实现的demo。

    go test -v -count=1 *.go -test.run Test_TcpClient

    2、如果是测试tcp消息投递:

    只需要修改这个方法中@todo部分的内容为你测试时正确的内容即可,测试tcp端口使用7001,7002,如果是在个人vps上,注意配置防火墙放行相关端口。

    authToken为进行tcp链接时的认证token,这个token是用户标识,在web上登录后的api返回中可以看到json返回,也可以直接在redis中去查到某一个用户的token。

    服务端接收到这个authToken时会把对应用户tcp链接会话加入到相应房间的会话双向链表中。

    3、加入支持tcp后,如果一个房间中既有通过websocket进行链接的用户,又有通过tcp进行链接的用户,那么消息投递大致流程:

        1,首先用户登录,携带token,房间号去连接websocket,tcp服务端,在链接层建立长链接会话,

            比如用户A在房间1,通过websocket链接,用户B也在房间1,通过tcp链接。

        2,用户向房间内发送消息,目前是直接把消息通过http投到相应消息队列中,

            这个地方,其实也可以通过websocket,tcp来发,不过最终消息都是要进队列的。

        3,task层消费队列中的消息,rpc广播到websocket链接层和tcp链接层的相应房间中,

            链接层获得消息后,把消息投递到对应的远端用户(相当于遍历房间中维护的用户链接会话双向链表)




部署完成访问界面

有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:solumatephper

查看原文:Docker部署gochat聊天系统

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

947 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传