golang实时消息服务器插件Beaver实现可扩展的Web和移动应用通知、游戏及聊天功能

Golang实时消息服务器插件Beaver实现可扩展的Web和移动应用通知、游戏及聊天功能

Beaver Logo

Beaver简介

Beaver是一个实时消息服务器。使用Beaver,您可以轻松构建可扩展的应用内通知、实时图表、多人游戏、聊天应用、地理定位等功能,适用于Web应用和移动应用。

性能图表

快速开始

在Ubuntu上运行Beaver

  1. 下载最新版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
  1. 安装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}
  1. 使用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和移动应用通知系统、游戏聊天和实时功能而设计。

核心特性

  1. 高性能:基于Go语言的并发模型
  2. 可扩展:支持水平扩展
  3. 多协议支持:WebSocket、TCP、HTTP长轮询
  4. 消息持久化:可选的消息存储后端
  5. 房间/频道:支持分组通信

基本架构

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)
})

性能优化技巧

  1. 连接池管理
server := beaver.NewServer(&beaver.Config{
	// 调整连接池大小
	ReadPoolSize:  100,
	WritePoolSize: 100,
})
  1. 消息压缩
server.SetMessageCompression(true)
  1. 协议缓冲
// 使用Protocol Buffers代替JSON
message := &pb.ChatMessage{
	Sender:  "user123",
	Content: "Hello!",
}
data, _ := proto.Marshal(message)
server.Broadcast(data)

部署建议

  1. 负载均衡:使用Nginx作为反向代理
  2. 水平扩展:使用Redis Pub/Sub进行多节点通信
  3. 监控:集成Prometheus指标
// 添加监控端点
server.EnableMetrics("/metrics")

Beaver作为一个轻量级解决方案,可以轻松集成到现有系统中,为应用添加实时功能而无需复杂的架构改造。其模块化设计允许开发者根据需要选择功能,从简单的聊天系统到复杂的实时游戏后端都能胜任。

回到顶部