b0go -- 极简Go模块化Web开发脚手架
- 极致的微内核插件化应用架构
- 模块应用的前后端代码物理隔离
- 减少非必要代码包装和依赖
- 提供应用引擎和模块注册网关
- 统一配置、统一日志、中间件支持
开发应用模块,如 app1 模块,一般步骤如下:
- 模块目录:强烈建议使用约定的目录结构开发,事半功倍。
- 入口文件:按框架结构开发本模块的main.go
- 其他文件:也可以按golang规则开发其他go文件,按需开发ui界面
- 注册应用:按“应用模块注册”将本模块注册到主入口
- 启动应用:进入main目录,启动main.go
- apps # 应用模块根目录
- app1 # 应用1根目录
- ui # 应用1UI资源目录
- main.go # 应用1主程序
- docs # 应用2根目录
- ui # 应用2UI资源目录
- main.go # 应用2主程序
... # 其他应用
- core # 内核目录
- engine # 引擎目录
- gateway # 网关目录
- tools # 自定义工具库
- main # 主程序目录
- config.ini # 配置文件
- main.go # 入口主程序
...
内置DevDoc:http://127.0.0.1:8081/dev/doc
一、网页内容/由docs应用提供/Markdown自动解析
- / => 首页 跳转到 /docs/index.html
- /docs/%mdfile.html% => markdown文档 /docs/%mdfile.md%
- /docs_root/%static% => 静态文件 /docs_root/%static%
二、网关GateWay相关/开发文档
- /dev/doc => api doc 文档页面
- /dev/api => api json 后端接口
三、具体应用相关路由
- /app/%appid% => 具体应用首页
- /app/%appid%/%act% => 具体应用api json
路由规则定义在 "core/gateway/main.go" 中定义
package app
import (
"b0go/core/engine"
"embed"
"io/fs"
"github.com/gin-gonic/gin"
)
// 定义该应用配置项
type AppConfig struct {
Name string
}
// 定义应用全局变量
var (
app *engine.AppConfig
appId = "app1"
config = new(AppConfig)
//go:embed ui/dist
uiFS embed.FS
)
// init()在main.go中被调用
func init() {
uiDist, _ := fs.Sub(uiFS, "ui/dist")
app = &engine.AppConfig{
Name: appId,
Type: engine.APP_APP,
Config: config,
UIFS: uiDist,
Run: run,
}
engine.AppInstall(app)
}
func run() {
engine.GET(appId, "/ping", "{}", "ping", ping)
engine.POST(appId, "/ping", "{}", "ping", ping)
}
func ping(c *gin.Context) {
c.JSON(200, gin.H{
"message": appId + " pong " + config.Name,
})
}
[gateway]
ListenAddr = ":8081"
Live = true
[app1]
Name = "b0go"
[docs]
Live = true
注意:
- 此配置文件至少要配置[gateway]节点,其他为注册应用的配置
- 每个注册应用(main.go的import定义)都必须在此文件有一个节点,即使没有配置项
package main
import (
_ "b0go/apps/app1" //注册app1
_ "b0go/apps/docs" //注册docs
"b0go/core/engine"
_ "b0go/core/gateway" //默认必须注册
)
func main() {
engine.Run("config.ini")
select {}
}
go run main/main.go
go build main/main.go
部署到服务器上
- golang
- gin
- gorm