- Notifications
You must be signed in to change notification settings - Fork42
🦄🌈 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
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
YoyoGo 简单、轻量、快速、基于依赖注入的微服务框架
- 漂亮又快速的路由器 & MVC 模式 .
- 丰富的中间件支持 (handler func & custom middleware) .
- 微服务框架抽象了分层,在一个框架体系兼容各种server实现,如 rest,grpc等 .
- 充分运用依赖注入DI,管理运行时生命周期,为框架提供了强大的扩展性 .
- 功能强大的微服务集成能力 (Nacos, Eureka, Consul, ETCD) .
- 受到许多出色的 Go Web 框架的启发,并实现了多种 server :fasthttp 和net.http 和grpc .
QQ交流群:780385870 (Go浪文学院) , 在这里感谢贾国锦帮忙设计的logo很漂亮。
也可以加入我的公众号,通过公众号入群菜单进入微信群,主要还是在微信上活动啦。
go get github.com/yoyofx/yoyogo
window 下在 cmd 中执行:set GO111MODULE=onset GOPROXY=https://goproxy.cn,directlinux 下执行:export GO111MODULE=onexport GOPROXY=https://goproxy.cn,direct
go env -w GOPROXY=https://goproxy.cn,direct
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
- 路由请求触发Controller&Action
- Action方法参数绑定
- 内部对象的DI化
- 关键对象的参数传递
- 抽象集成第三方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
Packages0
No packages published