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 | $ tar -xzf kafka_2.13-3.0.0.tgz |
第二步:启动KAFKA环境
注意:您的本地环境必须安装 Java 8+。
运行以下命令以按正确顺序启动所有服务:
1 | # Start the ZooKeeper service |
打开另一个终端会话并运行:
1 | # Start the Kafka broker service |
成功启动所有服务后,您将拥有一个基本的 Kafka 环境正在运行并可以使用。
安装Discovery
这个需要搭建好golang环境
build
1 | cd $GOPATH/src |
run
1 | ./discovery -conf discovery.toml & |
二、搭建golang环境
1.下载源码(根据自己的系统下载对应的安装包)
1 | # 建议下载压缩包安装新版本 |
2.配置GO环境变量
(这里我加在/etc/profile.d/golang.sh)
1 | $ vi /etc/profile.d/golang.sh |
3.切换镜像
1 | go env -w GO111MODULE=on |
四、部署goim
1.下载goim及依赖包
1 | $ yum install hg |
Build
1 | cd $GOPATH/src/goim |
Run
1 | make run |
到此所有的环境都搭建完成!
如果启动失败,默认配置可通过查看panic-xxx.log日志文件来排查各个模块问题.
测试
运行goim提供的example
1 | 记得修改 `client.js` 中的socket地址 |
然后用浏览器打开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
添加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
53server
{
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
修改
$GOPATH/src/goim/target/comet.toml
文件
至此就可以使用 wss://域名:3103