beauty

package module
v0.0.0-...-2eab0c0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 17, 2026 License: Apache-2.0 Imports: 18 Imported by: 0

README

Beauty Framework

Beauty is a Go-based microservices framework designed to simplify the development and deployment of microservices. It provides a unified way to create and manage different types of services including HTTP servers, gRPC servers, and cron jobs.

Prerequisites

Before using the Beauty framework, ensure you have the following installed:

  • Go 1.18 or later
  • buf for Protocol Buffers (for gRPC services)
# Install buf on macOS
brew install bufbuild/buf/buf

# Install buf on Linux
# See https://buf.build/docs/installation for more options

Installation

# Clone the repository
git clone https://github.com/rushteam/beauty.git

# Install the Beauty CLI tool
cd beauty/tools
go install ./cmd/beauty

Creating a New Project

You can create a new project using the Beauty CLI tool:

# Create a new project
beauty new my-service

The CLI will prompt you to enter:

  • Project module name (Go module path)
  • Web framework choice (chi or gin)
快速开始
# 创建新项目
beauty new my-service

# 进入项目目录
cd my-service

# 安装依赖
go mod tidy

# 生成 gRPC 代码(如果有 .proto 文件)
make generate

# 运行项目
go run main.go

Project Structure

Beauty 框架采用统一的项目结构,支持 HTTP、gRPC 和 Cron 三种服务类型:

my-service/
├── api/                    # Protocol Buffers 定义
│   ├── user.proto
│   └── v1/
│       ├── user.pb.go
│       ├── user_grpc.pb.go
│       └── user.pb.gw.go
├── buf.gen.yaml           # buf 代码生成配置
├── buf.yaml               # buf 项目配置
├── config/                # 配置文件
│   └── dev/
│       └── app.yaml
├── go.mod
├── main.go                # 应用入口
├── Makefile               # 构建脚本
├── scripts/               # 工具脚本
│   └── generate.sh
└── internal/              # 内部代码
    ├── config/            # 配置管理
    │   └── config.go
    ├── endpoint/          # 服务端点
    │   ├── grpc/          # gRPC 服务
    │   │   └── server.go
    │   ├── handlers/      # HTTP 处理器
    │   │   ├── user.go
    │   │   └── health.go
    │   ├── job/           # 定时任务
    │   │   └── cron.go
    │   └── router/        # HTTP 路由
    │       ├── http.go
    │       ├── middleware.go
    │       └── router.go
    └── infra/             # 基础设施
        ├── conf/          # 配置加载
        │   └── conf.go
        ├── logger/        # 日志
        │   └── logger.go
        ├── middleware/    # 中间件
        │   └── middleware.go
        └── registry/      # 服务注册
            └── registry.go

核心特性

  • 多协议支持: HTTP、gRPC、Cron 三种服务类型
  • 代码生成: 基于 Protocol Buffers 自动生成 gRPC 代码
  • 服务发现: 支持多种注册中心(etcd / nacos / consul / polaris / k8s),gRPC 与 HTTP 客户端均内置服务发现 + 负载均衡(轮询 / 加权轮询 / 随机)+ 重试换节点
  • 配置中心: 统一 conf.New(url) 接入本地文件与远程配置,支持热加载
  • 中间件: recovery、cors、compress、health、auth、限流、熔断、超时
  • 实时推送: 内置 SSE(pkg/sse)与 WebSocket(pkg/ws)封装,开箱即用
  • 实时服务原语: 53 个可独立组合的实时组件(会话/在场/路由/匹配/排名/调度/钱包/审计/通知/事务/Saga/负载均衡/幂等/延迟队列/状态机/ID 生成/直播 PK/计数聚合/寻路/细粒度锁/连击热度/空间索引/退避重试/事件总线/地理编码/抽卡/冷却/环形缓冲/位图/任务成就/等级/小红点等),纯标准库实现;其中 counter/cooldown/idempotency 可通过 WithStorepkg/kvstore(Redis 等)实现跨实例状态共享,从单机原语升级为多实例生产可用。详见下文 Realtime Components
  • 流程编排: 轻量 DAG 执行器(pkg/dag),拓扑分层 + 层内并行
  • 可观测性: 内置 OpenTelemetry 链路追踪与指标收集(HTTP/gRPC 请求指标由 otelhttp/otelgrpc 自动采集)
  • 动态日志: 运行时通过 HTTP 接口调整日志级别,无需重启

Configuration

The framework uses YAML configuration files. The default configuration file is located at config/config.yaml:

app: my-service
http:
  addr: :8080
log:
  level: info
  format: text

Creating Services

Beauty supports multiple types of services:

HTTP Server
import (
    "net/http"
    "github.com/rushteam/beauty"
    "github.com/go-chi/chi/v5"
)

func main() {
    r := chi.NewRouter()
    r.Get("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello, World!"))
    })

    app := beauty.New(
        beauty.WithWebServer(
            ":8080",
            r,
            beauty.WithServiceName("my-http-service"),
        ),
    )

    if err := app.Start(context.Background()); err != nil {
        log.Fatalln(err)
    }
}
gRPC Server
import (
    "context"
    "github.com/rushteam/beauty"
    "google.golang.org/grpc"
    pb "your-project/api/v1"
)

type GreeterServer struct {
    pb.UnimplementedGreeterServer
}

func (s *GreeterServer) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Hello " + req.Name}, nil
}

func main() {
    app := beauty.New(
        beauty.WithGrpcServer(
            ":50051",
            func(s *grpc.Server) {
                pb.RegisterGreeterServer(s, &GreeterServer{})
            },
            beauty.WithServiceName("my-grpc-service"),
        ),
    )

    if err := app.Start(context.Background()); err != nil {
        log.Fatalln(err)
    }
}
Cron Jobs
import (
    "context"
    "github.com/rushteam/beauty"
    "github.com/rushteam/beauty/pkg/service/cron"
)

func main() {
    app := beauty.New(
        beauty.WithCrontab(
            cron.WithJob("@every 1m", func(ctx context.Context) error {
                // Your job logic here
                return nil
            }),
        ),
    )

    if err := app.Start(context.Background()); err != nil {
        log.Fatalln(err)
    }
}
多实例部署:只在 leader 上跑(避免重复执行)

多实例部署下,默认每个实例都会各跑一遍定时任务(重复发奖/重复扣款/重复生成报表)。 用 cron.WithLeaderElector 接入分布式选主,只有当选 leader 的实例会运行任务:

import (
    clientv3 "go.etcd.io/etcd/client/v3"
    "github.com/rushteam/beauty/pkg/infra/etcd"
    "github.com/rushteam/beauty/pkg/service/cron"
)

client, _ := clientv3.New(clientv3.Config{Endpoints: []string{"127.0.0.1:2379"}})
elector := etcd.NewDLock(client) // 基于 etcd 官方 concurrency 包(Session+Election)

app := beauty.New(
    beauty.WithCrontab(
        cron.WithCronHandler("@every 1m", myJob),
        cron.WithLeaderElector(elector, "myservice-cron"), // 同一组实例用同一个 key
    ),
)

失去 leader 身份(进程崩溃/网络分区)时任务立即停止,其余实例自动接管——由 etcd session 租约保证最终只有一个实例在跑。不配置此项时行为不变。单实例部署/本地开发 可用 pkg/dlock.NewMemory() 模拟选举,见 examples/cron-leader

部署在 k8s 里,不想额外运维 etcd? 用集群自带的选主能力(同一套 coordination.k8s.io/v1 Lease 机制,kube-scheduler 等控制面组件也在用):

import (
    "k8s.io/client-go/rest"
    "k8s.io/client-go/kubernetes"
    beautyk8s "github.com/rushteam/beauty/pkg/infra/k8s"
)

config, _ := rest.InClusterConfig()
client, _ := kubernetes.NewForConfig(config)
elector := beautyk8s.NewElector(client.CoordinationV1(), beautyk8s.WithNamespace("default"))

app := beauty.New(
    beauty.WithCrontab(
        cron.WithCronHandler("@every 1m", myJob),
        cron.WithLeaderElector(elector, "myservice-cron"),
    ),
)

pkg/infra/k8s.Elector 只实现选主(不实现 Locker——k8s 的 leaderelection 语义 本就是"持续参选",没有通用一次性互斥锁原语)。

Service Registration and Discovery

Beauty supports service registration and discovery using etcd or nacos:

import (
    "github.com/rushteam/beauty"
    "github.com/rushteam/beauty/pkg/service/discover/etcdv3"
)

func main() {
    app := beauty.New(
        // Your services here...
        beauty.WithRegistry(etcdv3.NewRegistry(&etcdv3.Config{
            Endpoints: []string{"127.0.0.1:2379"},
            Prefix: "/beauty",
        })),
    )

    if err := app.Start(context.Background()); err != nil {
        log.Fatalln(err)
    }
}
Using DSN
// etcd DSN
a, _ := grpcclient.New(
    context.Background(),
    grpcclient.WithAddr("etcd://user:pass@127.0.0.1:2379/beauty?ttl=10&dial_ms=3000#helloworld.rpc"),
)

// nacos DSN (supports cluster/group/namespace/app_name/weight)
a, _ := grpcclient.New(
    context.Background(),
    grpcclient.WithAddr("nacos://127.0.0.1:8848/helloworld.rpc?app_name=test&cluster=DEFAULT&group=DEFAULT_GROUP"),
)

Tracing and Metrics

Beauty provides built-in support for OpenTelemetry tracing and metrics:

import (
    "github.com/rushteam/beauty"
    "github.com/rushteam/beauty/pkg/service/telemetry"
    "go.opentelemetry.io/otel/exporters/prometheus"
)

func main() {
    metricExporter, err := prometheus.New()
    if err != nil {
        panic(err)
    }

    app := beauty.New(
        // Your services here...
        beauty.WithTrace(), // Enable tracing
        beauty.WithMetric(telemetry.WithMetricReader(metricExporter)), // Enable metrics
    )

    if err := app.Start(context.Background()); err != nil {
        log.Fatalln(err)
    }
}

HTTP/gRPC 请求指标由内置的 otelhttp/otelgrpc instrumentation 自动产出,Go runtime 指标(goroutine、GC、heap)默认开启(telemetry.WithoutMetricRuntime() 可关闭)。生产环境通常用 OTLP 出口:

beauty.WithTrace(telemetry.WithTraceOTLPGRPCExporter()),   // OTLP/gRPC,默认读 OTEL_EXPORTER_OTLP_* 环境变量
beauty.WithMetric(telemetry.WithMetricOTLPGRPCReader()),   // 指标周期上报到 Collector

Exemplars(指标↔链路关联)默认按 trace_based 启用——在已采样的 trace 上下文中产生的指标会带上 trace_id,可在 Grafana 从延迟直方图直接跳到对应 trace。OTLP exporter 默认导出 exemplar;Prometheus 需以 OpenMetrics 格式抓取。可用 telemetry.WithMetricExemplarFilter(exemplar.AlwaysOffFilter) 关闭,或通过环境变量 OTEL_METRICS_EXEMPLAR_FILTER 配置。

Running Multiple Services

Beauty allows you to run multiple services in a single application:

func main() {
    app := beauty.New(
        beauty.WithWebServer(":8080", httpHandler, beauty.WithServiceName("web-service")),
        beauty.WithGrpcServer(":50051", grpcRegistrar, beauty.WithServiceName("grpc-service")),
        beauty.WithCrontab(cronOptions...),
    )

    if err := app.Start(context.Background()); err != nil {
        log.Fatalln(err)
    }
}

Lifecycle Hooks

You can add hooks to be executed at different stages of the application lifecycle:

app := beauty.New(
    // Your services here...
)

// Add a hook to be executed before the application starts
app.Hook(beauty.EventBeforeRun, func(app *beauty.App) {
    // Your code here
})

// Add a hook to be executed after the application stops
app.Hook(beauty.EventAfterRun, func(app *beauty.App) {
    // Your cleanup code here
})

Complete Example

Here's a complete example that combines multiple services:

package main

import (
    "context"
    "log"
    "net/http"

    "github.com/go-chi/chi/v5"
    "github.com/rushteam/beauty"
    "github.com/rushteam/beauty/pkg/service/discover/etcdv3"
    "github.com/rushteam/beauty/pkg/service/telemetry"
    "google.golang.org/grpc"
    pb "your-project/api/v1"
)

type GreeterServer struct {
    pb.UnimplementedGreeterServer
}

func (s *GreeterServer) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Hello " + req.Name}, nil
}

func main() {
    // HTTP Router
    r := chi.NewRouter()
    r.Get("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello, World!"))
    })

    app := beauty.New(
        // HTTP Service
        beauty.WithWebServer(
            ":8080",
            r,
            beauty.WithServiceName("my-http-service"),
        ),
        
        // gRPC Service
        beauty.WithGrpcServer(
            ":50051",
            func(s *grpc.Server) {
                pb.RegisterGreeterServer(s, &GreeterServer{})
            },
            beauty.WithServiceName("my-grpc-service"),
        ),
        
        // Service Registry
        beauty.WithRegistry(etcdv3.NewRegistry(&etcdv3.Config{
            Endpoints: []string{"127.0.0.1:2379"},
            Prefix: "/beauty",
        })),
        
        // Tracing
        beauty.WithTrace(),
    )

    if err := app.Start(context.Background()); err != nil {
        log.Fatalln(err)
    }
}

Configuration Center

Beauty 支持统一的配置加载接口,通过 URL scheme 切换本地文件与远程配置中心:

import (
    "github.com/rushteam/beauty/pkg/conf"
    _ "github.com/rushteam/beauty/pkg/infra/etcd"   // 注册 etcd scheme
    _ "github.com/rushteam/beauty/pkg/infra/nacos"  // 注册 nacos scheme
)

// 本地文件
loader, _ := conf.New("config/app.yaml")

// etcd 远程配置
loader, _ := conf.New("etcd://127.0.0.1:2379/myapp/config.yaml")

// nacos 远程配置
loader, _ := conf.New("nacos://127.0.0.1:8848/myapp.yaml?namespace=dev")

var cfg AppConfig
loader.Unmarshal(&cfg)

// 热加载
loader.Watch(ctx, func() {
    loader.Unmarshal(&cfg)
})

支持 etcd / nacos / consul / polaris,详见 docs/configuration.md

Dynamic Log Level

运行时通过 HTTP 接口动态调整日志级别,无需重启:

import "github.com/rushteam/beauty/pkg/service/logger"

// 挂载管理接口
mux.Handle("/debug/loglevel", logger.LevelHandler())

// 代码方式
logger.SetLevelByName("debug")
# 查询当前级别
curl http://localhost:8080/debug/loglevel

# 临时开启 debug
curl -X PUT http://localhost:8080/debug/loglevel -d '{"level":"debug"}'

详见 docs/logger.md

Built-in Middleware

中间件 说明
Recovery middleware/recovery panic 捕获,返回 500,支持自定义上报
CORS middleware/cors 跨域处理,支持细粒度配置
Compress middleware/compress gzip 响应压缩,按 minSize 控制
Health middleware/health /healthz 存活 + /readyz 就绪探针
Auth middleware/auth JWT/静态 Token 认证,可扩展
RateLimit middleware/ratelimit 令牌桶限流,支持按 IP/用户/自定义键
CircuitBreaker middleware/circuitbreaker 三态熔断器
Timeout middleware/timeout 请求超时 + 慢请求检测

详见 docs/middleware-builtin.mddocs/middleware-summary.md

HTTP Server Options

beauty.WithWebServer(":8080", handler,
    webserver.WithServiceName("api"),
    webserver.WithReadTimeout(30 * time.Second),
    webserver.WithWriteTimeout(30 * time.Second),
    webserver.WithIdleTimeout(90 * time.Second),
    webserver.WithShutdownTimeout(30 * time.Second),
    webserver.WithTLS("cert.pem", "key.pem"),   // 启用 HTTPS
    webserver.WithMiddleware(myMiddleware),
)

gRPC Server Options

beauty.WithGrpcServer(":9090", register,
    grpcserver.WithServiceName("rpc"),
    grpcserver.WithGrpcServerUnaryInterceptor(myInterceptor),
    grpcserver.WithGracefulStopTimeout(10 * time.Second),
    grpcserver.WithTLS("cert.pem", "key.pem"),
    // Keepalive 参数已内置合理默认值
)

Realtime Components

beauty 在 pkg/ws / pkg/sse 之上提供一组可独立组合的实时服务原语,覆盖长连接会话、在线状态、消息路由、匹配组队、排行榜、任务调度、虚拟账户、操作审计、离线通知、周期榜单、临时小队、版本化存储、社交图谱、频道历史、会话令牌、DB 错误翻译、可靠 Webhook、断线重连、状态广播、短期 TTL KV、跨域事务等典型场景。均为纯标准库实现,遵循 beauty 风格(泛型 + 函数式 Option + 中文 doc)。

包按"通用 vs 业务"分两个命名空间:

  • pkg/ — 通用实时原语(不预设业务语义)
  • pkg/domain/ — 业务实体(预设了业务模型:货币 / 通知 / 小队 / 赛季榜 / 存档 / 社交 / 频道)
通用原语(pkg/)
一句话 典型场景
pkg/match 有状态实时会话原语(actor 模型) 游戏房间 / 权威对战 / 协作编辑
pkg/ws/session WebSocket 有状态会话高阶封装 长连接业务 / IM 单聊
pkg/presence 在线状态双索引 + 事件总线 频道成员 / 在线广播 / 候选池
pkg/router 多语义消息路由 + 攒批 群发 / 定点投递 / 批量下发
pkg/leaderboard 排行榜内存排名缓存(堆排序) "我的名次" / TopN 高频读
pkg/scheduler 工作池 + 运行时 Pause/Resume 发奖 / 批量通知 / 过期清理
pkg/matchmaker 基于属性匹配的组队 PVP 组队 / 匹配大厅
pkg/audit 操作审计(仅记成功 + 异步落盘) 合规 / 运维审计
pkg/token dual token(JWT HS256)+ 黑名单注销 登录态签发 / 续签 / 踢出
pkg/dberr DB 错误码翻译(DB-agnostic → *Status) 仓储层错误归一为业务码
pkg/webhook 事件通知 + 幂等去重 + DLQ 外部系统回调 / at-least-once
pkg/resume 断线重连在场还原(token + presence) 掉线不掉状态 / 自动重连
pkg/presence/status 状态变化广播给关注者 好友上下线通知 / status event
pkg/ephemeral 短期 TTL KV(纯内存 + 过期清扫) 验证码 / 临时数据 / 缓存
pkg/afterwork 请求级后台任务延寿(waitUntil 语义) 响应后发邮件 / 写审计 / 触发 webhook
pkg/handler 声明式 HTTP handler 包装器 业务函数只写 (ctx,req)=>(resp,err)
pkg/ratelimit 按键限流(令牌桶 + 滑动窗口)+ HTTP 中间件 防刷屏 / API 限流 / 按用户/IP 隔离
pkg/txn 跨域事务协调(两阶段提交 Prepare/Commit/Rollback) 扣钱包+写存档 原子化 / 任一失败全回滚
pkg/saga 跨服务 Saga 编排(顺序正向 + 逆序补偿 + 重试) 抽卡/下单/兑换 等跨服务最终一致
pkg/loadbalance 负载均衡算法(一致性哈希 + 平滑加权轮询 + 轮询) 会话粘性 / 带状态分片 / 按容量分发
pkg/idempotency 幂等执行(去重 + singleflight 并发合并 + TTL)· 可接 Store 跨实例 防重复扣款/发奖 / 请求去重 / 缓存击穿保护
pkg/kvstore 带 TTL 的原子 KV 存储接口 + 内存实现 counter/cooldown/idempotency 的跨实例后端(Redis 实现自备)
pkg/dlock 跨进程分布式锁 + 选主接口 + 内存实现 多实例互斥执行 / Cron 只在 leader 跑(后端见 pkg/infra/etcd.DLock / pkg/infra/k8s.Elector)
pkg/delayqueue 定点单次延迟触发(最小堆 + 可取消/改期) 开局倒计时 / buff 到期 / 订单超时 / 匹配兜底
pkg/fsm 泛型有限状态机(转移校验 + Enter/Leave 钩子) 对局/房间/订单状态流转 / 防非法跳转
pkg/idgen 分布式唯一 ID(Snowflake,64 位趋势递增) 对局 ID / 订单号 / 消息序号 / 数据库主键
pkg/counter 滑动窗口计数 / 时间窗配额 · 可接 Store 跨实例 每日抽卡上限 / 分钟弹幕限频 / 防刷
pkg/tally 高频累计聚合 + 批量刷写 直播点赞/刷礼物 / 埋点计数(削写放大)
pkg/versus 限时多方对抗计分(倒计时 + 定胜负 + 事件流) 直播 PK / 团战 / 答题赛 / 拉票
pkg/pathfind 网格 A* 寻路(障碍 + 权重 + 对角) 塔防 / SLG / 点击移动 / 怪物追击
pkg/keyedmutex 按 key 的细粒度锁(引用计数自动回收) 同账户/房间/订单串行 · 不同实体并行
pkg/momentum 连击 + 热度时间衰减(半衰期指数冷却) 直播连击特效 / 实时热度榜
pkg/spatial 网格空间索引(Nearby / KNN) 附近的人 / MMO AOI / 大地图分区
pkg/backoff 指数退避 + 抖动重试(Full/Equal/None) 重试可靠性 · 打散重试风暴
pkg/eventbus 泛型进程内事件总线(按主题 + 回调) 模块间事件解耦 · 一事件多订阅者
pkg/geohash 经纬度地理编码(编码/邻居/覆盖查询/距离) LBS 附近的人/店铺(前缀检索)
pkg/loot 加权随机抽取(Alias O(1) + 保底 + 不放回) 抽卡 / 开宝箱 / 掉落 / 直播抽奖
pkg/cooldown 按 key 的冷却(Ready/Remaining/TryTrigger) · 可接 Store 跨实例 技能 CD / 每日领取 / 发言间隔 / 防连点
pkg/ringbuffer 定长环形缓冲(覆盖最旧 + O(1) 追加) 最近 N 条弹幕 / 战绩 / 滚动日志
pkg/bitmap 位图(Set/Count/And/Or + 连续签到) 千万级签到 / 精确去重 / 权限位
pkg/questlog 任务/成就进度(阈值达成+依赖+领取+重置) 每日任务 / 成就 / 通行证 / 新手引导
pkg/leveling 经验/等级曲线(线性/多项式/查表) 角色升级 / 主播等级 / VIP / 亲密度
pkg/reddot 小红点未读聚合树(父节点自动汇总) App 红点 / 未读汇总 / 分类提示
pkg/ctxkey 类型安全 context key(泛型 Key[T] 统一各包 contextKey 定义 / 防 key 冲突
业务实体(pkg/domain/)
一句话 典型场景
pkg/domain/wallet 不可变账本 + 余额派生(差值更新)+ txID 幂等 虚拟货币 / 积分 / 库存 / 防重复扣款
pkg/domain/notification 持久/瞬时二分 + 离线拉取 离线消息 / 系统通知
pkg/domain/tournament 锦标赛(leaderboard + cron 重置) 赛季榜 / 每日挑战
pkg/domain/party 无权威小队(Leader + 加入审核) 好友开黑 / 临时小队
pkg/domain/storage 版本化 KV + OCC 乐观锁 游戏存档 / 用户配置
pkg/domain/relationship 社交图谱(二部有向图 + 状态编码) 好友 / 关注 / 拉黑 / 群组
pkg/domain/chat 频道持久消息 + 游标分页 IM 频道历史 / 翻页
pkg/domain/inbox 收件箱(序列号游标 + 已读状态) 私信 / 系统收件箱
pkg/domain/group 群组(成员 + 封禁 + 角色) 群聊 / 公会 / 兴趣小组

各包各司其职,无强耦合:可以只用 ws/session 做一个 echo 房间,也可以把 presence + router + ws/session 串起来做一个 IM 频道,用 match + matchmaker 做权威对战大厅,再用 domain/wallet + domain/notification + audit 补齐账户、通知与合规,用 txn 把跨域写操作原子化。每个包在 examples/<name>/ 下都有可运行的 demo。

组合示例:examples/live-pkversus + idempotency + counter + tally + keyedmutex + eventbus + idgen 搭了一个多房间直播 PK 后端(多局并行 + 送礼幂等去重 + 配额防刷 + 实时比分 SSE + 点赞高频聚合 + 全局 PK 生命周期事件),展示原语如何协作。

详见 docs/realtime-components.md

Documentation

文档 内容
docs/configuration.md 配置系统:文件 + 远程配置中心 + 热加载
docs/logger.md 动态日志级别
docs/middleware-builtin.md recovery / cors / compress / health
docs/middleware-summary.md auth / ratelimit / circuitbreaker / timeout 组合使用
docs/error-codes.md 结构化错误码:业务 Code / HTTP / gRPC 三层映射、Details、渐进式迁移
docs/sse.md Server-Sent Events 推送封装:自动设头 / 写超时 / flush / 断连处理
docs/websocket.md WebSocket 封装(coder/websocket):升级 / JSON / 子协议 / 心跳保活
docs/dag.md DAG 执行器:拓扑分层、层内并行、panic 安全、错误策略
docs/metadata-propagation.md 服务间 metadata 透传 + OTel trace 传播协议(W3C/B3)
docs/grpc-service-discovery.md 服务注册与发现
docs/grpc-client-discovery.md gRPC 客户端发现
docs/http-client-discovery.md HTTP 客户端服务发现(RoundTripper + 负载均衡 + 重试换节点)
docs/auth-ratelimit.md 认证与限流详解
docs/realtime-components.md 实时服务原语总览(53 个组件速查 + 组合范式 + 互补关系表)

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Go

func Go(f func())

Types

type App

type App struct {
	// contains filtered or unexported fields
}

App ..

func New

func New(opts ...Option) *App

New ..

func (*App) Hook

func (app *App) Hook(stage HookEvent, fn HookFunc)

Hook add a hook func to stage

func (*App) Ready

func (s *App) Ready() bool

func (*App) Start

func (s *App) Start(ctx context.Context) error

Start ..

type HookEvent

type HookEvent int
const (
	//EventBeforeRun ..
	EventBeforeRun HookEvent = iota
	//EventAfterRun ..
	EventAfterRun
)

type HookFunc

type HookFunc func(app *App)

HookFunc ..

type Option

type Option func(app *App)

Option ..

func WithComponent

func WithComponent(c core.Component) Option

func WithConfig

func WithConfig[T any](loader conf.Loader, onChange func(cfg *T)) Option

WithConfig 把配置接入应用生命周期:构造时用 loader 首次加载并回调 onChange, 随后随应用运行 Watch 配置变更、每次变更重新加载并回调;应用关闭时停止 Watch。

onChange 收到反序列化好的最新配置(每次都是新实例),在其中应用即可:

loader, _ := conf.New("etcd://127.0.0.1:2379/app/config.yaml")
var current atomic.Pointer[AppConfig]
app := beauty.New(
    beauty.WithConfig(loader, func(c *AppConfig) { current.Store(c) }),
    beauty.WithWebServer(":8080", mux),
)

远程坏配置不会覆盖上一份可用值(见 pkg/conf 的先校验后提交)。

func WithCrontab

func WithCrontab(opts ...cron.CronOptions) Option

func WithGrpcServer

func WithGrpcServer(addr string, handler func(*grpc.Server), opts ...grpcserver.Option) Option

func WithMetric

func WithMetric(opts ...telemetry.MetricOption) Option

func WithPprof

func WithPprof(opts ...pprof.Option) Option

WithPprof 启动一个独立的 pprof HTTP 服务,默认监听 127.0.0.1:6060。 仅在需要线上排查时挂载,生产环境建议通过 SSH 隧道访问而非对外暴露。

func WithRegistry

func WithRegistry(r discover.Registry) Option

func WithService

func WithService(s Service) Option

WithService ..

func WithShutdownDrainDelay

func WithShutdownDrainDelay(d time.Duration) Option

WithShutdownDrainDelay 设置优雅退出时"先注销、再停服"之间的排空等待。 关闭时框架会先从注册中心注销实例,等待该时长让客户端/负载均衡感知到下线, 再开始停止服务端,从而避免关闭瞬间仍有新请求被路由到本实例(滚动发布零停机)。 默认 0:仍保证"先注销后停服"的顺序,只是不额外等待。 仅对实现了 discover.Service 并配置了 registry 的服务生效。

func WithTrace

func WithTrace(opts ...telemetry.TraceOption) Option

func WithWebServer

func WithWebServer(addr string, mux http.Handler, opts ...webserver.Option) Option

type ReadyNotifier

type ReadyNotifier interface {
	Ready() <-chan struct{}
}

ReadyNotifier is an optional interface a Service can implement to signal that it is ready to accept traffic (e.g. port is listening). startService waits for this signal before registering with the registry.

type Service

type Service interface {
	Start(ctx context.Context) error
	String() string
}

Service ..

type ServiceKind

type ServiceKind interface {
	Kind() string
}

Directories

Path Synopsis
examples
afterwork command
afterwork + handler 示例:声明式 handler + 响应后副作用。
afterwork + handler 示例:声明式 handler + 响应后副作用。
audit command
audit 示例:操作审计,仅记成功请求。
audit 示例:操作审计,仅记成功请求。
backoff command
backoff 示例:指数退避 + 抖动重试。
backoff 示例:指数退避 + 抖动重试。
bitmap command
bitmap 示例:签到统计。
bitmap 示例:签到统计。
chat command
chat 示例:频道消息持久化 + 游标分页历史拉取。
chat 示例:频道消息持久化 + 游标分页历史拉取。
clan command
clan 示例:用现有原语组合出"公会"语义,不新增包。
clan 示例:用现有原语组合出"公会"语义,不新增包。
complete/example/api/v1
Package v1 is a reverse proxy.
Package v1 is a reverse proxy.
config command
配置热加载示例:beauty.WithConfig 接入文件/远程配置,变更自动重载。
配置热加载示例:beauty.WithConfig 接入文件/远程配置,变更自动重载。
cooldown command
cooldown 示例:技能冷却 / 操作限时。
cooldown 示例:技能冷却 / 操作限时。
counter command
counter 示例:滑动窗口计数 / 时间窗配额。
counter 示例:滑动窗口计数 / 时间窗配额。
cron-leader command
cron-leader 示例:多实例部署下,Cron 只在选主当选的实例上跑。
cron-leader 示例:多实例部署下,Cron 只在选主当选的实例上跑。
dag command
DAG 示例:build -> [test, lint 并行] -> deploy。
DAG 示例:build -> [test, lint 并行] -> deploy。
dberr command
dberr 示例:把数据库错误翻译为带业务码的 *Status。
dberr 示例:把数据库错误翻译为带业务码的 *Status。
delayqueue command
delayqueue 示例:定点单次延迟触发。
delayqueue 示例:定点单次延迟触发。
ephemeral command
ephemeral 示例:短期 TTL KV(验证码 / 临时数据 / 缓存)。
ephemeral 示例:短期 TTL KV(验证码 / 临时数据 / 缓存)。
eventbus command
eventbus 示例:进程内按主题分发的事件总线。
eventbus 示例:进程内按主题分发的事件总线。
featureflag command
Feature Flag 示例:百分比灰度 + 属性定向 + A/B 实验。
Feature Flag 示例:百分比灰度 + 属性定向 + A/B 实验。
fsm command
fsm 示例:有限状态机(对局生命周期)。
fsm 示例:有限状态机(对局生命周期)。
gameloop command
gameloop lockstep demo:基于 beauty 原语搭一个「帧同步」服务端骨架。
gameloop lockstep demo:基于 beauty 原语搭一个「帧同步」服务端骨架。
geohash command
geohash 示例:经纬度地理编码 + 附近检索。
geohash 示例:经纬度地理编码 + 附近检索。
group command
group + inbox + ratelimit 示例:群组离线私聊。
group + inbox + ratelimit 示例:群组离线私聊。
grpc-xds-client command
xDS 客户端示例:通过 xds:///service 目标,由 xDS 控制平面(如 Istio/istiod) 下发端点与负载均衡策略。
xDS 客户端示例:通过 xds:///service 目标,由 xDS 控制平面(如 Istio/istiod) 下发端点与负载均衡策略。
hls command
hls demo:用 pkg/hls 起一个直播 origin,挂在 webserver 上,后台每 2s 喂一个 合成分片(内容是占位字节,非真实 TS——本示例只演示 origin 的播放列表/分片分发, 不涉及编解码)。
hls demo:用 pkg/hls 起一个直播 origin,挂在 webserver 上,后台每 2s 喂一个 合成分片(内容是占位字节,非真实 TS——本示例只演示 origin 的播放列表/分片分发, 不涉及编解码)。
http-service-discovery command
http-service-discovery 示例:HTTP 客户端 + 服务发现 + 负载均衡。
http-service-discovery 示例:HTTP 客户端 + 服务发现 + 负载均衡。
idempotency command
idempotency 示例:幂等执行(去重 + 并发合并)。
idempotency 示例:幂等执行(去重 + 并发合并)。
idgen command
idgen 示例:分布式唯一 ID(Snowflake)。
idgen 示例:分布式唯一 ID(Snowflake)。
keyedmutex command
keyedmutex 示例:按 key 的细粒度锁。
keyedmutex 示例:按 key 的细粒度锁。
kvstore-shared command
kvstore-shared 示例:让 counter/cooldown/idempotency 跨实例共享状态。
kvstore-shared 示例:让 counter/cooldown/idempotency 跨实例共享状态。
leaderboard command
leaderboard 示例:排行榜内存缓存 + "我的名次"查询。
leaderboard 示例:排行榜内存缓存 + "我的名次"查询。
leveling command
leveling 示例:经验 / 等级曲线。
leveling 示例:经验 / 等级曲线。
live-hls command
live-hls demo:端到端直播——RTMP 采集 → remux(FLV→MPEG-TS)→ HLS 分发,全程不转码。
live-hls demo:端到端直播——RTMP 采集 → remux(FLV→MPEG-TS)→ HLS 分发,全程不转码。
live-multi command
live-multi demo:多路直播——一个 RTMP 端口收多路流,按 streamKey 各自成流、各自分发, 用 pkg/media.Hub 做多路管理 + OTel 指标。
live-multi demo:多路直播——一个 RTMP 端口收多路流,按 streamKey 各自成流、各自分发, 用 pkg/media.Hub 做多路管理 + OTel 指标。
live-pk command
live-pk 组合 demo:多房间直播 PK 后端,展示多个原语如何协作。
live-pk 组合 demo:多房间直播 PK 后端,展示多个原语如何协作。
live-transcode command
live-transcode demo:拓扑 A —— beauty 收 RTMP,把流管道喂给 ffmpeg 转码成多码率 (ABR)HLS,再用 pkg/hls.Master 组主清单分发。
live-transcode demo:拓扑 A —— beauty 收 RTMP,把流管道喂给 ffmpeg 转码成多码率 (ABR)HLS,再用 pkg/hls.Master 组主清单分发。
loadbalance command
loadbalance 示例:一致性哈希(会话粘性)+ 平滑加权轮询(按容量分发)。
loadbalance 示例:一致性哈希(会话粘性)+ 平滑加权轮询(按容量分发)。
loot command
loot 示例:加权随机抽卡(含保底)。
loot 示例:加权随机抽卡(含保底)。
match command
match 示例:一个 20Hz tick 的 echo 房间。
match 示例:一个 20Hz tick 的 echo 房间。
matchmaker command
matchmaker 示例:按属性匹配组队。
matchmaker 示例:按属性匹配组队。
momentum command
momentum 示例:连击 + 热度时间衰减。
momentum 示例:连击 + 热度时间衰减。
notification command
notification 示例:离线通知队列,上线拉取。
notification 示例:离线通知队列,上线拉取。
party command
party 示例:无权威小队,Leader 审核 + 状态广播。
party 示例:无权威小队,Leader 审核 + 状态广播。
pathfind command
pathfind 示例:网格 A* 寻路。
pathfind 示例:网格 A* 寻路。
presence command
presence 示例:在线状态追踪 + 频道成员列表。
presence 示例:在线状态追踪 + 频道成员列表。
protobuf-example/gen/go/api
Package v1 is a reverse proxy.
Package v1 is a reverse proxy.
questlog command
questlog 示例:每日任务 / 成就进度。
questlog 示例:每日任务 / 成就进度。
reddot command
reddot 示例:小红点 / 未读聚合树。
reddot 示例:小红点 / 未读聚合树。
relationship command
relationship 示例:社交图谱——好友 + 关注 + 拉黑。
relationship 示例:社交图谱——好友 + 关注 + 拉黑。
resume command
resume 示例:断线重连的在场状态还原。
resume 示例:断线重连的在场状态还原。
ringbuffer command
ringbuffer 示例:最近 N 条弹幕。
ringbuffer 示例:最近 N 条弹幕。
router command
router 示例:多语义消息路由 + 攒批。
router 示例:多语义消息路由 + 攒批。
saga command
saga 示例:跨服务 Saga 编排(抽卡流程)。
saga 示例:跨服务 Saga 编排(抽卡流程)。
scheduler command
scheduler 示例:工作池 + 暂停/恢复。
scheduler 示例:工作池 + 暂停/恢复。
services/k8s command
services/svc command
session command
session 示例:有状态 WebSocket 会话,echo + 广播。
session 示例:有状态 WebSocket 会话,echo + 广播。
spatial command
spatial 示例:网格空间索引(附近的人)。
spatial 示例:网格空间索引(附近的人)。
sse command
SSE 示例:一个定时推送端点 + 一个广播端点。
SSE 示例:一个定时推送端点 + 一个广播端点。
statesync command
statesync demo:基于同一个 pkg/gameloop.Room,换个 Handler 就从帧同步切到「状态同步」。
statesync demo:基于同一个 pkg/gameloop.Room,换个 Handler 就从帧同步切到「状态同步」。
statesync-quic command
statesync-quic demo:把状态同步搬到 QUIC,用一条连接的两种通道分流两类数据。
statesync-quic demo:把状态同步搬到 QUIC,用一条连接的两种通道分流两类数据。
status command
status 示例:用户上下线时给关注者推送状态通知。
status 示例:用户上下线时给关注者推送状态通知。
storage command
storage 示例:版本化对象存储,OCC 乐观锁。
storage 示例:版本化对象存储,OCC 乐观锁。
tally command
tally 示例:高频累计聚合 + 批量刷写。
tally 示例:高频累计聚合 + 批量刷写。
token command
token 示例:会话令牌签发、续签、注销全流程。
token 示例:会话令牌签发、续签、注销全流程。
tournament command
tournament 示例:每日重置排行榜。
tournament 示例:每日重置排行榜。
txn command
txn 示例:跨域原子事务——扣钱包 + 写存档,任一失败全回滚。
txn 示例:跨域原子事务——扣钱包 + 写存档,任一失败全回滚。
versus command
versus 示例:直播 PK(限时双方对抗计分)。
versus 示例:直播 PK(限时双方对抗计分)。
wallet command
wallet 示例:虚拟货币账本,差额更新 + 不可超扣。
wallet 示例:虚拟货币账本,差额更新 + 不可超扣。
webhook command
Webhook 示例:注册端点(事件过滤 + 签名 + 幂等去重 + DLQ),按事件触发通知。
Webhook 示例:注册端点(事件过滤 + 签名 + 幂等去重 + DLQ),按事件触发通知。
websocket command
WebSocket 示例:echo 端点 + JSON 广播端点。
WebSocket 示例:echo 端点 + JSON 广播端点。
pkg
afterwork
Package afterwork 提供请求级后台任务延寿(waitUntil 语义)。
Package afterwork 提供请求级后台任务延寿(waitUntil 语义)。
audit
Package audit 提供操作审计日志:结构化记录"谁在何时对什么资源做了什么操作", 仅记录成功的请求(失败请求走普通日志),用于合规与运维审计。
Package audit 提供操作审计日志:结构化记录"谁在何时对什么资源做了什么操作", 仅记录成功的请求(失败请求走普通日志),用于合规与运维审计。
backoff
Package backoff 提供指数退避 + 抖动(jitter)的重试原语,纯标准库。
Package backoff 提供指数退避 + 抖动(jitter)的重试原语,纯标准库。
bitmap
Package bitmap 提供位图:用 1 bit 表示一个布尔状态,极省内存的大规模标记与集合运算。
Package bitmap 提供位图:用 1 bit 表示一个布尔状态,极省内存的大规模标记与集合运算。
callbacks
Package callbacks 提供非侵入的执行切面:在某个执行单元的开始/结束/出错时机 触发回调,用于统一注入可观测性(trace、metrics、日志)而不改动业务代码。
Package callbacks 提供非侵入的执行切面:在某个执行单元的开始/结束/出错时机 触发回调,用于统一注入可观测性(trace、metrics、日志)而不改动业务代码。
chanx
Package chanx 提供无界 channel 等 channel 扩展原语。
Package chanx 提供无界 channel 等 channel 扩展原语。
client/grpcclient/resolver/consul
Package consul registers a Consul-backed gRPC name resolver.
Package consul registers a Consul-backed gRPC name resolver.
client/grpcclient/resolver/etcd
Package etcd registers an etcd-backed gRPC name resolver.
Package etcd registers an etcd-backed gRPC name resolver.
client/grpcclient/resolver/k8s
Package k8s registers a Kubernetes-backed gRPC name resolver.
Package k8s registers a Kubernetes-backed gRPC name resolver.
client/grpcclient/resolver/nacos
Package nacos registers a Nacos-backed gRPC name resolver.
Package nacos registers a Nacos-backed gRPC name resolver.
client/grpcclient/resolver/polaris
Package polaris registers a Polaris-backed gRPC name resolver.
Package polaris registers a Polaris-backed gRPC name resolver.
client/grpcclient/xds
Package xds 启用客户端 xDS 支持。
Package xds 启用客户端 xDS 支持。
cooldown
Package cooldown 提供按 key 的冷却(CD)原语:某个动作触发后,要等到冷却结束 才能再次触发。
Package cooldown 提供按 key 的冷却(CD)原语:某个动作触发后,要等到冷却结束 才能再次触发。
counter
Package counter 提供按 key 的滑动窗口计数与时间窗配额,纯内存实现。
Package counter 提供按 key 的滑动窗口计数与时间窗配额,纯内存实现。
ctxkey
Package ctxkey 提供类型安全的 context.Context 键。
Package ctxkey 提供类型安全的 context.Context 键。
dag
Package dag 提供一个轻量的有向无环图(DAG)执行器: 按依赖关系将节点拓扑分层,同一层内的节点并行执行,层间串行。
Package dag 提供一个轻量的有向无环图(DAG)执行器: 按依赖关系将节点拓扑分层,同一层内的节点并行执行,层间串行。
dberr
Package dberr 把数据库驱动错误翻译为 pkg/errors 的 *Status, 让仓储层只抛原生 driver error,中间件/网关层统一拿到带业务码的错误。
Package dberr 把数据库驱动错误翻译为 pkg/errors 的 *Status, 让仓储层只抛原生 driver error,中间件/网关层统一拿到带业务码的错误。
delayqueue
Package delayqueue 提供定点单次触发的延迟任务原语:注册一个未来时刻要执行的 回调,到点由后台 goroutine 触发;支持按 key 取消 / 改期。
Package delayqueue 提供定点单次触发的延迟任务原语:注册一个未来时刻要执行的 回调,到点由后台 goroutine 触发;支持按 key 取消 / 改期。
dlock
Package dlock 定义跨进程分布式锁与选主(leader election)的后端无关接口。
Package dlock 定义跨进程分布式锁与选主(leader election)的后端无关接口。
domain/chat
Package chat 提供频道聊天消息:按 channel 持久化 + 自增 message_id 游标分页。
Package chat 提供频道聊天消息:按 channel 持久化 + 自增 message_id 游标分页。
domain/group
Package group 提供群组实体:成员角色、邀请/申请审核、公告、最大人数、封禁名单。
Package group 提供群组实体:成员角色、邀请/申请审核、公告、最大人数、封禁名单。
domain/inbox
Package inbox 提供点对点离线消息收件箱:已读/未读、游标分页、ACK。
Package inbox 提供点对点离线消息收件箱:已读/未读、游标分页、ACK。
domain/notification
Package notification 提供离线通知队列:用户不在线时存通知,上线后拉取, 与 pkg/router 的实时路由互补——router 投在线者,notification 投离线者。
Package notification 提供离线通知队列:用户不在线时存通知,上线后拉取, 与 pkg/router 的实时路由互补——router 投在线者,notification 投离线者。
domain/party
Package party 提供无权威的多人小团体原语:Leader + Members + 加入请求队列, 成员变更时广播给全员。
Package party 提供无权威的多人小团体原语:Leader + Members + 加入请求队列, 成员变更时广播给全员。
domain/relationship
Package relationship 提供社交图谱原语:用二部有向图刻画"谁对谁是什么关系", 支持好友(双向)、关注(单向)、拉黑(单向隔离)、群组成员(带角色)等多种语义, 通过状态编码 + position 游标实现高效查询与分页。
Package relationship 提供社交图谱原语:用二部有向图刻画"谁对谁是什么关系", 支持好友(双向)、关注(单向)、拉黑(单向隔离)、群组成员(带角色)等多种语义, 通过状态编码 + position 游标实现高效查询与分页。
domain/storage
Package storage 提供版本化的对象存储原语:owner + collection + key + value + version, 通过乐观并发控制(OCC)保证并发写不覆盖,支持三种写语义与懒淘汰索引。
Package storage 提供版本化的对象存储原语:owner + collection + key + value + version, 通过乐观并发控制(OCC)保证并发写不覆盖,支持三种写语义与懒淘汰索引。
domain/tournament
Package tournament 提供锦标赛(时间窗排行榜):在 pkg/leaderboard 之上 增加"按 cron 表达式周期性重置"的能力,每周期一个独立榜单,到期自动滚动到下一周期。
Package tournament 提供锦标赛(时间窗排行榜):在 pkg/leaderboard 之上 增加"按 cron 表达式周期性重置"的能力,每周期一个独立榜单,到期自动滚动到下一周期。
domain/wallet
Package wallet 提供虚拟货币/积分/库存的账本式钱包: 采用"不可变事务日志(append-only ledger) + 当前余额派生"双模型, 通过 changeset 差值更新原子校验,避免超扣/超发。
Package wallet 提供虚拟货币/积分/库存的账本式钱包: 采用"不可变事务日志(append-only ledger) + 当前余额派生"双模型, 通过 changeset 差值更新原子校验,避免超扣/超发。
ephemeral
Package ephemeral 提供短期 TTL KV:不版本化、不持久,纯内存 + 到点自动过期。
Package ephemeral 提供短期 TTL KV:不版本化、不持久,纯内存 + 到点自动过期。
eventbus
Package eventbus 提供进程内、按主题(topic)分发的泛型事件总线:发布者按 topic 发事件,订阅者按 topic 注册回调处理函数,解耦"谁发"与"谁收"。
Package eventbus 提供进程内、按主题(topic)分发的泛型事件总线:发布者按 topic 发事件,订阅者按 topic 注册回调处理函数,解耦"谁发"与"谁收"。
featureflag
Package featureflag 提供本地评估的特性开关与 A/B 实验: 布尔开关、百分比灰度、按属性定向、多变体实验,均基于确定性哈希分桶, 同一标识(如 userID)多次评估结果稳定,无需远程调用。
Package featureflag 提供本地评估的特性开关与 A/B 实验: 布尔开关、百分比灰度、按属性定向、多变体实验,均基于确定性哈希分桶, 同一标识(如 userID)多次评估结果稳定,无需远程调用。
fsm
Package fsm 提供泛型有限状态机原语:声明式定义"状态 + 事件 → 目标状态"的 合法转移表,运行时 Fire(event) 只允许沿合法转移推进,非法转移报错而非静默改状态。
Package fsm 提供泛型有限状态机原语:声明式定义"状态 + 事件 → 目标状态"的 合法转移表,运行时 Fire(event) 只允许沿合法转移推进,非法转移报错而非静默改状态。
gameloop
Package gameloop 是一个「机制而非策略」的定步长游戏循环原语,用于在 beauty 上 搭帧同步(lockstep)/状态同步的服务端骨架。
Package gameloop 是一个「机制而非策略」的定步长游戏循环原语,用于在 beauty 上 搭帧同步(lockstep)/状态同步的服务端骨架。
generic
Package generic 提供一组类型安全的泛型/反射小工具。
Package generic 提供一组类型安全的泛型/反射小工具。
geohash
Package geohash 提供经纬度的 Geohash 编码/解码、邻居计算与覆盖查询,纯标准库。
Package geohash 提供经纬度的 Geohash 编码/解码、邻居计算与覆盖查询,纯标准库。
governance/bannednodes
Package bannednodes 提供单次请求内的节点禁用机制。
Package bannednodes 提供单次请求内的节点禁用机制。
governance/circuitbreaker
Package circuitbreaker 提供节点级熔断器。
Package circuitbreaker 提供节点级熔断器。
governance/overloadctrl
Package overloadctrl 提供反馈驱动的自适应限流。
Package overloadctrl 提供反馈驱动的自适应限流。
governance/router
Package router 提供服务发现与负载均衡之间的路由过滤层。
Package router 提供服务发现与负载均衡之间的路由过滤层。
handler
Package handler 提供声明式 HTTP handler 包装器:把 auth 策略 + 资源注入 + 错误归一化从业务 handler 上移到包装器,handler 只关心 (ctx, req) => (resp, error)。
Package handler 提供声明式 HTTP handler 包装器:把 auth 策略 + 资源注入 + 错误归一化从业务 handler 上移到包装器,handler 只关心 (ctx, req) => (resp, error)。
hls
Package hls 提供一个直播/点播 HLS origin:管理滚动分片窗口、生成 m3u8 播放列表, 并作为 http.Handler 挂在任意 mux(如 pkg/service/webserver)上分发。
Package hls 提供一个直播/点播 HLS origin:管理滚动分片窗口、生成 m3u8 播放列表, 并作为 http.Handler 挂在任意 mux(如 pkg/service/webserver)上分发。
idempotency
Package idempotency 提供幂等执行原语:同一 key 的重复请求只执行一次, 后续请求(含并发)复用首次结果,直到该 key 过期。
Package idempotency 提供幂等执行原语:同一 key 的重复请求只执行一次, 后续请求(含并发)复用首次结果,直到该 key 过期。
idgen
Package idgen 提供分布式唯一 ID 生成器(Snowflake 算法),纯标准库实现。
Package idgen 提供分布式唯一 ID 生成器(Snowflake 算法),纯标准库实现。
infra/k8s
Package k8s 提供基于 Kubernetes 原生选主能力实现 pkg/dlock.Elector 的后端, 使 Cron 等"多实例只该有一个在跑"的场景可以直接用集群内已有的 k8s API, 不必额外运维一套 etcd/Redis。
Package k8s 提供基于 Kubernetes 原生选主能力实现 pkg/dlock.Elector 的后端, 使 Cron 等"多实例只该有一个在跑"的场景可以直接用集群内已有的 k8s API, 不必额外运维一套 etcd/Redis。
infra/redis
Package redis 提供基于 Redis 的基建适配:分布式锁/选主(实现 pkg/dlock)与 带 TTL 的原子 KV 存储(实现 pkg/kvstore.Store,给 counter/cooldown/idempotency 等原语一个真实的跨实例后端)。
Package redis 提供基于 Redis 的基建适配:分布式锁/选主(实现 pkg/dlock)与 带 TTL 的原子 KV 存储(实现 pkg/kvstore.Store,给 counter/cooldown/idempotency 等原语一个真实的跨实例后端)。
keyedmutex
Package keyedmutex 提供按 key 的细粒度锁:同一 key 的持有者互斥(串行), 不同 key 之间互不阻塞(并行)。
Package keyedmutex 提供按 key 的细粒度锁:同一 key 的持有者互斥(串行), 不同 key 之间互不阻塞(并行)。
kvstore
Package kvstore 定义一个带 TTL 的原子键值存储接口,供需要"跨进程共享状态"的 原语(counter / cooldown / idempotency)接入分布式后端(如 Redis)。
Package kvstore 定义一个带 TTL 的原子键值存储接口,供需要"跨进程共享状态"的 原语(counter / cooldown / idempotency)接入分布式后端(如 Redis)。
leaderboard
Package leaderboard 提供排行榜的内存排名缓存:用堆排序维护每个榜的有序结构, O(log N) 查"我的名次"、按名次取记录,避免高频读时每次 ORDER BY 击穿数据库。
Package leaderboard 提供排行榜的内存排名缓存:用堆排序维护每个榜的有序结构, O(log N) 查"我的名次"、按名次取记录,避免高频读时每次 ORDER BY 击穿数据库。
leveling
Package leveling 提供经验值 / 等级曲线原语:给定当前经验加一笔增量,算出新等级、 是否升级、跨了几级、当前等级内进度。
Package leveling 提供经验值 / 等级曲线原语:给定当前经验加一笔增量,算出新等级、 是否升级、跨了几级、当前等级内进度。
loadbalance
Package loadbalance 提供通用的负载均衡算法原语,不绑定任何 RPC/服务发现框架。
Package loadbalance 提供通用的负载均衡算法原语,不绑定任何 RPC/服务发现框架。
loot
Package loot 提供加权随机抽取原语:抽卡 / 开宝箱 / 怪物掉落 / 直播抽奖。
Package loot 提供加权随机抽取原语:抽卡 / 开宝箱 / 怪物掉落 / 直播抽奖。
match
Package match 提供有状态实时会话原语,采用 actor 模型: 每个会话(房间/对战/协作编辑)由独立 goroutine 驱动,固定帧率 tick, 所有输入(业务数据、成员变更、同步信号)经带缓冲 channel 串行消费, 状态封装在 goroutine 内,无需锁。
Package match 提供有状态实时会话原语,采用 actor 模型: 每个会话(房间/对战/协作编辑)由独立 goroutine 驱动,固定帧率 tick, 所有输入(业务数据、成员变更、同步信号)经带缓冲 channel 串行消费, 状态封装在 goroutine 内,无需锁。
matchmaker
Package matchmaker 提供基于属性匹配的组队原语。
Package matchmaker 提供基于属性匹配的组队原语。
media
Package media 提供直播/视频服务的编排薄机制:多路流管理(Hub)、子进程监督 (Supervisor,如 ffmpeg 转码进程,含崩溃重启)与 OTel 运维指标。
Package media 提供直播/视频服务的编排薄机制:多路流管理(Hub)、子进程监督 (Supervisor,如 ffmpeg 转码进程,含崩溃重启)与 OTel 运维指标。
media/remux
Package remux 把 RTMP 收到的 FLV(H.264 + AAC)重封装成 MPEG-TS 分片,按关键帧切片 后 Append 到 pkg/hls.Stream——从而把 pkg/media/rtmp(采集)和 pkg/hls(分发)串成 一条端到端直播链路。
Package remux 把 RTMP 收到的 FLV(H.264 + AAC)重封装成 MPEG-TS 分片,按关键帧切片 后 Append 到 pkg/hls.Stream——从而把 pkg/media/rtmp(采集)和 pkg/hls(分发)串成 一条端到端直播链路。
media/rtmp
Package rtmp 提供一个 RTMP 采集(ingest)服务端,薄封装 github.com/yutopp/go-rtmp。
Package rtmp 提供一个 RTMP 采集(ingest)服务端,薄封装 github.com/yutopp/go-rtmp。
metadata
Package metadata 提供服务间调用的透传元数据机制。
Package metadata 提供服务间调用的透传元数据机制。
metadata/propagation
Package propagation 提供 MD 在 HTTP / gRPC 传输层的注入与提取实现。
Package propagation 提供 MD 在 HTTP / gRPC 传输层的注入与提取实现。
middleware/callbacks
Package callbacks 把 pkg/callbacks 的切面接入 beauty 的 HTTP / gRPC 服务: 在每个请求前后触发已注册的 callbacks.Handler(全局或随 ctx 局部), 用于统一注入 trace / metrics / 日志,而无需改动业务 handler。
Package callbacks 把 pkg/callbacks 的切面接入 beauty 的 HTTP / gRPC 服务: 在每个请求前后触发已注册的 callbacks.Handler(全局或随 ctx 局部), 用于统一注入 trace / metrics / 日志,而无需改动业务 handler。
momentum
Package momentum 提供"连击 + 热度时间衰减"原语:按 key 追踪连续触发的连击数, 并维护一个随时间指数衰减的热度值。
Package momentum 提供"连击 + 热度时间衰减"原语:按 key 追踪连续触发的连击数, 并维护一个随时间指数衰减的热度值。
options
Package options 提供分层的功能选项(functional options)模式: 框架定义一组“通用选项”,各实现方再追加自己的“专属选项”,调用方把两类选项 混在同一个 []Option 里传入;框架与实现各自用类型安全的方式提取属于自己的部分。
Package options 提供分层的功能选项(functional options)模式: 框架定义一组“通用选项”,各实现方再追加自己的“专属选项”,调用方把两类选项 混在同一个 []Option 里传入;框架与实现各自用类型安全的方式提取属于自己的部分。
pathfind
Package pathfind 提供网格地图上的 A* 寻路,纯计算、纯标准库、零依赖。
Package pathfind 提供网格地图上的 A* 寻路,纯计算、纯标准库、零依赖。
presence
Package presence 提供在线状态(在场追踪)原语:维护"谁在哪个流(stream)里" 的双向索引,支持 O(1) 按流查询成员、按会话查询所在流,以及 join/leave 事件总线。
Package presence 提供在线状态(在场追踪)原语:维护"谁在哪个流(stream)里" 的双向索引,支持 O(1) 按流查询成员、按会话查询所在流,以及 join/leave 事件总线。
presence/status
Package status 把用户的在线状态变化(上线/下线/进出流)推送给关注他的人。
Package status 把用户的在线状态变化(上线/下线/进出流)推送给关注他的人。
questlog
Package questlog 提供任务 / 成就的进度追踪:定义一组带目标值的任务,累加进度, 达标后可领取(一次),支持前置依赖与周期重置。
Package questlog 提供任务 / 成就的进度追踪:定义一组带目标值的任务,累加进度, 达标后可领取(一次),支持前置依赖与周期重置。
quic
Package quic 提供基于 QUIC(quic-go)的连接层,作为 pkg/ws(WebSocket/TCP)之外 面向实时/游戏同步的可选传输。
Package quic 提供基于 QUIC(quic-go)的连接层,作为 pkg/ws(WebSocket/TCP)之外 面向实时/游戏同步的可选传输。
ratelimit
Package ratelimit 提供基于键的限流原语:令牌桶 + 滑动窗口两种实现, 外加 HTTP 中间件,可与 pkg/handler 组合(声明式 WithRatelimit)。
Package ratelimit 提供基于键的限流原语:令牌桶 + 滑动窗口两种实现, 外加 HTTP 中间件,可与 pkg/handler 组合(声明式 WithRatelimit)。
reddot
Package reddot 提供小红点 / 未读聚合树:把散落各处的未读数按树形层级聚合, 父节点的未读 = 所有子节点未读之和,叶子清零自动向上传播。
Package reddot 提供小红点 / 未读聚合树:把散落各处的未读数按树形层级聚合, 父节点的未读 = 所有子节点未读之和,叶子清零自动向上传播。
resume
Package resume 提供断线重连的在场状态还原:客户端用 refresh token 重连, 服务端换出 userID,查 presence 看用户还在哪些流,返回流列表让客户端自动重连。
Package resume 提供断线重连的在场状态还原:客户端用 refresh token 重连, 服务端换出 userID,查 presence 看用户还在哪些流,返回流列表让客户端自动重连。
ringbuffer
Package ringbuffer 提供定长环形缓冲:只保留最近 N 条,写满后覆盖最旧的, O(1) 追加。
Package ringbuffer 提供定长环形缓冲:只保留最近 N 条,写满后覆盖最旧的, O(1) 追加。
router
Package router 提供多语义消息路由:把一条消息发给一组人(presence IDs)、 一个流(stream)的全部成员、或所有人,并支持一帧内多条消息攒批下发。
Package router 提供多语义消息路由:把一条消息发给一组人(presence IDs)、 一个流(stream)的全部成员、或所有人,并支持一帧内多条消息攒批下发。
safe
Package safe 提供 panic 恢复相关的小工具:把 panic 转成带堆栈的 error, 以及安全启动 goroutine(panic 不会崩进程)。
Package safe 提供 panic 恢复相关的小工具:把 panic 转成带堆栈的 error, 以及安全启动 goroutine(panic 不会崩进程)。
saga
Package saga 提供跨服务 Saga 编排:按顺序执行一组"正向操作",任一步失败时 逆序执行已成功步骤的"补偿操作",达成最终一致。
Package saga 提供跨服务 Saga 编排:按顺序执行一组"正向操作",任一步失败时 逆序执行已成功步骤的"补偿操作",达成最终一致。
scheduler
Package scheduler 提供工作池式任务调度器:生产者把任务投递到队列, N 个 worker goroutine 并发消费;支持运行时 Pause/Resume 与优雅停止。
Package scheduler 提供工作池式任务调度器:生产者把任务投递到队列, N 个 worker goroutine 并发消费;支持运行时 Pause/Resume 与优雅停止。
spatial
Package spatial 提供网格空间索引:把实体按坐标分桶到固定大小的网格单元, 支持"范围查询"(附近的人/实体)与 KNN(最近的 N 个),避免全量遍历。
Package spatial 提供网格空间索引:把实体按坐标分桶到固定大小的网格单元, 支持"范围查询"(附近的人/实体)与 KNN(最近的 N 个),避免全量遍历。
sse
Package sse 提供 Server-Sent Events 的轻量封装,屏蔽 SSE 在 Go 里的常见坑: 自动设置流式响应头、解除本连接的写超时(避免被 server WriteTimeout 掐断)、 每条事件后自动 flush(穿透 otelhttp / compress 等包装链)、客户端断开时结束。
Package sse 提供 Server-Sent Events 的轻量封装,屏蔽 SSE 在 Go 里的常见坑: 自动设置流式响应头、解除本连接的写超时(避免被 server WriteTimeout 掐断)、 每条事件后自动 flush(穿透 otelhttp / compress 等包装链)、客户端断开时结束。
stream
Package stream 提供流式扇出(广播)原语:把一个事件源 fan-out 给多个订阅者, 适合 SSE / WebSocket 等"一份数据推给 N 个连接"的场景。
Package stream 提供流式扇出(广播)原语:把一个事件源 fan-out 给多个订阅者, 适合 SSE / WebSocket 等"一份数据推给 N 个连接"的场景。
tally
Package tally 提供高频累计聚合 + 批量刷写:把海量小额增量在内存里按 key 累加, 定时(或攒够阈值)合并成一批交给 flush 回调一次性处理,削平写放大。
Package tally 提供高频累计聚合 + 批量刷写:把海量小额增量在内存里按 key 累加, 定时(或攒够阈值)合并成一批交给 flush 回调一次性处理,削平写放大。
token
Package token 提供会话令牌的全生命周期管理:签发、验证、续签、注销。
Package token 提供会话令牌的全生命周期管理:签发、验证、续签、注销。
txn
Package txn 提供跨域事务协调:让 wallet/storage/notification 等域包 在一个逻辑事务边界内原子提交或全部回滚。
Package txn 提供跨域事务协调:让 wallet/storage/notification 等域包 在一个逻辑事务边界内原子提交或全部回滚。
vars
Package vars 提供轻量的 ${KEY} 变量插值,零依赖。
Package vars 提供轻量的 ${KEY} 变量插值,零依赖。
versus
Package versus 提供"限时多方对抗计分"原语:N 个阵营在一段倒计时内实时累计分, 到点定胜负。
Package versus 提供"限时多方对抗计分"原语:N 个阵营在一段倒计时内实时累计分, 到点定胜负。
webhook
Package webhook 提供事件驱动的 Webhook 通知:按事件类型过滤、自定义 header、 可选 body 模板、可选 HMAC 签名,异步触发并带指数退避重试。
Package webhook 提供事件驱动的 Webhook 通知:按事件类型过滤、自定义 header、 可选 body 模板、可选 HMAC 签名,异步触发并带指数退避重试。
ws
Package ws 基于 github.com/coder/websocket 提供 WebSocket 的轻量封装: 自动完成握手升级、统一关闭语义,并把 *http.Request 透传给业务, 便于读取 query / header / 子协议 / 鉴权信息。
Package ws 基于 github.com/coder/websocket 提供 WebSocket 的轻量封装: 自动完成握手升级、统一关闭语义,并把 *http.Request 透传给业务, 便于读取 query / header / 子协议 / 鉴权信息。
ws/session
Package session 提供基于 WebSocket 的有状态会话高阶封装。
Package session 提供基于 WebSocket 的有状态会话高阶封装。
xgo
tools module

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL