yoyogo
v1.8.7 Integrated swagger support
Chinês/inglês
Yoyogo simples, leve, rápido, estrutura de microsserviço baseada em injeção de dependência
QQ Comunicação Grupo: 780385870 (Go Lang Academy of Literature), gostaria de agradecer a Jia Guojin por ajudar a projetar o logotipo que é muito bonito.
Você também pode participar da minha conta oficial e inserir o grupo WeChat através do menu de entrada oficial da conta. O principal é fazer no WeChat.
go get github.com/yoyofx/yoyogowindow 下在 cmd 中执行:
set GO111MODULE=on
set GOPROXY=https://goproxy.cn,direct
linux 下执行:
export GO111MODULE=on
export GOPROXY=https://goproxy.cn,direct go env -w GOPROXY=https://goproxy.cn,direct
go mod vendor // 将依赖包拷贝到项目目录中去
package main
import ...
func main () {
WebApplication . CreateDefaultBuilder ( func ( rb router. IRouterBuilder ) {
rb . GET ( "/info" , func ( ctx * context. HttpContext ) { // 支持Group方式
ctx . JSON ( 200 , context. H { "info" : "ok" })
})
}). Build (). Run () //默认端口号 :8080
}Somente bibliotecas que foram usadas ou contribuídas pela estrutura
github . com / yoyofxteam / dependencyinjection
github . com / yoyofxteam / nacos - viper - remote
github . com / yoyofxteam / reflectx
github . com / shima - park / agollo package main
import
...
func main () {
webHost := CreateCustomWebHostBuilder (). Build ()
webHost . Run ()
}
// 自定义HostBuilder并支持 MVC 和 自动参数绑定功能,简单情况也可以直接使用CreateDefaultBuilder 。
func CreateCustomBuilder () * abstractions. HostBuilder {
configuration := abstractions . NewConfigurationBuilder ().
AddEnvironment ().
AddYamlFile ( "config" ). Build ()
return WebApplication . 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 路由绑定函数
func registerEndpoints ( rb router. IRouterBuilder ) {
Endpoints . UseHealth ( rb )
Endpoints . UseViz ( rb )
Endpoints . UsePrometheus ( rb )
Endpoints . UsePprof ( rb )
Endpoints . UseJwt ( rb )
//swagger api document
endpoints . 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 : "[email protected]" ,
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=123
rb . 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/info
rb . 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 ) {
var userAction models. IUserAction
_ = ctx . RequiredServices . GetService ( & userAction )
ctx . JSON ( 200 , context. H { "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 {
* mvc. ApiController
userAction models. IUserAction // IOC 对象参数
}
// 构造器依赖注入
func NewUserController ( userAction models. IUserAction ) * UserController {
return & UserController { userAction : userAction }
}
// 请求对象的参数化绑定 , 使用 doc属性标注 支持swagger文档
type RegisterRequest struct {
mvc. RequestBody `route:"/api/users/register" doc:"用户注册"`
UserName string `uri:"userName" doc:"用户名"`
Password string `uri:"password" doc:"密码"`
TestNumber uint64 `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 ioc
func ( this * UserController ) GetInfo () mvc. ApiResult {
return this . OK ( this . userAction . Login ( "zhang" ))
}
// DocumentResponse custom document response , use doc tag for swagger
type DocumentResponse struct {
Message string `json:"message" doc:"消息"`
List [] DocumentDto `json:"list" doc:"文档列表"`
Success bool `json:"success" doc:"是否成功"`
}
// Swagger API 文档支持
func ( controller UserController ) GetDocumentList ( request * struct {
mvc. RequestGET `route:"/v1/user/doc/list" doc:"获取全部文档列表"`
}) DocumentResponse {
return DocumentResponse { 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程序的开始与停止事件
func fireApplicationLifeEvent ( life * abstractions. ApplicationLife ) {
printDataEvent := func ( event abstractions. 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
}
}
}