Terry-Mao/goim 是一个支持集群的im及实时推送服务。



特性

  • 轻量级
  • 高性能
  • 纯Golang实现
  • 支持单个、多个、单房间以及广播消息推送
  • 支持单个Key多个订阅者(可限制订阅者最大人数)
  • 心跳支持(应用心跳和tcp、keepalive)
  • 支持安全验证(未授权用户不能订阅)
  • 多协议支持(websocket,tcp)
  • 可拓扑的架构(job、logic模块可动态无限扩展)
  • 基于Kafka做异步消息推送

安装

需要开端口:1999、3101、3102、3103、3111

一、安装依赖

1
$ yum -y install java-1.8.0-openjdk

安装redis

使用宝塔安装

安装Kafka消息队列服务

第 1 步:获取 KAFKA

下载 最新的 Kafka 版本并解压:

1
2
$ tar -xzf kafka_2.13-3.0.0.tgz
$ cd kafka_2.13-3.0.0
第二步:启动KAFKA环境

注意:您的本地环境必须安装 Java 8+。

运行以下命令以按正确顺序启动所有服务:

1
2
3
# Start the ZooKeeper service
# Note: Soon, ZooKeeper will no longer be required by Apache Kafka.
$ bin/zookeeper-server-start.sh config/zookeeper.properties &

打开另一个终端会话并运行:

1
2
3
# Start the Kafka broker service
# -daemon 后台运行
$ bin/kafka-server-start.sh -daemon config/server.properties

成功启动所有服务后,您将拥有一个基本的 Kafka 环境正在运行并可以使用。

安装Discovery

这个需要搭建好golang环境

build
1
2
3
4
5
cd $GOPATH/src
# 如果无法下载就直接上传压缩包
git clone https://github.com/bilibili/discovery.git
cd discovery/cmd/discovery
go build
run
1
./discovery -conf discovery.toml &

二、搭建golang环境

1.下载源码(根据自己的系统下载对应的安装包)

1
2
3
4
# 建议下载压缩包安装新版本
# $ cd /data/programfiles
# $ wget -c --no-check-certificate https://storage.googleapis.com/golang/go1.5.2.linux-amd64.tar.gz
$ tar -xvf go1.17.2.linux-amd64.tar.gz -C /usr/local

2.配置GO环境变量
(这里我加在/etc/profile.d/golang.sh)

1
2
3
4
5
6
$ vi /etc/profile.d/golang.sh
# 将以下环境变量添加到profile最后面
export GOROOT=/usr/local/go
export PATH=$PATH:$GOROOT/bin
export GOPATH=/data/apps/go
$ source /etc/profile

3.切换镜像

1
2
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn

四、部署goim

1.下载goim及依赖包

1
2
3
4
5
6
$ yum install hg
# 如果无法下载就直接上传压缩包
# $ go get -u github.com/Terry-Mao/goim
# $ mv $GOPATH/src/github.com/Terry-Mao/goim $GOPATH/src/goim
# $ cd $GOPATH/src/goim
$ go get ./...

Build

1
2
3
cd $GOPATH/src/goim

make build

Run

1
2
3
4
5
6
7
8
9
10
11
make run
make stop

// Or use
target/logic -conf=target/logic.toml -region=sh -zone=sh001 -deploy.env=dev -weight=10
target/comet -conf=target/comet.toml -region=sh -zone=sh001 -deploy.env=dev -weight=10 addrs=127.0.0.1
target/job -conf=target/job.toml -region=sh -zone=sh001 -deploy.env=dev

// View the running process
// If no process is running, please check the logs for debugging.
ps -ef|grep target

到此所有的环境都搭建完成!

如果启动失败,默认配置可通过查看panic-xxx.log日志文件来排查各个模块问题.

测试

运行goim提供的example

1
2
3
4
# 记得修改 `client.js` 中的socket地址
cd examples/javascript

go run main.go

然后用浏览器打开http://{ip}:1999/

推送协议可查看push http协议文档

配置

TODO

例子

Websocket: Websocket Client Demo

Android: Android

iOS: iOS

文档

push http协议文档推送接口

集群

comet

comet 属于接入层,非常容易扩展,直接开启多个comet节点,修改配置文件中的base节点下的server.id修改成不同值(注意一定要保证不同的comet进程值唯一),前端接入可以使用LVS 或者 DNS来转发

logic

logic 属于无状态的逻辑层,可以随意增加节点,使用nginx upstream来扩展http接口,内部rpc部分,可以使用LVS四层转发

kafka

kafka 可以使用多broker,或者多partition来扩展队列

router

router 属于有状态节点,logic可以使用一致性hash配置节点,增加多个router节点(目前还不支持动态扩容),提前预估好在线和压力情况

job

job 根据kafka的partition来扩展多job工作方式,具体可以参考下kafka的partition负载

##更多
TODO

启用wss

  1. 添加nginx代理

    以宝塔为例 /www/server/panel/vhost/nginx/goim.conf

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    server
    {
    listen 80;
    listen 443 ssl http2;
    server_name goim.test.com;#更换域名


    #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则
    #error_page 404/404.html;
    ssl_certificate /www/server/panel/vhost/cert/goim/fullchain.pem;#修改证书地址
    ssl_certificate_key /www/server/panel/vhost/cert/goim/privkey.pem;#修改证书地址
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497 https://$host$request_uri;

    #SSL-END

    #ERROR-PAGE-START 错误页配置,可以注释、删除或修改
    #error_page 404 /404.html;
    #error_page 502 /502.html;
    #ERROR-PAGE-END

    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
    return 404;
    }

    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
    allow all;
    }

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
    expires 30d;
    error_log /dev/null;
    access_log /dev/null;
    }

    location ~ .*\.(js|css)?$
    {
    expires 12h;
    error_log /dev/null;
    access_log /dev/null;
    }
    access_log /www/wwwlogs/goim.log;
    error_log /www/wwwlogs/goim.log;
    }

    修改后记得重启nginx

  2. 修改 $GOPATH/src/goim/target/comet.toml 文件

至此就可以使用 wss://域名:3103