1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/yoyofx-yoyogo

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 12 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 02.12.2024 00:22 fab1704

YoyoGo: простой, лёгкий, быстрый микросервисный фреймворк на основе внедрения зависимостей

Документация: https://dev.yoyogo.run

Особенности YoyoGo:

  • Красивый и быстрый маршрутизатор и MVC-модель.
  • Богатая поддержка промежуточных программ (handler func & custom middleware).
  • Микросервисная архитектура абстрагирует слои, обеспечивая совместимость с различными серверными реализациями, такими как REST и gRPC.
  • Полное использование внедрения зависимостей (DI) для управления жизненным циклом во время выполнения и предоставления мощной расширяемости.
  • Мощные возможности интеграции микросервисов (Nacos, Eureka, Consul, etcd).
  • Вдохновлён многими выдающимися веб-фреймворками Go и реализует различные серверы: fasthttp и net.http, а также gRPC.

QQ-чат: 780385870 (Go 浪文学院), где мы благодарим Джао Гоуцзиня за помощь в создании логотипа.

Также присоединяйтесь к моему публичному аккаунту, чтобы войти в группу через меню «Войти в группу» в приложении WeChat. Основная активность происходит в WeChat.

Установка фреймворка

go get github.com/yoyofx/yoyogo

Установка зависимостей (из-за некоторых причин не удаётся загрузить зависимости из Китая)

Для версии go < 1.20:

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

Для версии go >= 1.13:

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

Vendor:

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
}

Зависимости модулей фреймворка Только библиотеки, которые были использованы или внесены в проект:

github.com/yoyofxteam/dependencyinjection

github.com/yoyofxteam/nacos-viper-remote  

github.com/yoyofxteam/reflectx

github.com/shima-park/agollo

Прогресс реализации

Стандартные функции:

  • Печать логотипа и журнала (YoyoGo).
  • Унифицированный ввод параметров программы и переменных среды (YoyoGo).
  • Простая привязка обработчика функций к маршрутизатору.
  • Контекст HttpContext (запрос, ответ).
  • Статический файловый сервер.
  • Сериализация JSON структуры (Context.H).
  • Получение файла запроса и сохранение.
  • Извлечение данных запроса (form-data, x-www-form-urlencoded, Json, XML, Protobuf и т. д.).
  • Привязка модели HTTP-запроса (Url, From, JSON, XML, Protobuf).

Функции рендеринга ответа:

  • Интерфейс рендеринга.
  • JSON рендеринг.
  • JSONP рендеринг.
  • Indented Json рендеринг.
  • Secure Json рендеринг.
  • Ascii Json рендеринг.
  • Pure Json рендеринг.
  • Binary Data рендеринг.
  • TEXT.
  • Protobuf.
  • MessagePack.
  • XML.
  • YAML.
  • File.
  • Image.
  • Template.
  • Auto formater рендеринг.

Промежуточное ПО:

  • Logger.
  • StaticFile.
  • Router Middleware.
  • CORS.
  • Binding.
  • JWT.
  • RequestId And Tracker for SkyWorking.

Маршрутизация:

  • Поддержка методов GET, POST, HEAD, PUT, DELETE.
  • Маршрутизация с использованием дерева и выражений.
  • Интеграция RouteData и Binding.
  • Групповые маршруты.
  • MVC по умолчанию.
  • Пользовательская маршрутизация MVC.
  • Фильтр маршрутов.

MVC:

  • Запуск контроллера и действия при запросе маршрута.
  • Привязка параметров метода действия.
  • Внедрение внутренних объектов.
  • Передача ключевых объектов в параметрах.

Внедрение зависимостей:

  • Абстракция сторонних DI-фреймворков.
  • Интеграция MVC.
  • Поддержка DI на уровне фреймворка.

Расширение:

  • Настройка.
  • WebSocket.
  • JWT.
  • Swagger.
  • GRpc.
  • Prometheus. Вот перевод текста на русский язык:
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: "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=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
        }
    }
}

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/yoyofx-yoyogo.git
git@api.gitlife.ru:oschina-mirror/yoyofx-yoyogo.git
oschina-mirror
yoyofx-yoyogo
yoyofx-yoyogo
master