YoyoGo微服务框架入门系列-框架诞生记

YoyoGo#

YoyoGo 是一个用 Go 编写的简单,轻便,快速的 微服务框架,目前已实现了Web框架的能力,但是底层设计已支持多种服务架构。

Github#

https://github.com/yoyofx/yoyogo

特色#

  • 漂亮又快速的路由器
  • 中间件支持 (handler func & custom middleware)
  • 对 REST API 友好
  • 支持 MVC 模式
  • 受到许多出色的 Go Web 框架的启发

框架安装#

Copy
go get github.com/yoyofx/yoyogo

安装依赖 (由于某些原因国内下载不了依赖)#

go version < 1.13#

Copy
window 下在 cmd 中执行: set GO111MODULE=on set GOPROXY=https://goproxy.cn linux 下执行: export GO111MODULE=on export GOPROXY=https://goproxy.cn

go version >= 1.13#

Copy
go env -w GOPROXY=https://goproxy.cn,direct

简单的例子#

Copy
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 }

实现进度#

标准功能#

响应渲染功能#

中间件#

路由#

MVC#

Dependency injection#

扩展#

进阶范例#

Copy
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 } } }
posted @   YOYOFx  阅读(1701)  评论(3编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2011-06-29 让Silverlight AutoCompleteBox控件支持多属性筛选
点击右上角即可分享
微信分享提示
CONTENTS