-
Notifications
You must be signed in to change notification settings - Fork 43
readme
YoyoFx edited this page Aug 17, 2020
·
6 revisions
YoyoGo 是一个用 Go 编写的简单,轻便,快速的 Web 框架。
- 漂亮又快速的路由器
- 中间件支持 (handler func & custom middleware)
- 微服务框架抽象了分层,在一个框架体系兼容各种server实现,如 rest,grpc等
- 受到许多出色的 Go Web 框架的启发,server可替换,目前实现了 fasthttp 和 net.http
go get github.com/yoyofx/yoyogo
window 下在 cmd 中执行:
set GO111MODULE=on
set GOPROXY=https://goproxy.cn
linux 下执行:
export GO111MODULE=on
export GOPROXY=https://goproxy.cn
go env -w GOPROXY=https://goproxy.cn,direct
go mod vendor // 将依赖包拷贝到项目目录中去
package main
import ...
func main() {
YoyoGo.CreateDefaultBuilder(func(router Router.IRouterBuilder) {
router.GET("/info",func (ctx *Context.HttpContext) { // 支持Group方式
ctx.JSON(200, Context.M{"info": "ok"})
})
}).Build().Run() //默认端口号 :8080
}
- 打印Logo和日志(YoyoGo)
- 统一程序输入参数和环境变量 (YoyoGo)
- 简单路由器绑定句柄功能
- HttpContext 上下文封装(请求,响应)
- 静态文件端点(静态文件服务器)
- JSON 序列化结构(Context.M)
- 获取请求文件并保存
- 获取请求数据(form-data,x-www-form-urlencoded,Json ,XML,Protobuf 等)
- Http 请求的绑定模型(Url, From,JSON,XML,Protobuf)
- Render Interface
- JSON Render
- JSONP Render
- Indented Json Render
- Secure Json Render
- Ascii Json Render
- Pure Json Render
- Binary Data Render
- TEXT
- Protobuf
- MessagePack
- XML
- YAML
- File
- Image
- Template
- Auto formater Render
- Logger
- StaticFile
- Router Middleware
- Session
- CORS
- GZip
- Binding
- Binding Valateion
- GET,POST,HEAD,PUT,DELETE 方法支持
- 路由解析树与表达式支持
- RouteData路由数据 (/api/:version/) 与 Binding的集成
- 路由组功能
- MVC默认模板功能
- 路由过滤器 Filter
- 路由请求触发Controller&Action
- Action方法参数绑定
- 内部对象的DI化
- 关键对象的参数传递
- 抽象集成第三方DI框架
- MVC模式集成
- 框架级的DI支持功能
- 配置
- WebSocket
- JWT
- swagger
- GRpc
- OAuth2
- Prometheus
- 安全
package main
import ...
func main() {
webHost := CreateCustomWebHostBuilder().Build()
webHost.Run()
}
// 自定义HostBuilder并支持 MVC 和 自动参数绑定功能,简单情况也可以直接使用CreateDefaultBuilder 。
func CreateCustomBuilder() *Abstractions.HostBuilder {
return YoyoGo.NewWebHostBuilder().
SetEnvironment(Context.Prod).
UseFastHttp().
//UseServer(YoyoGo.DefaultHttps(":8080", "./Certificate/server.pem", "./Certificate/server.key")).
Configure(func(app *YoyoGo.WebApplicationBuilder) {
app.UseStatic("Static")
app.UseEndpoints(registerEndpointRouterConfig)
app.UseMvc(func(builder *Mvc.ControllerBuilder) {
builder.AddController(contollers.NewUserController)
})
}).
ConfigureServices(func(serviceCollection *DependencyInjection.ServiceCollection) {
serviceCollection.AddTransientByImplements(models.NewUserAction, new(models.IUserAction))
}).
OnApplicationLifeEvent(getApplicationLifeEvent)
}
//region endpoint 路由绑定函数
func registerEndpoints(router Router.IRouterBuilder) {
router.GET("/error", func(ctx *Context.HttpContext) {
panic("http get error")
})
//POST 请求: /info/:id ?q1=abc&username=123
router.POST("/info/:id", func (ctx *Context.HttpContext) {
qs_q1 := ctx.Query("q1")
pd_name := ctx.Param("username")
userInfo := &UserInfo{}
_ = ctx.Bind(userInfo) // 手动绑定请求对象
strResult := fmt.Sprintf("Name:%s , Q1:%s , bind: %s", pd_name, qs_q1, userInfo)
ctx.JSON(200, Std.M{"info": "hello world", "result": strResult})
})
// 路由组功能实现绑定 GET 请求: /v1/api/info
router.Group("/v1/api", func(router *Router.RouterGroup) {
router.GET("/info", func (ctx *Context.HttpContext) {
ctx.JSON(200, Std.M{"info": "ok"})
})
})
// GET 请求: HttpContext.RequiredServices获取IOC对象
router.GET("/ioc", func (ctx *Context.HttpContext) {
var userAction models.IUserAction
_ = ctx.RequiredServices.GetService(&userAction)
ctx.JSON(200, Std.M{"info": "ok " + userAction.Login("zhang")})
})
}
//endregion
//region 请求对象
type UserInfo struct {
UserName string `param:"username"`
Number string `param:"q1"`
Id string `param:"id"`
}
// ----------------------------------------- MVC 定义 ------------------------------------------------------
// 定义Controller
type UserController struct {
*Controller.ApiController
userAction models.IUserAction // IOC 对象参数
}
// 构造器依赖注入
func NewUserController(userAction models.IUserAction) *UserController {
return &UserController{userAction: userAction}
}
// 请求对象的参数化绑定
type RegiserRequest struct {
Controller.RequestParam
UserName string `param:"username"`
Password string `param:"password"`
}
// Register函数自动绑定参数
func (this *UserController) Register(ctx *Context.HttpContext, request *RegiserRequest) ActionResult.IActionResult {
result := Controller.ApiResult{Success: true, Message: "ok", Data: request}
return ActionResult.Json{Data: result}
}
// use userAction interface by ioc
func (this *UserController) GetInfo() Controller.ApiResult {
return this.OK(this.userAction.Login("zhang"))
}
// Web程序的开始与停止事件
func fireApplicationLifeEvent(life *YoyoGo.ApplicationLife) {
printDataEvent := func(event YoyoGo.ApplicationEvent) {
fmt.Printf("[yoyogo] Topic: %s; Event: %v\n", event.Topic, event.Data)
}
for {
select {
case ev := <-life.ApplicationStarted:
go printDataEvent(ev)
case ev := <-life.ApplicationStopped:
go printDataEvent(ev)
break
}
}
}