Golang工具包Yokai - 后端应用的简单模块化可观测工具集

Golang工具包Yokai - 后端应用的简单模块化可观测工具集 Go 在后端开发方面表现卓越 💪

然而,要构建生产级的应用程序,如果你希望使用 Golang 构建后端,或者甚至只是想探索这个生态系统,都需要投入大量的精力和设置许多样板代码。你可以查看 GitHub 上的 Yokai

=> GitHub - ankorstore/yokai: 用于后端应用程序的简单、模块化且可观测的 Go 框架。

它非常注重 可观测性(内置日志、追踪和指标检测)、测试可扩展性

文档(README 中有链接)中,你可以找到现成的应用程序模板和教程,用于快速启动你的 HTTP、gRPC 甚至工作进程应用程序。你还可以在那里找到可以直接运行的 演示应用程序 来查看实际效果。

欢迎随时提出任何问题,希望这能对你的后端之旅有所帮助 👍


更多关于Golang工具包Yokai - 后端应用的简单模块化可观测工具集的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang工具包Yokai - 后端应用的简单模块化可观测工具集的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Yokai确实是一个设计精良的Go框架,它通过模块化设计显著降低了构建可观测生产级后端应用的复杂度。其核心价值在于将日志、追踪、指标三大可观测性支柱深度集成到框架层面,开发者无需再手动组装各种SDK和中间件。

以下是一个使用Yokai快速启动HTTP服务并自带可观测能力的示例:

package main

import (
    "context"
    "net/http"

    "github.com/ankorstore/yokai/fxcore"
    "github.com/ankorstore/yokai/fxhttpserver"
    "go.uber.org/fx"
)

func main() {
    fxcore.NewBootstrapper().Run(
        fx.Invoke(registerRoutes),
    )
}

func registerRoutes(handler *fxhttpserver.Handler) {
    handler.HandleFunc("GET /health", func(w http.ResponseWriter, r *http.Request) {
        // 自动记录请求日志和指标
        w.WriteHeader(http.StatusOK)
        w.Write([]byte("OK"))
    })
}

框架会自动为每个请求注入Trace ID,并记录结构化日志:

{
  "level": "info",
  "time": "2023-10-05T14:30:00Z",
  "trace_id": "abc123def456",
  "method": "GET",
  "path": "/health",
  "status": 200,
  "duration_ms": 12
}

对于需要自定义指标的场景,可以直接使用内置的指标收集器:

func businessHandler(counter yokaimetric.Counter) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        // 业务逻辑
        counter.WithLabelValues("operation_name").Inc()
        
        // 自动追踪的数据库操作示例
        var result string
        err := sqlxtrace.TraceContext(r.Context(), db).
            GetContext(r.Context(), &result, "SELECT data FROM table")
        if err != nil {
            // 错误会自动关联到当前追踪链路
            http.Error(w, err.Error(), http.StatusInternalServerError)
            return
        }
        
        w.Write([]byte(result))
    }
}

测试方面,Yokai提供了完整的测试套件支持:

func TestHandler(t *testing.T) {
    // 使用Yokai测试工具启动测试服务器
    testhttp.NewTestServer(t).
        WithHandlerFunc("/test", handler).
        Get("/test").
        ExpectStatus(http.StatusOK).
        ExpectBody("expected response")
}

对于需要自定义模块的场景,可以通过实现fx.Module接口轻松扩展:

var CustomModule = fx.Module(
    "custom",
    fx.Provide(
        NewService,
        NewRepository,
    ),
    fx.Invoke(RegisterHooks),
)

func NewService(repo Repository) *Service {
    return &Service{repo: repo}
}

Yokai的配置管理也值得关注,支持多环境配置和动态重载:

# configs/config.yaml
server:
  port: 8080
observability:
  metrics:
    enabled: true
    port: 9090
type Config struct {
    Server struct {
        Port int `mapstructure:"port"`
    }
}

func NewServer(cfg *Config) *http.Server {
    return &http.Server{
        Addr: fmt.Sprintf(":%d", cfg.Server.Port),
    }
}

框架的依赖注入系统基于Uber FX,但增加了对生命周期管理和资源清理的增强支持。每个组件都可以定义自己的启动和停止钩子,确保资源正确管理。

对于需要深度集成的场景,Yokai暴露了所有底层组件,允许直接访问OpenTelemetry收集器、日志核心等基础设施,同时保持了高级API的简洁性。这种分层设计使得从原型到生产环境的演进路径非常平滑。

回到顶部