
appleboy/gorush基于Go语言(Golang)的Gin框架开发的推送通知微服务器。
gorush是一个轻量级的推送通知服务器,支持iOS(APNS)和Android(FCM/GCM)平台,提供高性能的推送服务。该服务器采用Go语言开发,使用Gin框架构建RESTful API,支持多平台推送、消息队列、统计监控等功能,适用于需要向移动设备发送推送通知的应用服务。
可从发布页面下载预编译二进制文件。
使用Go安装:
bash$ go get -u -v github.com/appleboy/gorush
Linux系统:
bash$ wget [***] -O gorush
OS X系统:
bash$ wget [***] -O gorush
Windows系统:
bash$ wget [***] -O gorush.exe
________ .__ / _____/ ____ _______ __ __ ______| |__ / \ ___ / _ \\_ __ \| | \/ ___/| | \ \ \_\ \( <_> )| | \/| | /\___ \ | Y \ \______ / \____/ |__| |____//____ >|___| / \/ \/ \/ Usage: gorush [options] 服务器选项: -p, --port <port> 客户端连接端口 (默认: 8088) -c, --config <file> 配置文件路径 -m, --message <message> 通知消息内容 -t, --token <token> 设备令牌 --title <title> 通知标题 --proxy <proxy> 代理URL (仅用于GCM) --pid <pid path> 进程ID文件路径 iOS选项: -i, --key <file> 证书密钥文件路径 -P, --password <password> 证书密钥密码 --topic <topic> iOS主题 --ios 启用iOS推送 (默认: false) --production iOS生产环境模式 (默认: false) Android选项: -k, --apikey <api_key> Android API密钥 --android 启用Android推送 (默认: false) 通用选项: -h, --help 显示帮助信息 -v, --version 显示版本信息
使用以下命令发送单条Android通知:
bash$ gorush -android -m="通知消息内容" -k="API密钥" -t="设备令牌"
参数说明:
-m: 通知消息内容-k: Firebase Cloud Messaging API密钥-t: 设备令牌--title: 通知标题--proxy: 设置HTTP代理URL(仅用于GCM)使用以下命令发送单条iOS通知:
bash$ gorush -ios -m="通知消息内容" -i="证书文件路径" -t="设备令牌" -topic="APNs主题"
参数说明:
-m: 通知消息内容-i: Apple推送通知证书路径(pem或p12文件)-t: 设备令牌--title: 通知标题--topic: 远程通知主题--password: 证书密码默认使用APNs开发环境。如需使用生产环境,请添加-production标志:
bash$ gorush -ios -m="通知消息内容" -i="证书文件路径" -t="设备令牌" -production
确保配置文件存在(默认config.yml),默认端口为8088:
bash$ gorush -c config.yml
使用httpie工具获取API服务器状态:
bash$ http -v --verify=no --json GET https://localhost:8088/api/stat/go
gorush提供以下API端点:
/api/stat/go - 获取Golang运行时信息(cpu, 内存, gc等)/api/stat/app - 获取通知成功和失败统计/api/config - 获取服务器配置信息/sys/stats - 获取系统状态和性能统计/metrics - 获取Prometheus指标/api/push - 发送推送通知返回Golang运行时信息,HTTP状态码200:
json{ "time": 1460686815848046600, "go_version": "go1.6.1", "go_os": "darwin", "go_arch": "amd64", "cpu_num": 4, "goroutine_num": 15, "gomaxprocs": 4, "cgo_call_num": 1, "memory_alloc": 7455192, "memory_total_alloc": 8935464, "memory_sys": ***, "memory_lookups": 17, "memory_mallocs": 31426, "memory_frees": ***, "memory_stack": 524288, "heap_alloc": 7455192, "heap_sys": 8912896, "heap_idle": 909312, "heap_inuse": 8003584, "heap_released": 0, "heap_objects": ***, "gc_next": 9754725, "gc_last": 1460686815762559700, "gc_num": 2, "gc_per_second": 0, "gc_pause_per_second": 0, "gc_pause": [ 0.326576, 0.227096 ] }
返回通知成功和失败统计信息:
json{ "version": "v1.6.2", "queue_max": 8192, "queue_usage": 0, "total_count": 77, "ios": { "push_success": 19, "push_error": 38 }, "android": { "push_success": 10, "push_error": 10 } }
返回系统状态和性能统计:
json{ "pid": 80332, "uptime": "1m42.428010614s", "uptime_sec": 102.428010614, "time": "2016-06-26 12:27:11.675973571 +0800 CST", "unixtime": ***, "status_code_count": { }, "total_status_code_count": { "200": 5 }, "count": 0, "total_count": 5, "total_response_time": "10.422441ms", "total_response_time_sec": 0.010422441000000001, "average_response_time": "2.084488ms", "average_response_time_sec": 0.0020844880000000002 }
返回Prometheus监控指标,可用于系统监控和告警。
发送推送通知的主要API端点。请求体需包含notifications数组,每个元素代表一个推送任务。
请求体参数
每个通知对象支持以下参数:
| 参数名 | 类型 | 描述 | 是否必需 | 备注 |
|---|---|---|---|---|
| tokens | 字符串数组 | 设备令牌列表 | 是 | |
| platform | 整数 | 平台类型(iOS=1, Android=2) | 是 | 1=iOS, 2=Android |
| message | 字符串 | 通知消息内容 | 否 | |
| title | 字符串 | 通知标题 | 否 | |
| priority | 字符串 | 消息优先级 | 否 | normal或high |
| content_available | 布尔值 | 数据消息是否唤醒应用 | 否 | |
| sound | 字符串 | 通知提示音类型 | 否 | |
| data | 对象 | 自定义数据 | 否 | |
| retry | 整数 | 失败重试次数 | 否 | 需小于配置中的max_retry值 |
| api_key | 字符串 | Android API密钥 | 否 | 仅Android |
| to | 字符串 | 目标设备令牌、通知密钥或主题 | 否 | 仅Android |
| collapse_key | 字符串 | 通知折叠键 | 否 | 仅Android |
| delay_while_idle | 布尔值 | 设备空闲时延迟发送 | 否 | 仅Android |
| time_to_live | 整数 | 消息在GCM存储的过期时间 | 否 | 仅Android |
| restricted_package_name | 字符串 | 应用包名 | 否 | 仅Android |
| dry_run | 布尔值 | 测试请求不实际发送 | 否 | 仅Android |
| notification | 对象 | GCM消息负载 | 否 | 仅Android |
| expiration | 整数 | 通知过期时间 | 否 | 仅iOS |
| apns_id | 字符串 | 通知唯一标识符 | 否 | 仅iOS |
| topic | 字符串 | 远程通知主题 | 否 | 仅iOS |
| badge | 整数 | 应用图标 badge 数量 | 否 | 仅iOS |
| category | 字符串 | 通知分类 | 否 | 仅iOS |
| alert | 对象 | iOS通知内容 | 否 | 仅iOS |
iOS alert payload
iOS通知alert对象支持以下参数:
| 参数名 | 类型 | 描述 | 是否必需 |
|---|---|---|---|
| title | 字符串 | 标题 | 否 |
| body | 字符串 | 消息内容 | 否 |
| subtitle | 字符串 | 副标题 | 否 |
| action | 字符串 | 操作按钮标签 | 否 |
| action-loc-key | 字符串 | 操作按钮本地化键 | 否 |
| launch-image | 字符串 | 启动图片文件名 | 否 |
| loc-args | 字符串数组 | 本地化参数 | 否 |
| loc-key | 字符串 | 本地化键 | 否 |
| title-loc-args | 字符串数组 | 标题本地化参数 | 否 |
| title-loc-key | 字符串 | 标题本地化键 | 否 |
Android notification payload
Android通知对象支持以下参数:
| 参数名 | 类型 | 描述 | 是否必需 |
|---|---|---|---|
| icon | 字符串 | 通知图标 | 否 |
| tag | 字符串 | 通知标签 | 否 |
| color | 字符串 | 图标颜色,格式#rrggbb | 否 |
| click_action | 字符串 | 点击通知的动作 | 否 |
| body_loc_key | 字符串 | 内容本地化键 | 否 |
| body_loc_args | 字符串 | 内容本地化参数 | 否 |
| title_loc_key | 字符串 | 标题本地化键 | 否 |
| title_loc_args | 字符串 | 标题本地化参数 | 否 |
iOS示例
发送普通iOS通知:
json{ "notifications": [ { "tokens": ["token_a", "token_b"], "platform": 1, "message": "Hello World iOS!" } ] }
带alert和badge的iOS通知:
json{ "notifications": [ { "tokens": ["token_a", "token_b"], "platform": 1, "badge": 5, "alert": { "title": "游戏邀请", "body": "Bob想和你玩扑克", "action-loc-key": "PLAY" } } ] }
带自定义数据的iOS通知:
json{ "notifications": [ { "tokens": ["token_a", "token_b"], "platform": 1, "message": "Hello World iOS!", "data": { "key1": "welcome", "key2": 2 } } ] }
Android示例
发送普通Android通知:
json{ "notifications": [ { "tokens": ["token_a", "token_b"], "platform": 2, "message": "Hello World Android!", "title": "您有新消息" } ] }
带notification payload的Android通知:
json{ "notifications": [ { "tokens": ["token_a", "token_b"], "platform": 2, "message": "Hello World Android!", "title": "您有新消息", "notification": { "icon": "myicon", "color": "#***" } } ] }
带自定义数据的Android通知:
json{ "notifications": [ { "tokens": ["token_a", "token_b"], "platform": 2, "message": "Hello World Android!", "title": "您有新消息", "data": { "Nick": "Mario", "body": "精彩比赛!", "Room": "PortugalVSDenmark" } } ] }
发送多条不同平台的通知:
json{ "notifications": [ { "tokens": ["token_a", "token_b"], "platform": 1, "message": "Hello World iOS!" }, { "tokens": ["token_c", "token_d"], "platform": 2, "message": "Hello World Android!" } ] }
响应体
成功响应:
json{ "success": "ok" }
错误响应状态码:
| 状态码 | 消息 | 说明 |
|---|---|---|
| 400 | Missing notifications field. | 请求缺少notifications字段 |
| 400 | Notifications field is empty. | notifications字段为空 |
| 400 | Number of notifications(50) over limit(10) | 通知数量超过限制 |
gorush使用YAML格式的配置文件,默认路径为






manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务