zoukankan      html  css  js  c++  java
  • YoyoGo基于ASP.NET Core设计的Golang实现

    YoyoGo

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

    Github

    https://github.com/yoyofx/yoyogo

    特色

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

    框架安装

    go get github.com/yoyofx/yoyogo
    

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

    go version < 1.13

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

    go version >= 1.13

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

    简单的例子

    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
    }
    

    实现进度

    标准功能

    • [X] 打印Logo和日志(YoyoGo)
    • [X] 统一程序输入参数和环境变量 (YoyoGo)
    • [X] 简单路由器绑定句柄功能
    • [X] HttpContext 上下文封装(请求,响应)
    • [X] 静态文件端点(静态文件服务器)
    • [X] JSON 序列化结构(Context.M)
    • [X] 获取请求文件并保存
    • [X] 获取请求数据(form-data,x-www-form-urlencoded,Json ,XML,Protobuf 等)
    • [X] Http 请求的绑定模型(Url, From,JSON,XML,Protobuf)

    响应渲染功能

    • [X] Render Interface
    • [X] JSON Render
    • [X] JSONP Render
    • [X] Indented Json Render
    • [X] Secure Json Render
    • [X] Ascii Json Render
    • [X] Pure Json Render
    • [X] Binary Data Render
    • [X] TEXT
    • [X] Protobuf
    • [X] MessagePack
    • [X] XML
    • [X] YAML
    • [X] File
    • [X] Image
    • [X] Template
    • [X] Auto formater Render

    中间件

    • [X] Logger
    • [X] StaticFile
    • [X] Router Middleware
    • [ ] Session
    • [ ] CORS
    • [ ] GZip
    • [X] Binding
    • [ ] Binding Valateion

    路由

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

    MVC

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

    Dependency injection

    • [X] 抽象集成第三方DI框架
    • [X] MVC模式集成
    • [X] 框架级的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
    ", event.Topic, event.Data)
    	}
    	for {
    		select {
    		case ev := <-life.ApplicationStarted:
    			go printDataEvent(ev)
    		case ev := <-life.ApplicationStopped:
    			go printDataEvent(ev)
    			break
    		}
    	}
    }
    
    
  • 相关阅读:
    转载---JVM四种引用--用于记录知识
    Ionic的安装、创建、及一些记录
    Angular响应式表单--附上完整代码演示
    Angular自定义模块—使用路由实现懒加载--及错误解决
    Angular自定义模块(普通)
    Angula获取服务器数据
    Angular同步与异步获取服务数据(附完整代码)
    Angular父子组件的方法传递以及数据传递
    logrotate
    Capistrano 3
  • 原文地址:https://www.cnblogs.com/maxzhang1985/p/12981989.html
Copyright © 2011-2022 走看看