字节笔记本

2026年2月22日

MixGo: Go 语言快速开发标准工具包

MixGo 是一个 Go 语言快速开发标准工具包,采用模块化设计,内部模块高度解耦。开发者可以像搭积木一样自由组合各个独立模块,无论是构建 CLI 工具、API 服务、Web 应用还是 gRPC 服务,都能找到合适的组件。该项目在 GitHub 上已获得 860+ stars,是 Go 生态中值得关注的开发框架。

项目简介

MixGo 由 OpenMix 团队开发维护,其设计理念是提供一套完整的 Go 语言开发工具包,同时保持各模块的独立性。项目整体代码基于多个独立模块构建,即使不使用 mixcli 脚手架快速生成代码,开发者也可以单独使用这些独立模块:

  • 只使用 xcli 构建命令行交互工具
  • 使用 xsql 调用数据库
  • 使用 xwp 处理 MQ 队列消费
  • 使用 xhttp 构建 HTTP 服务

核心特性

  • 模块化架构:所有核心模块均可独立使用,高度解耦
  • 脚手架支持:提供 mixcli 脚手架工具,快速创建项目骨架
  • 多场景支持:支持 CLI、API、Web、WebSocket、gRPC 等多种应用类型
  • 依赖注入:内置 IoC/DI 容器,统一管理对象依赖关系
  • 协程池:通用工作池、协程池,支持动态扩容缩容
  • 开发友好:完善的文档和丰富的示例代码

独立模块介绍

模块名称功能描述
mixcli脚手架工具快速创建 Go 项目,类似前端界的 Vue CLI
xcli命令行工具命令行交互与命令管理,支持参数获取、中间件、程序守护
xsql数据库组件基于 database/sql 的轻量数据库,支持任何数据库驱动
xrpcRPC 组件gRPC 和 Gateway 助手
xdi依赖注入IoC、DI 库,支持统一管理依赖、全局对象管理、动态配置刷新
xwp协程池通用工作池、协程池,可动态扩容缩容
xhttpHTTP 库高效的 HTTP 处理库
xutil工具集一套让 Golang 保持甜美的工具函数

安装指南

前置要求

  • Go >= 1.13

安装脚手架

bash
go install github.com/mix-go/mixcli@latest

快速开始

创建新项目

使用 mixcli 命令创建项目骨架:

bash
$ mixcli new hello

Use the arrow keys to navigate: ↓ ↑ → ←
? Select project type:
  ▸ CLI
    API
    Web (contains the websocket)
    gRPC

项目结构

生成的 API 项目骨架目录结构如下:

text
.
├── README.md
├── bin
├── commands
├── conf
├── config
├── controllers
├── di
├── go.mod
├── go.sum
├── main.go
├── middleware
├── routes
└── runtime

编写 API 服务

main.go 文件:

go
package main

import (
    "github.com/mix-go/api-skeleton/commands"
    _ "github.com/mix-go/api-skeleton/configor"
    _ "github.com/mix-go/api-skeleton/di"
    _ "github.com/mix-go/api-skeleton/dotenv"
    "github.com/mix-go/xutil/xenv"
    "github.com/mix-go/xcli"
)

func main() {
    xcli.SetName("app").
        SetVersion("0.0.0-alpha").
        SetDebug(xenv.Getenv("APP_DEBUG").Bool(false))
    xcli.AddCommand(commands.Commands...).Run()
}

commands/api.go 文件:

go
package commands

import (
    "context"
    "fmt"
    "github.com/gin-gonic/gin"
    "github.com/mix-go/api-skeleton/di"
    "github.com/mix-go/api-skeleton/routes"
    "github.com/mix-go/xutil/xenv"
    "github.com/mix-go/xcli/flag"
    "github.com/mix-go/xcli/process"
    "os"
    "os/signal"
    "strings"
    "syscall"
    "time"
)

type APICommand struct {
}

func (t *APICommand) Main() {
    if flag.Match("d", "daemon").Bool() {
        process.Daemon()
    }
    logger := di.Logrus()
    server := di.Server()
    addr := xenv.Getenv("GIN_ADDR").String(":8080")
    mode := xenv.Getenv("GIN_MODE").String(gin.ReleaseMode)

    // server
    gin.SetMode(mode)
    router := gin.New()
    routes.SetRoutes(router)
    server.Addr = flag.Match("a", "addr").String(addr)
    server.Handler = router

    // signal
    ch := make(chan os.Signal)
    signal.Notify(ch, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM)
    go func() {
        <-ch
        logger.Info("Server shutdown")
        ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
        if err := server.Shutdown(ctx); err != nil {
            logger.Errorf("Server shutdown error: %s", err)
        }
    }()

    // run
    logger.Infof("Server start at %s", server.Addr)
    if err := server.ListenAndServe(); err != nil && !strings.Contains(err.Error(), "http: Server closed") {
        panic(err)
    }
}

routes/main.go 路由配置:

go
package routes

import (
    "github.com/gin-gonic/gin"
    "github.com/mix-go/api-skeleton/controllers"
    "github.com/mix-go/api-skeleton/middleware"
)

func SetRoutes(router *gin.Engine) {
    router.Use(gin.Recovery())

    router.GET("hello", middleware.CorsMiddleware(), func(ctx *gin.Context) {
        hello := controllers.HelloController{}
        hello.Index(ctx)
    })

    router.POST("users/add", middleware.AuthMiddleware(), func(ctx *gin.Context) {
        hello := controllers.UserController{}
        hello.Add(ctx)
    })

    router.POST("auth", func(ctx *gin.Context) {
        auth := controllers.AuthController{}
        auth.Index(ctx)
    })
}

编译与运行

bash
# 编译
go build -o bin/go_build_main_go main.go

# 启动服务器
$ bin/go_build_main_go api

Server Name: mix-api
System Name: darwin
Go Version: 1.13.4
Listen Addr: :8080
time=2020-09-16 20:24:41.515 level=info msg=Server start

使用 DI 容器

项目中使用的公共组件都定义在 di 目录,可以在代码的任意位置使用:

使用日志(支持 zap、logrus)

go
logger := di.Zap()
logger.Info("test")

使用数据库(支持 gorm、xorm)

go
db := di.Gorm()
user := User{Name: "Jinzhu", Age: 18, Birthday: time.Now()}
result := db.Create(&user)
fmt.Println(result)

使用 Redis

go
rdb := di.GoRedis()
val, err := rdb.Get(context.Background(), "key").Result()
if err != nil {
    panic(err)
}
fmt.Println("key", val)

部署指南

线上部署时,只需要部署编译好的二进制文件、配置文件等:

text
├── bin
├── conf
├── runtime
├── shell
└── .env

使用 shell 脚本管理服务:

bash
sh shell/server.sh start
sh shell/server.sh stop
sh shell/server.sh restart

配合 Nginx 反向代理:

nginx
server {
    server_name www.domain.com;
    listen 80;

    location / {
        proxy_http_version 1.1;
        proxy_set_header Connection "keep-alive";
        proxy_set_header Host $http_host;
        proxy_set_header Scheme $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        if (!-f $request_filename) {
            proxy_pass http://127.0.0.1:8080;
        }
    }
}

项目链接

许可证

Apache License Version 2.0

分享: