4

Docker部署gochat聊天系统

 3 years ago
source link: https://studygolang.com/articles/32392
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Docker部署gochat聊天系统

solumatephper · 大约14小时之前 · 73 次点击 · 预计阅读时间 4 分钟 · 不到1分钟之前 开始浏览    

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 [email protected]: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 [email protected]: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链接层的相应房间中,

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


95376a841c0d7417a8ea18d0f09571f3.png
部署完成访问界面

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

280

本文来自:简书

感谢作者:solumatephper

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

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK