go-infra

module
v1.0.1 Latest Latest
Warning

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

Go to latest
Published: Aug 5, 2026 License: Apache-2.0

README

go-infra

一个高性能、生产就绪的 Go 语言基础设施 SDK 库

Go Version License

📖 简介

go-infra 是一个经过生产环境验证的 Go 语言基础设施库,提供了微服务开发中常用的功能模块,包括日志、追踪、监控、数据库、缓存等,帮助开发者快速构建高性能、可观测的应用。

✨ 核心特性
  • 🚀 高性能优化 - 对象池、连接池等优化,支持高并发场景
  • 🔍 完整的可观测性 - 集成日志、追踪、监控(基于 OpenTelemetry)
  • 🛡️ 生产就绪 - 经过性能优化和并发安全验证
  • 📦 开箱即用 - 提供合理的默认配置
  • 🔧 灵活配置 - 支持自定义配置,满足不同场景需求
  • 🤖 AI 统一接入 - 提供 LLM 多厂商统一调用与主备切换能力
  • 📝 详细文档 - 每个模块都有完整的使用示例

📦 功能模块

层级 模块 说明 文档
base log 高性能异步日志(支持链路追踪) 查看文档
base trace 分布式链路追踪(OpenTelemetry) 查看文档
base config 通用配置加载(YAML + 环境覆盖 + 加密) 查看文档
base errors 统一错误处理和 HTTP 状态码封装 查看文档
base env 环境变量与模式管理 pkg/base/env/
base uuid Snowflake / UUID ID 生成 pkg/base/uuid/
base datetime API JSON 时间类型(2006-01-02 15:04:05 pkg/base/datetime/
base xutil 通用泛型工具函数(含日/周/月区间计算) pkg/base/xutil/
infra mysql MySQL/GORM 客户端(连接池管理) 查看文档
infra redis Redis 客户端(单机/集群) 查看文档
infra milvus Milvus 向量数据库客户端(连接池) 查看文档
infra metrics Prometheus 监控指标采集 查看文档
infra traffic 流量控制(限流/熔断接口) 查看文档
infra http_client HTTP 客户端(连接池复用) 查看文档
infra grpc gRPC 客户端/服务端统一封装(拦截器/治理) 查看文档
infra websocket WebSocket 长连接封装(心跳/重连/Hub) 查看文档
infra llm 大模型统一调用 SDK(多厂商协议抽象) 查看文档
infra apollo Apollo 配置中心 pkg/infra/apollo/
infra objstore S3 兼容对象存储(KS3/OSS/OBS/MinIO 等) 查看文档
biz login 多方式登录(密码/手机/邮箱/微信)+ JWT 查看文档
biz account 账号管理与多登录方式绑定 查看文档
biz pay 微信支付 APIv3 / 支付宝 RSA2 查看文档
biz collab 跨端实时协作引擎(定序/去重/回放/订阅) 查看文档
biz controller Gin 基础控制器(统一响应格式) pkg/biz/controller/
biz middlewares Gin 中间件(日志/追踪/CORS 等) pkg/biz/middlewares/

🚀 快速开始

安装
go get github.com/liukunxin/go-infra
基础示例
package main

import (
    "github.com/gin-gonic/gin"
    "github.com/liukunxin/go-infra/pkg/base/log"
    "github.com/liukunxin/go-infra/pkg/base/trace"
    "github.com/liukunxin/go-infra/pkg/infra/metrics"
    "github.com/liukunxin/go-infra/pkg/biz/middlewares"
)

func main() {
    // 1. 初始化日志
    log.Init(log.Config{
        Level: log.LevelInfo,
    })

    // 2. 初始化链路追踪
    trace.Init(
        trace.WithServiceName("my-service"),
    )

    // 3. 创建 Gin 路由
    router := gin.Default()

    // 4. 初始化监控(自动注册 /metrics 路由)
    metrics.InitMetrics("my-service", router)

    // 5. 注册中间件
    router.Use(middlewares.GinTraceMiddleware())  // 链路追踪
    router.Use(middlewares.HttpLogRecord())       // 日志记录

    // 6. 定义路由
    router.GET("/hello", func(c *gin.Context) {
        log.WithContext(c.Request.Context()).Info("处理hello请求")
        c.JSON(200, gin.H{"message": "Hello World"})
    })

    // 7. 启动服务
    router.Run(":8080")
}

📚 详细文档

pkg/base — 原子基础能力
pkg/infra — 基础设施能力
pkg/biz — 业务基础能力

🏗️ 架构设计

可观测性架构
┌─────────────────────────────────────────────────────────┐
│                      应用程序                             │
├─────────────────────────────────────────────────────────┤
│  ┌──────────┐  ┌──────────┐  ┌──────────┐              │
│  │   Log    │  │  Trace   │  │ Metrics  │              │
│  │ (日志)    │  │ (追踪)    │  │ (监控)    │              │
│  └─────┬────┘  └─────┬────┘  └─────┬────┘              │
│        │             │              │                   │
│        └─────────────┴──────────────┘                   │
│                      │                                  │
│              OpenTelemetry SDK                          │
├─────────────────────────────────────────────────────────┤
│        Exporter (Jaeger/Prometheus/etc)                │
└─────────────────────────────────────────────────────────┘
连接池管理
应用程序
  ├─ MySQL连接池 (GORM)
  │   └─ 默认配置: MaxOpen=100, MaxIdle=10
  ├─ Redis连接池
  │   └─ 支持单机/集群模式
  ├─ HTTP连接池
  │   └─ 支持连接复用和超时控制
  └─ Milvus连接池
      └─ 自定义连接池实现

🔥 性能优化

本库在以下方面进行了性能优化:

  • 对象池 - 日志、HTTP等模块使用sync.Pool减少GC压力
  • 连接池 - 数据库、Redis、HTTP连接池复用
  • 异步日志 - 基于环形队列的无锁日志系统
  • 并发安全 - 所有模块都经过并发安全验证
  • 零拷贝 - 减少不必要的内存分配和复制

🔐 配置加密

支持对敏感配置值(数据库密码、API Key 等)进行 AES-256-GCM 加密存储,运行时自动解密:

# configs/config.prod.yml
mysql:
  host: 10.0.1.100
  password: "ENC(nonce+ciphertext的base64)"
redis:
  password: "ENC(...)"
cfg := config.MustLoad[App](
    config.WithDecrypt(config.AESKeyFromEnv("CONFIG_ENCRYPT_KEY")),
)
  • 不传 WithDecrypt 时行为完全不变,零侵入
  • 密钥通过环境变量注入,推荐 K8s Secret 管理
  • 使用 go-infra-cli keygen / encrypt / decrypt 命令生成密钥和加密值
  • 详见 配置模块文档

💡 最佳实践

初始化顺序

建议按以下顺序初始化各模块:

1. 日志 (log)          - 最先初始化,其他模块可能依赖
2. 追踪 (trace)        - 尽早初始化,用于记录启动过程
3. 数据库 (mysql/redis) - 建立数据库连接
4. 路由 (gin)          - 创建HTTP服务
5. 监控 (metrics)      - 注册监控端点
6. 中间件              - 注册全局中间件
错误处理
import kerr "github.com/liukunxin/go-infra/pkg/base/errors"

// 业务逻辑中
if err != nil {
    return kerr.WarpError(kerr.StatusBadRequest, 40001, err)
}

// 在Controller中
func (b *GinBase) MyHandler(c *gin.Context) {
    if err := doSomething(); err != nil {
        b.ErrorResponse(c, err)  // 自动处理错误响应
        return
    }
    b.SuccessResponse(c, data)
}
日志记录
// 带上下文的日志(自动包含TraceID)
log.WithContext(ctx).Info("用户登录成功")

// 带字段的日志
log.WithContext(ctx).WithFields(map[string]interface{}{
    "user_id": 123,
    "action": "login",
}).Info("用户操作")

📊 监控指标

自动采集的指标:

  • http_requests_total - HTTP请求总数(按method、path、status分组)
  • http_request_duration_ms - HTTP请求延迟(直方图)

可通过 /metrics 端点访问。

🤝 贡献

欢迎提交Issue和Pull Request!

开发规范
  • 所有公开API需要添加注释
  • 新增功能需要提供使用示例
  • 性能敏感模块需要进行基准测试
  • 确保并发安全
新增包后的同步 Checklist

新增 pkg/infra/xxxpkg/biz/xxx 包后,需同步更新 scaffold(否则 AI 辅助编码时不会感知到新包):

  • scaffold/skills/go-infra-reference/SKILL.md — 包地图表格新增一行
  • scaffold/skills/go-infra-reference/reference.md — 补充典型用法代码示例
  • scaffold/single-starter/.cursor/rules/11-go-infra-api.mdc — 如该包属于默认初始化能力,同步更新
  • scaffold/monorepo-starter/.cursor/rules/11-go-infra-api.mdc — 同上

📄 许可证

MIT License - 详见 LICENSE 文件

🔗 相关链接

📮 联系方式


⭐ 如果这个项目对你有帮助,请给个Star!

Directories

Path Synopsis
internal
option
Package option 提供泛型函数式选项(Functional Options)基础类型, 供 SDK 内各包的 Init/New 函数统一使用,避免每个包重复定义相同的 Option 接口和 optionFunc 类型。
Package option 提供泛型函数式选项(Functional Options)基础类型, 供 SDK 内各包的 Init/New 函数统一使用,避免每个包重复定义相同的 Option 接口和 optionFunc 类型。
pkg
base/datetime
Package datetime provides DateTime, a JSON-friendly time type for API responses.
Package datetime provides DateTime, a JSON-friendly time type for API responses.
base/xutil
Package xutil 提供项目通用工具函数,供 SDK 各包与业务方直接使用。
Package xutil 提供项目通用工具函数,供 SDK 各包与业务方直接使用。
biz/account
Package account 提供通用账号管理能力,包括账号实体、登录绑定关系、状态管理与常用服务操作。
Package account 提供通用账号管理能力,包括账号实体、登录绑定关系、状态管理与常用服务操作。
biz/image
Package image provides image storage and anti-hotlinking access capabilities.
Package image provides image storage and anti-hotlinking access capabilities.
biz/pay
Package pay 提供微信支付(APIv3)、支付宝(RSA2)、Apple 内购(App Store Server API) 与京东支付的轻量封装,像"聚合收银台"一样对外暴露统一接口,便于业务侧快速接入。
Package pay 提供微信支付(APIv3)、支付宝(RSA2)、Apple 内购(App Store Server API) 与京东支付的轻量封装,像"聚合收银台"一样对外暴露统一接口,便于业务侧快速接入。
infra/llm
Package llm provides a unified SDK interface for multiple large-model vendors.
Package llm provides a unified SDK interface for multiple large-model vendors.

Jump to

Keyboard shortcuts

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