golang简单模块化可观测的后端应用框架插件Yokai的使用

Golang简单模块化可观测的后端应用框架插件Yokai的使用

Yokai简介

Yokai是一个简单、模块化且可观测的Go框架,用于构建后端应用程序。它旨在解决构建生产级应用程序时的复杂性,让开发者能专注于业务逻辑。

Yokai架构图

主要特点

  1. 简单易用:易于配置和测试,快速迭代交付
  2. 模块化:可通过模块扩展功能
  3. 可观测性:内置日志、追踪和指标监控

架构概述

架构图

  • 核心模块:预加载日志、追踪、指标和健康检查
  • 扩展模块:可添加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语言模块化后端应用框架,专注于可观测性和插件化架构。它提供了开箱即用的日志、指标、链路追踪等可观测性功能,同时支持通过插件机制扩展功能。

核心特性

  1. 模块化设计:通过插件机制灵活扩展功能
  2. 内置可观测性:集成日志、指标、分布式追踪
  3. 配置管理:支持多种配置源和环境变量
  4. 依赖注入:简化组件管理
  5. 中间件支持: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()
}

最佳实践

  1. 模块划分:按功能划分模块,保持高内聚低耦合
  2. 配置分离:将配置与代码分离,支持多环境
  3. 可观测性:合理使用日志、指标和追踪
  4. 错误处理:统一错误处理机制
  5. 依赖管理:利用依赖注入管理组件生命周期

Yokai框架通过其模块化设计和内置的可观测性功能,为Go开发者提供了一个灵活且强大的后端应用开发平台。通过插件机制,开发者可以轻松扩展框架功能,同时保持代码的整洁和可维护性。

回到顶部