字
字节笔记本
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 的轻量数据库,支持任何数据库驱动 |
| xrpc | RPC 组件 | gRPC 和 Gateway 助手 |
| xdi | 依赖注入 | IoC、DI 库,支持统一管理依赖、全局对象管理、动态配置刷新 |
| xwp | 协程池 | 通用工作池、协程池,可动态扩容缩容 |
| xhttp | HTTP 库 | 高效的 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;
}
}
}项目链接
- GitHub 仓库:https://github.com/mix-go/mix
- 开发文档:https://www.kancloud.cn/onanying/mixgo1/content
- PHP 版本:https://github.com/mix-php/mix
许可证
Apache License Version 2.0
分享: