Terry-Mao/goim
是一个支持集群的im及实时推送服务。
- 轻量级
- 高性能
- 纯Golang实现
- 支持单个、多个、单房间以及广播消息推送
- 支持单个Key多个订阅者(可限制订阅者最大人数)
- 心跳支持(应用心跳和tcp、keepalive)
- 支持安全验证(未授权用户不能订阅)
- 多协议支持(websocket,tcp)
- 可拓扑的架构(job、logic模块可动态无限扩展)
- 基于Kafka做异步消息推送
$ yum -y install java-1.7.0-openjdk
kafka在官网已经描述的非常详细,在这里就不过多说明,安装、启动请查看这里.
1.下载源码(根据自己的系统下载对应的安装包)
$ cd /data/programfiles
$ wget -c --no-check-certificate https://storage.googleapis.com/golang/go1.5.2.linux-amd64.tar.gz
$ tar -xvf go1.5.2.linux-amd64.tar.gz -C /usr/local
2.配置GO环境变量 (这里我加在/etc/profile.d/golang.sh)
$ 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
1.下载goim及依赖包
$ 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 ./...
2.安装router、logic、comet、job模块(配置文件请依据实际机器环境配置)
$ cd $GOPATH/src/goim/router
$ go install
$ cp router-example.conf $GOPATH/bin/router.conf
$ cp router-log.xml $GOPATH/bin/
$ cd ../logic/
$ go install
$ cp logic-example.conf $GOPATH/bin/logic.conf
$ cp logic-log.xml $GOPATH/bin/
$ cd ../comet/
$ go install
$ cp comet-example.conf $GOPATH/bin/comet.conf
$ cp comet-log.xml $GOPATH/bin/
$ cd ../logic/job/
$ go install
$ cp job-example.conf $GOPATH/bin/job.conf
$ cp job-log.xml $GOPATH/bin/
到此所有的环境都搭建完成!
$ cd /$GOPATH/bin
nohup $GOPATH/bin/router -c $GOPATH/bin/router.conf > ~/panic-router.log 2>&1 &
nohup $GOPATH/bin/logic -c $GOPATH/bin/logic.conf > ~/panic-logic.log 2>&1 &
nohup $GOPATH/bin/comet -c $GOPATH/bin/comet.conf > ~/panic-comet.log 2>&1 &
nohup $GOPATH/bin/job -c $GOPATH/bin/job.conf > ~/panic-job.log 2>&1 &
如果启动失败,默认配置可通过查看panic-xxx.log日志文件来排查各个模块问题.
推送协议可查看push http协议文档
- 首先启动 router,无需配置
- 启动 logic,配置 router 的地址。logic 启动后会尝试连接 local job,连不上报错属正常。
- 启动 comet,配置 logic 的地址
- 利用
curl <logic>:7172/1/count?type=server
发现所有的 comet - 启动 job,配置 comet 的地址
Websocket: Websocket Client Demo
Android: Android
iOS: iOS
push http协议文档推送接口
comet 属于接入层,非常容易扩展,直接开启多个comet节点,修改配置文件中的base节点下的server.id修改成不同值(注意一定要保证不同的comet进程值唯一),前端接入可以使用LVS 或者 DNS来转发
logic 属于无状态的逻辑层,可以随意增加节点,使用nginx upstream来扩展http接口,内部rpc部分,可以使用LVS四层转发
kafka 可以使用多broker,或者多partition来扩展队列
router 属于有状态节点,logic可以使用一致性hash配置节点,增加多个router节点(目前还不支持动态扩容),提前预估好在线和压力情况
job 根据kafka的partition来扩展多job工作方式,具体可以参考下kafka的partition负载
##更多 TODO