基于 HTTP 长连接的核心推送系统,支持集群部署。
- 双协议接入:同时支持 WebSocket 和 HTTP 长轮询两种客户端连接方式
- 集群部署:多节点通过 gRPC 自动组网,消息跨节点路由转发
- 用户分组:支持按
groupId对用户分组,可定向推送或全员广播 - REST API:提供 HTTP 接口用于发送消息、查询在线用户、集群状态等
- 自动容错:集群节点间自动握手、节点列表同步、超时用户清理
┌─────────────────────────────────────────────────────┐
│ httpPush Node │
│ │
│ ┌──────────┐ ┌──────────┐ ┌───────────────────┐ │
│ │ WS /ws │ │ EX /ex │ │ REST API │ │
│ │ WebSocket│ │ HTTP长轮询│ │ /sendmsg /query...│ │
│ └────┬─────┘ └────┬─────┘ └────────┬──────────┘ │
│ └──────────┬──┘ │ │
│ ┌───▼───┐ │ │
│ │ core │◄───────────────┘ │
│ │ App │ 用户管理 / 消息路由 │
│ └───┬───┘ │
│ │ │
│ ┌──────▼──────┐ │
│ │ cluster │ gRPC 节点通信 │
│ │ (gRPC) │ 自动组网 / 消息转发 │
│ └─────────────┘ │
└─────────────────────────────────────────────────────┘
| 模块 | 说明 |
|---|---|
main.go | 入口,加载配置,组装各模块启动 |
core | 全局状态 App、消息码头 MsgDock、查询参数 |
api | REST API 控制器,消息发送与状态查询 |
ws | WebSocket 连接管理(/ws) |
ex | HTTP 长轮询连接管理(/ex) |
cluster | 集群 gRPC 通信:握手、节点同步、消息转发、通用查询 |
message | 消息定义(TextMessage) |
user | 用户存储、分组管理、历史订单 |
util | 工具集:时间轮、队列、SliceMap、网络参数解析 |
go build -o httpPush .编辑 config.yml:
web:
server:
port: 8084# HTTP 服务端口log:
level: debugfile_path: push.logcluster:
start: true # 是否启用集群local_port: 8085# gRPC 端口(默认 HTTP端口+1)machine_id: ""# 节点 ID,留空则自动生成ex:
start: true # 是否启用 HTTP 长轮询live_time: 15# 默认长轮询超时(秒)ws:
start: true # 是否启用 WebSocket./httpPush在多台机器上分别启动 httpPush,通过 cluster.remote_host 配置相邻节点地址即可自动组网:
cluster:
start: truelocal_port: 8085remote_host: "192.168.1.2:8085,192.168.1.3:8085"节点间通过 gRPC 自动握手并同步节点列表,消息会跨节点路由到目标用户所在的机器。
ws://host:8084/ws?id=用户ID&groupId=分组1,分组2
连接建立后,客户端发送 JSON 消息给其他用户:
{"to": "目标用户ID", "msg": "消息内容"}收到推送消息格式:
[{"from": "发送者ID", "body": "消息内容"}]GET /ex?id=用户ID&groupId=分组1,分组2&liveTime=15
连接会保持至超时或有消息推送。超时后客户端需重新发起请求。liveTime 参数可覆盖默认超时时间。
| 接口 | 参数 | 说明 |
|---|---|---|
GET /sendmsg | username/id, msg | 向指定用户发送文本消息 |
GET /sendMessage | username/id, msg | 发送消息,返回 {"success": true/false} |
GET /sendGroupMsg | groupId, msg | 向分组内所有用户发送消息(groupId=all 为全员广播) |
| 接口 | 参数 | 说明 |
|---|---|---|
GET /root_version | — | 返回版本号和启动时间 |
GET /queryUser | id/username | 查询用户详细信息(连接地址、时间等) |
GET /onlineUser | — | 返回当前在线用户列表 |
GET /info_user | — | 返回集群各节点信息及总用户数 |
GET /queryOrderInfo | userId/username | 查询用户在各节点的排序信息 |
GET /queryClusterUserNum | — | 查询集群各节点用户数 |
GET /queryGroupInfo | — | 查询所有分组及成员数 |
GET /queryVersion | — | 查询集群各节点版本和启动时间 |
查询接口会自动跨集群节点聚合数据。
- go-web-frame — Web 框架
- gorilla/websocket — WebSocket 实现
- google.golang.org/grpc — gRPC 集群通信
- go.uber.org/zap — 日志库