golang简单模块化可观测的后端应用框架插件Yokai的使用
Golang简单模块化可观测的后端应用框架插件Yokai的使用
Yokai简介
Yokai是一个简单、模块化且可观测的Go框架,用于构建后端应用程序。它旨在解决构建生产级应用程序时的复杂性,让开发者能专注于业务逻辑。
主要特点
- 简单易用:易于配置和测试,快速迭代交付
- 模块化:可通过模块扩展功能
- 可观测性:内置日志、追踪和指标监控
架构概述
- 核心模块:预加载日志、追踪、指标和健康检查
- 扩展模块:可添加HTTP/gRPC服务器、工作器等
- 依赖注入系统:用于构建应用逻辑
基础组件
Yokai基于以下成熟Go库构建:
- Echo (HTTP服务器)
- gRPC-go (gRPC服务器)
- Viper (配置管理)
- OTEL (可观测性)
- Fx (依赖注入)
快速入门示例
下面是一个简单的HTTP应用示例:
package main
import (
"github.com/ankorstore/yokai/fxhttpserver"
"github.com/ankorstore/yokai/fxhttpserver/testdata/controllers"
"go.uber.org/fx"
)
func main() {
fx.New(
// 基础模块
fxhttpserver.FxHttpServerModule,
// 控制器
fx.Provide(
controllers.NewTestController,
),
// 启动应用
fx.Invoke(fxhttpserver.Run),
).Run()
}
模块化示例
添加自定义模块的示例:
package custommodule
import (
"go.uber.org/fx"
)
// CustomService 自定义服务
type CustomService struct {
// 服务实现
}
// NewCustomService 创建自定义服务
func NewCustomService() *CustomService {
return &CustomService{}
}
// FxCustomModule 自定义Fx模块
var FxCustomModule = fx.Module(
"custom",
fx.Provide(
NewCustomService,
),
)
可观测性示例
使用内置的可观测性功能:
package main
import (
"net/http"
"github.com/labstack/echo/v4"
"go.uber.org/zap"
)
type TestController struct {
logger *zap.Logger
}
func NewTestController(logger *zap.Logger) *TestController {
return &TestController{
logger: logger,
}
}
func (c *TestController) RegisterRoutes(e *echo.Echo) {
e.GET("/test", c.TestHandler)
}
func (c *TestController) TestHandler(ctx echo.Context) error {
// 记录日志
c.logger.Info("handling test request")
// 返回响应
return ctx.JSON(http.StatusOK, map[string]string{
"message": "test",
})
}
应用模板
Yokai提供多种应用模板:
- gRPC应用
- HTTP应用
- MCP应用
- Worker应用
演示项目
查看Yokai的实际应用:
贡献指南
该项目使用release-please自动化模块发布流程,贡献时请提供原子化的常规提交。
更多关于golang简单模块化可观测的后端应用框架插件Yokai的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang简单模块化可观测的后端应用框架插件Yokai的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Yokai框架简介与使用指南
Yokai是一个轻量级的Go语言模块化后端应用框架,专注于可观测性和插件化架构。它提供了开箱即用的日志、指标、链路追踪等可观测性功能,同时支持通过插件机制扩展功能。
核心特性
- 模块化设计:通过插件机制灵活扩展功能
- 内置可观测性:集成日志、指标、分布式追踪
- 配置管理:支持多种配置源和环境变量
- 依赖注入:简化组件管理
- 中间件支持:HTTP和gRPC中间件
基础使用示例
安装
go get github.com/yokaiio/yokai
最小应用示例
package main
import (
"context"
"github.com/yokaiio/yokai/core"
"github.com/yokaiio/yokai/fxcore"
"go.uber.org/fx"
)
func main() {
app := fxcore.New(
core.Module,
fx.Invoke(func(lifecycle fx.Lifecycle) {
lifecycle.Append(fx.Hook{
OnStart: func(ctx context.Context) error {
println("Application started")
return nil
},
OnStop: func(ctx context.Context) error {
println("Application stopped")
return nil
},
})
}),
)
app.Run()
}
可观测性集成
日志配置
package main
import (
"github.com/yokaiio/yokai/core"
"github.com/yokaiio/yokai/fxcore"
"github.com/yokaiio/yokai/log"
"go.uber.org/fx"
"go.uber.org/zap"
)
func main() {
app := fxcore.New(
core.Module,
log.Module,
fx.Invoke(func(logger *zap.Logger) {
logger.Info("Application started with logging")
}),
)
app.Run()
}
指标监控
package main
import (
"github.com/yokaiio/yokai/fxcore"
"github.com/yokaiio/yokai/metrics"
"go.uber.org/fx"
)
func main() {
app := fxcore.New(
core.Module,
metrics.Module,
fx.Invoke(func(metrics metrics.Metrics) {
// 记录自定义指标
metrics.Counter("requests.count").Inc()
}),
)
app.Run()
}
HTTP服务器示例
package main
import (
"net/http"
"github.com/yokaiio/yokai/core"
"github.com/yokaiio/yokai/fxcore"
"github.com/yokaiio/yokai/httpserver"
"go.uber.org/fx"
)
func main() {
app := fxcore.New(
core.Module,
httpserver.Module,
fx.Invoke(func(server *httpserver.Server) {
server.Router().HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello, Yokai!"))
})
}),
)
app.Run()
}
自定义插件开发
package myplugin
import (
"go.uber.org/fx"
"go.uber.org/zap"
)
type MyService struct {
logger *zap.Logger
}
func NewMyService(logger *zap.Logger) *MyService {
return &MyService{logger: logger}
}
func (s *MyService) DoSomething() {
s.logger.Info("Doing something important")
}
var Module = fx.Module("myplugin",
fx.Provide(NewMyService),
fx.Invoke(func(s *MyService) {
s.DoSomething()
}),
)
// 在主程序中使用
// app := fxcore.New(
// core.Module,
// myplugin.Module,
// )
配置管理
Yokai支持通过多种方式管理配置:
package main
import (
"github.com/yokaiio/yokai/core"
"github.com/yokaiio/yokai/config"
"github.com/yokaiio/yokai/fxcore"
"go.uber.org/fx"
)
type AppConfig struct {
Server struct {
Port int `yaml:"port"`
} `yaml:"server"`
}
func main() {
app := fxcore.New(
core.Module,
config.Module,
fx.Invoke(func(cfg *config.Config) {
var appCfg AppConfig
if err := cfg.Unmarshal(&appCfg); err != nil {
panic(err)
}
println("Server port:", appCfg.Server.Port)
}),
)
app.Run()
}
最佳实践
- 模块划分:按功能划分模块,保持高内聚低耦合
- 配置分离:将配置与代码分离,支持多环境
- 可观测性:合理使用日志、指标和追踪
- 错误处理:统一错误处理机制
- 依赖管理:利用依赖注入管理组件生命周期
Yokai框架通过其模块化设计和内置的可观测性功能,为Go开发者提供了一个灵活且强大的后端应用开发平台。通过插件机制,开发者可以轻松扩展框架功能,同时保持代码的整洁和可维护性。