golang实时消息服务器插件Beaver实现可扩展的Web和移动应用通知、游戏及聊天功能
Golang实时消息服务器插件Beaver实现可扩展的Web和移动应用通知、游戏及聊天功能
Beaver简介
Beaver是一个实时消息服务器。使用Beaver,您可以轻松构建可扩展的应用内通知、实时图表、多人游戏、聊天应用、地理定位等功能,适用于Web应用和移动应用。
快速开始
在Ubuntu上运行Beaver
- 下载最新版Beaver二进制文件并使其可执行:
$ export BEAVER_LATEST_VERSION=$(curl --silent "https://api.github.com/repos/Clivern/Beaver/releases/latest" | jq '.tag_name' | sed -E 's/.*"([^"]+)".*/\1/' | tr -d v)
$ curl -sL https://github.com/Clivern/Beaver/releases/download/v{$BEAVER_LATEST_VERSION}/beaver_{$BEAVER_LATEST_VERSION}_Linux_x86_64.tar.gz | tar xz
- 安装Redis集群或单节点,并更新配置文件:
# App configs
app:
# Env mode (dev or prod)
mode: ${BEAVER_APP_MODE:-prod}
# HTTP port
port: ${BEAVER_API_PORT:-8080}
# Hostname
hostname: ${BEAVER_API_HOSTNAME:-127.0.0.1}
# TLS configs
tls:
status: ${BEAVER_API_TLS_STATUS:-off}
pemPath: ${BEAVER_API_TLS_PEMPATH:-cert/server.pem}
keyPath: ${BEAVER_API_TLS_KEYPATH:-cert/server.key}
# API Configs
api:
key: ${BEAVER_API_KEY:-6c68b836-6f8e-465e-b59f-89c1db53afca}
# Beaver Secret
secret: ${BEAVER_SECRET:-sWUhHRcs4Aqa0MEnYwbuQln3EW8CZ0oD}
# Runtime, Requests/Response and Beaver Metrics
metrics:
prometheus:
# Route for the metrics endpoint
endpoint: ${BEAVER_METRICS_PROM_ENDPOINT:-/metrics}
# Application Database
database:
# Database driver
driver: ${BEAVER_DB_DRIVER:-redis}
# Redis Configs
redis:
# Redis address
address: ${BEAVER_DB_REDIS_ADDR:-localhost:6379}
# Redis password
password: ${BEAVER_DB_REDIS_PASSWORD:- }
# Redis database
db: ${BEAVER_DB_REDIS_DB:-0}
# Log configs
log:
# Log level, it can be debug, info, warn, error, panic, fatal
level: ${BEAVER_LOG_LEVEL:-info}
# Output can be stdout or abs path to log file /var/logs/beaver.log
output: ${BEAVER_LOG_OUTPUT:-stdout}
# Format can be json
format: ${BEAVER_LOG_FORMAT:-json}
- 使用systemd运行beaver:
$ beaver api -c /path/to/config.yml
API端点示例
配置操作
创建配置:
$ curl -X POST \
-H "Content-Type: application/json" \
-H "X-API-Key: 6c68b836-6f8e-465e-b59f-89c1db53afca" \
-d '{"key":"app_name","value":"Beaver"}' \
"http://localhost:8080/api/config"
获取配置:
$ curl -X GET \
-H "Content-Type: application/json" \
-H "X-API-Key: 6c68b836-6f8e-465e-b59f-89c1db53afca" \
"http://localhost:8080/api/config/app_name"
频道操作
创建频道:
# 私有频道
$ curl -X POST \
-H 'Content-Type: application/json' \
-H 'X-API-Key: 6c68b836-6f8e-465e-b59f-89c1db53afca' \
-d '{"name": "app_x_chatroom_1", "type": "private"}' \
'http://localhost:8080/api/channel'
# 公共频道
$ curl -X POST \
-H 'Content-Type: application/json' \
-H 'X-API-Key: 6c68b836-6f8e-465e-b59f-89c1db53afca' \
-d '{"name": "app_y_chatroom_1", "type": "public"}' \
'http://localhost:8080/api/channel'
客户端操作
创建客户端并添加到频道:
$ curl -X POST \
-H 'Content-Type: application/json' \
-H 'X-API-Key: 6c68b836-6f8e-465e-b59f-89c1db53afca' \
-d '{"channels": ["app_x_chatroom_1"]}' \
'http://localhost:8080/api/client'
消息发布
发布消息到频道:
$ curl -X POST \
-H 'Content-Type: application/json' \
-H 'X-API-Key: 6c68b836-6f8e-465e-b59f-89c1db53afca' \
-d '{"channel": "app_x_chatroom_1", "data": "{\"message\": \"Hello World\"}"}' \
'http://localhost:8080/api/publish'
前端客户端示例
function Socket(url){
ws = new WebSocket(url);
ws.onmessage = function(e) { console.log(e); };
ws.onclose = function(){
// Try to reconnect in 5 seconds
setTimeout(function(){Socket(url)}, 5000);
};
}
Socket("ws://localhost:8080/ws/$ID/$TOKEN");
客户端库
- Go客户端: beavergo
贡献
我们是一个开源、社区驱动的项目,欢迎加入我们。
许可证
© 2018, Clivern。基于MIT许可证发布。
更多关于golang实时消息服务器插件Beaver实现可扩展的Web和移动应用通知、游戏及聊天功能的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang实时消息服务器插件Beaver实现可扩展的Web和移动应用通知、游戏及聊天功能的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Beaver: 可扩展的实时消息服务器插件
Beaver是一个用Go语言实现的轻量级实时消息服务器插件,专为构建可扩展的Web和移动应用通知系统、游戏聊天和实时功能而设计。
核心特性
- 高性能:基于Go语言的并发模型
- 可扩展:支持水平扩展
- 多协议支持:WebSocket、TCP、HTTP长轮询
- 消息持久化:可选的消息存储后端
- 房间/频道:支持分组通信
基本架构
package main
import (
"github.com/beaver/beaver"
"log"
)
func main() {
// 创建Beaver服务器实例
server := beaver.NewServer(&beaver.Config{
Port: 8080,
WebSocketPath: "/ws",
MaxConnections: 10000,
MessageBufferSize: 100,
})
// 注册消息处理器
server.OnMessage(func(client *beaver.Client, message []byte) {
log.Printf("Received message from %s: %s", client.ID, string(message))
// 广播给所有连接的客户端
server.Broadcast(message)
})
// 启动服务器
log.Println("Starting Beaver server on :8080")
if err := server.Start(); err != nil {
log.Fatal("Server error:", err)
}
}
客户端连接示例
package main
import (
"github.com/gorilla/websocket"
"log"
"net/url"
)
func main() {
u := url.URL{Scheme: "ws", Host: "localhost:8080", Path: "/ws"}
conn, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
if err != nil {
log.Fatal("Dial error:", err)
}
defer conn.Close()
// 发送消息
err = conn.WriteMessage(websocket.TextMessage, []byte("Hello Beaver!"))
if err != nil {
log.Println("Write error:", err)
return
}
// 接收消息
_, message, err := conn.ReadMessage()
if err != nil {
log.Println("Read error:", err)
return
}
log.Printf("Received: %s", message)
}
高级功能实现
1. 房间/频道管理
// 创建房间
gameRoom := server.CreateRoom("game-lobby")
// 客户端加入房间
server.OnConnect(func(client *beaver.Client) {
gameRoom.Join(client)
})
// 向特定房间广播
gameRoom.Broadcast([]byte("Welcome to the game lobby!"))
2. 用户认证
server.SetAuthHandler(func(token string) (string, error) {
// 验证token并返回用户ID
userID, err := ValidateToken(token)
if err != nil {
return "", err
}
return userID, nil
})
3. 消息持久化
// 使用Redis作为消息存储
storage := beaver.NewRedisStorage("localhost:6379", "")
server.SetStorage(storage)
// 存储消息
server.OnMessage(func(client *beaver.Client, message []byte) {
// 存储消息到历史记录
server.Storage.Save("chat-room", message)
// 广播消息
server.Broadcast(message)
})
性能优化技巧
- 连接池管理:
server := beaver.NewServer(&beaver.Config{
// 调整连接池大小
ReadPoolSize: 100,
WritePoolSize: 100,
})
- 消息压缩:
server.SetMessageCompression(true)
- 协议缓冲:
// 使用Protocol Buffers代替JSON
message := &pb.ChatMessage{
Sender: "user123",
Content: "Hello!",
}
data, _ := proto.Marshal(message)
server.Broadcast(data)
部署建议
- 负载均衡:使用Nginx作为反向代理
- 水平扩展:使用Redis Pub/Sub进行多节点通信
- 监控:集成Prometheus指标
// 添加监控端点
server.EnableMetrics("/metrics")
Beaver作为一个轻量级解决方案,可以轻松集成到现有系统中,为应用添加实时功能而无需复杂的架构改造。其模块化设计允许开发者根据需要选择功能,从简单的聊天系统到复杂的实时游戏后端都能胜任。