Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up

🦄🌈 YoyoGo is a simple, light and fast , dependency injection based micro-service framework written in Go. Support Nacos ,Consoul ,Etcd ,Eureka ,kubernetes.

License

NotificationsYou must be signed in to change notification settings

yoyofx/yoyogo

Repository files navigation

中文 /English

YoyoGo 简单、轻量、快速、基于依赖注入的微服务框架

ReleaseGoGoVersionReportDocumentationContributorsLicense

YoyoGo 特色

  • 漂亮又快速的路由器 & MVC 模式 .
  • 丰富的中间件支持 (handler func & custom middleware) .
  • 微服务框架抽象了分层,在一个框架体系兼容各种server实现,如 rest,grpc等 .
  • 充分运用依赖注入DI,管理运行时生命周期,为框架提供了强大的扩展性 .
  • 功能强大的微服务集成能力 (Nacos, Eureka, Consul, ETCD) .
  • 受到许多出色的 Go Web 框架的启发,并实现了多种 server :fasthttpnet.httpgrpc .

framework desgin

QQ交流群:780385870 (Go浪文学院) , 在这里感谢贾国锦帮忙设计的logo很漂亮。

也可以加入我的公众号,通过公众号入群菜单进入微信群,主要还是在微信上活动啦。

框架安装

go get github.com/yoyofx/yoyogo

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

go version < 1.20

window 下在 cmd 中执行:set GO111MODULE=onset GOPROXY=https://goproxy.cn,directlinux  下执行:export GO111MODULE=onexport GOPROXY=https://goproxy.cn,direct

go version >= 1.13

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

vendor

go mod vendor       // 将依赖包拷贝到项目目录中去

简单的例子

package mainimport...funcmain() {WebApplication.CreateDefaultBuilder(func(rb router.IRouterBuilder) {rb.GET("/info",func (ctx*context.HttpContext) {// 支持Group方式ctx.JSON(200, context.H{"info":"ok"})        })    }).Build().Run()//默认端口号 :8080}

依赖框架模块

只涉及框架使用或贡献过的库

github.com/yoyofxteam/dependencyinjectiongithub.com/yoyofxteam/nacos-viper-remotegithub.com/yoyofxteam/reflectxgithub.com/shima-park/agollo

实现进度

标准功能

  • 打印Logo和日志(YoyoGo)
  • 统一程序输入参数和环境变量 (YoyoGo)
  • 简单路由器绑定句柄功能
  • HttpContext 上下文封装(请求,响应)
  • 静态文件端点(静态文件服务器)
  • JSON 序列化结构(Context.H)
  • 获取请求文件并保存
  • 获取请求数据(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
  • CORS
  • Binding
  • JWT
  • RequestId And Tracker for SkyWorking

路由

  • GET,POST,HEAD,PUT,DELETE 方法支持
  • 路由解析树与表达式支持
  • RouteData路由数据 (/api/:version/) 与 Binding的集成
  • 路由组功能
  • MVC默认模板功能
  • MVC 自定义路由
  • 路由过滤器 Filter

MVC

  • 路由请求触发Controller&Action
  • Action方法参数绑定
  • 内部对象的DI化
  • 关键对象的参数传递

Dependency injection

  • 抽象集成第三方DI框架
  • MVC模式集成
  • 框架级的DI支持功能

扩展

  • 配置
  • WebSocket
  • JWT
  • swagger
  • GRpc
  • Prometheus

进阶范例

package mainimport...funcmain() {webHost:=CreateCustomWebHostBuilder().Build()webHost.Run()}// 自定义HostBuilder并支持 MVC 和 自动参数绑定功能,简单情况也可以直接使用CreateDefaultBuilder 。funcCreateCustomBuilder()*abstractions.HostBuilder {configuration:=abstractions.NewConfigurationBuilder().AddEnvironment().AddYamlFile("config").Build()returnWebApplication.NewWebHostBuilder().UseConfiguration(configuration).Configure(func(app*WebApplication.WebApplicationBuilder) {app.UseMiddleware(middlewares.NewCORS())//WebApplication.UseMiddleware(middlewares.NewRequestTracker())app.UseStaticAssets()app.UseEndpoints(registerEndpointRouterConfig)app.UseMvc(func(builder*mvc.ControllerBuilder) {//builder.AddViews(&view.Option{Path: "./static/templates"})builder.AddViewsByConfig()builder.AddController(contollers.NewUserController)builder.AddFilter("/v1/user/info",&contollers.TestActionFilter{})})}).ConfigureServices(func(serviceCollection*dependencyinjection.ServiceCollection) {serviceCollection.AddTransientByImplements(models.NewUserAction,new(models.IUserAction))//eureka.UseServiceDiscovery(serviceCollection)//consul.UseServiceDiscovery(serviceCollection)nacos.UseServiceDiscovery(serviceCollection)}).OnApplicationLifeEvent(getApplicationLifeEvent)}//region endpoint 路由绑定函数funcregisterEndpoints(rb router.IRouterBuilder) {Endpoints.UseHealth(rb)Endpoints.UseViz(rb)Endpoints.UsePrometheus(rb)Endpoints.UsePprof(rb)Endpoints.UseJwt(rb)//swagger api documentendpoints.UseSwaggerDoc(rb,swagger.Info{Title:"YoyoGO 框架文档演示",Version:"v1.0.0",Description:"框架文档演示swagger文档 v1.0 [ #yoyogo](https://github.com/yoyofx/yoyogo).",TermsOfService:"https://dev.yoyogo.run",Contact: swagger.Contact{Email:"zl.hxd@hotmail.com",Name:"yoyogo",},License: swagger.License{Name:"MIT",Url:"https://opensource.org/licenses/MIT",},},func(openapi*swagger.OpenApi) {openapi.AddSecurityBearerAuth()})rb.GET("/error",func(ctx*context.HttpContext) {panic("http get error")})//POST 请求: /info/:id ?q1=abc&username=123rb.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, context.H{"info":"hello world","result":strResult})})// 路由组功能实现绑定 GET 请求:  /v1/api/inforb.Group("/v1/api",func(router*router.RouterGroup) {router.GET("/info",func(ctx*context.HttpContext) {ctx.JSON(200, context.H{"info":"ok"})})})// GET 请求: HttpContext.RequiredServices获取IOC对象rb.GET("/ioc",func(ctx*context.HttpContext) {varuserAction models.IUserAction_=ctx.RequiredServices.GetService(&userAction)ctx.JSON(200, context.H{"info":"ok "+userAction.Login("zhang")})})}//endregion//region 请求对象typeUserInfostruct {UserNamestring`param:"username"`Numberstring`param:"q1"`Idstring`param:"id"`}// ----------------------------------------- MVC 定义 ------------------------------------------------------// 定义ControllertypeUserControllerstruct {*mvc.ApiControlleruserAction models.IUserAction// IOC 对象参数}// 构造器依赖注入funcNewUserController(userAction models.IUserAction)*UserController {return&UserController{userAction:userAction}}// 请求对象的参数化绑定 , 使用 doc属性标注 支持swagger文档typeRegisterRequeststruct {mvc.RequestBody`route:"/api/users/register" doc:"用户注册"`UserNamestring`uri:"userName" doc:"用户名"`Passwordstring`uri:"password" doc:"密码"`TestNumberuint64`uri:"num" doc:"数字"`}// Register函数自动绑定参数func (this*UserController)Register(ctx*context.HttpContext,request*RegiserRequest) actionresult.IActionResult {result:= mvc.ApiResult{Success:true,Message:"ok",Data:request}return actionresult.Json{Data:result}}// use userAction interface by iocfunc (this*UserController)GetInfo() mvc.ApiResult {returnthis.OK(this.userAction.Login("zhang"))}// DocumentResponse custom document response , use doc tag for swaggertypeDocumentResponsestruct {Messagestring`json:"message" doc:"消息"`List    []DocumentDto`json:"list" doc:"文档列表"`Successbool`json:"success" doc:"是否成功"`}// Swagger API 文档支持func (controllerUserController)GetDocumentList(request*struct {mvc.RequestGET`route:"/v1/user/doc/list" doc:"获取全部文档列表"`})DocumentResponse {returnDocumentResponse{Message:"GetDocumentList",List: []DocumentDto{{Id:1,Name:"test1",Time:time.Now()}, {Id:2,Name:"test2",Time:time.Now()},{Id:3,Name:"test3",Time:time.Now()}, {Id:4,Name:"test4",Time:time.Now()},{Id:5,Name:"test5",Time:time.Now()}, {Id:6,Name:"test6",Time:time.Now()},},Success:true}}// Web程序的开始与停止事件funcfireApplicationLifeEvent(life*abstractions.ApplicationLife) {printDataEvent:=func(event abstractions.ApplicationEvent) {fmt.Printf("[yoyogo] Topic: %s; Event: %v\n",event.Topic,event.Data)}for {select {caseev:=<-life.ApplicationStarted:goprintDataEvent(ev)caseev:=<-life.ApplicationStopped:goprintDataEvent(ev)break}}}

About

🦄🌈 YoyoGo is a simple, light and fast , dependency injection based micro-service framework written in Go. Support Nacos ,Consoul ,Etcd ,Eureka ,kubernetes.

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages


[8]ページ先頭

©2009-2025 Movatter.jp