Eudore

github: https://github.com/eudore/eudore

Eudore是一个自由扩展web框架,框架本身提供基础的框架操作和各种机制实现功能,对于简单的应用框架本身就可以轻易的处理,对于构建复杂的程序基于扩展思路可以轻松添加任意方法和修改内置逻辑,而Eudore本身就提供函数扩展机制、控制器执行机制、中间件运行机制、路由匹配算法、内置日志输出、集成配置及操作库等功能,向设计有序、逻辑简化、组件解耦的发展方向不停前进。

eudore解决一下痛点:

  • 自定义扩展能力,不修改源码的前提下修改任意逻辑。
  • 内置Logger输出全部提示,只要有错误就会自动输出。
  • 高性能功能齐全路由器,15项设计目标,不会出现路由器优先级等问题。
  • Context自动闭包封装,复用常用逻辑,可以使用自定义处理函数类型,例如func(Context) error
  • 低代码复杂度减少和中文注释降低阅读难度

基于完全解耦实现六主要五辅助的结构,六主:App、Config、Logger、Server、Router、Context,五辅:Handler、Controller、Bind、Render、Validater。

各部分定义:

名称 作用 定义 功能
Application 运行对象主体 app.go 全局中间件
启动端口监听
阻塞运行服务
获取配置值并转换类型
Config 配置数据管理 config.go 使用自定义map或struct作为数据存储
支持Lock并发安全
基于字符串路径层次访问属性
自定义配置解析函数
解析多json文件
解析命令行长短参数
解析Env环境变量
配置差异化
根据结构体生成帮助信息
切换工作目录
Logger App和Ctx日志输出 logger.go 五级日志格式化输出
日志条目带Fields属性
json有序格式化输出
日志器初始化前日志处理
文件行信息输出
默认输入文件切割并软连接。
Server http Server启动 server.go net/http启动服务
启动fastcgi监听
配置信息启动端口监听
自签私有证书启动https
统一接入net/http.Server日志
Router 请求路由选择 router.go routerstd.go 组路由
中间件或函数扩展注册在局部作用域/全局作用域
添加控制器
显示路由注册debug信息
高性能(httprouter性能的70%-90%,使用更少的内存)
低代码复杂度(RouterCoreStd支持5级优先级 一处代码复杂度19不满足)
请求获取额外的默认参数(包含当前路由匹配规则)
变量和通配符匹配
匹配优先级 常量 > 变量校验 > 变量 > 通配符校验 > 通配符(RouterCoreStd五级优先级)
方法优先级 指定方法 > Any方法(指定方法会覆盖Any方法,反之不行)
变量和通配符支持正则和自定义函数进行校验数据
变量和通配符支持常量前缀
获取注册的全部路由规则信息(RouterCoreBebug实现)
基于Host进行路由规则匹配(RouterCoreHost实现)
允许运行时进行动态增删路由器规则(RouterCoreStd实现,外层需要RouterCoreLock包装一层)
Context 请求处理上下文 context.go context.Context、eudore.ResponseWriter、*http.Request、eudore.Logger对象读写
中间件机制执行
基本请求信息
数据Bind和Validate
重复读取请求body
param、query、header、cookie、form读写
状态码、header、重定向、push、body写入
数据写入Render
5级日志格带fields格式化属性
Handler 请求处理函数 handler.go 自实现定义处理函数方法类型扩展
默认16种处理函数扩展和12种控制器处理扩展
设置处理函数名称
Controller 解析执行控制器 controller.go 控制器处理,将控制器对应方法转换成路由注册
有状态和无状态控制器,使用控制器处理扩展(ControllerBase controllerPoolSingleton)
路由映射控制器,将方法转换成一般的路由处理函数,使用函数扩展(ControllerAutoRoute)。
控制器构造错误传递(NewControllerError)
控制器前置和后置处理函数,Init和Release方法在控制器方法前后调用
自定义控制器函数映射关系(实现func ControllerRoute() map[string]string)
自定义控制器路由组和路由参数(实现func ControllerParam(pkg, name, method string) string)
控制器路由组合,如果组合一个名称为xxxController控制器,会组合获得xxx控制器的路由方法
控制器方法组合,如果组合一个名称非xxxController控制器,可以控制器属性ctl.xxx直接调用方法。
Bind 请求数据反序列化 bindrender.go Form、Header、JSON、URL、XML请求数据绑定
根据请求类型选择绑定(BindDefault)
Render 响应数据序列化 bindrender.go 根据请求类型选择绑定(RenderDefault)
模板、Json、Text、XML类型数据渲染
JSON渲染根据选择是否格式化输出
Validater 数据校验 validater.go

特性

扩展

自由扩展能力是eudore最大的特点。

  • eudore App是一个简单的App实现,对于复杂功能App可以通过组合定制一个需要的App。
  • Server、Router、Logger、Config、Context、Controller、Binder、Renderer、Validater等部分都是接口,可以使用接口重写逻辑。
  • Context和Controller执行函数具有扩展机制,可以对其扩展额外的执行逻辑和方法。
  • 超过95%的代码可以重新实现或移除。

易用

eudore由于具有强大的扩展机制和高度解耦,非必要的配置选项和逻辑;接口即为逻辑,所有方法名称就表示其实现的逻辑,不存存在一些额外的逻辑。

eudore框架核心仅一个包,包含多种内置实现共6200+核心代码,同时不具有其他依赖库,代码覆盖率测试100.00%。

App、Context、Controller可以不修改源码的前提下,额外添加任意方法。

可以使用任意形式的请求处理参数,例如func(Context) error类型函数就会自动处理error返回500。

内置Logger库,框架内部返回错误将自动输出日志,不会忽略掉出现error。

内置Config库,可以使用Map或Struct保存数据,支持环境变量、命令行参数设置配置、并发安全、差异化配置。

功能丰富默认具有100+exmaple,18种中间件(黑名单、限速、限流、熔断、缓存、路由重写等)。

性能

eudore各个部分均没用明显的性能瓶颈,最差情况下与其他库性能相识。

在关键实现中使用对象复用、静态化、benchmark排查等基本方法,避免了各类性能浪费,同时基于易扩展默认并没有多的额外逻辑。

  • Server 部分具有两种实现,nethttp适配和独立开发的eserver,eserver重新实现的http协议,细节不一定完善,但是有默认的nethttp兜底,性能最差的情况与nethttp略低。
  • Router 独立重新实现的路由器,性能具有httprouter性能的70%-90%,内存占用少数倍,并扩展多项功能。
  • Config 用于初始化使用,可以忽略性能对运行影响,可以把config当作一个map或struct使用。
  • Logger 需要输出的多项Field,默认实现使用的json输出,使用json字符拼接,性能不低于默认logrus。
  • Binder & Renderer 通常实现,可以不使用或自行重写。
  • Controller 默认使用反射获取并执行函数,性能与其他反射mvc相似。
  • HandlerFunc 处理函数扩展在不计算网络和业务的情况下,对框架性能损耗不足1%。
  • Validate 实现数据校验器

源码文件关系

                                       app.go
                                         |
        ------------------------------------------------------------------------------
        |           |            |           |          |             |              |
    config.go   logger.go   router.go   server.go   context.go   bindrender.go   validater.go
        |                       |
   converter.go                 |
                 -------------------------------
                 |              |              |
             handler.go    routerstd.go   controller.go

上述文件相关间的关系:

  • app.go 组合Config、Logger、Router、Server、Context、Bind、Render、Validate、GetWarp等对象定义App,对应源码文件定义每部分对象。
  • config.go 定义Config接口相关对象,同时实现内置两种Config对象ConfigMap和ConfigEudore;converter.go为configEudore提供一些基础函数(Set & Get)支持。
  • logger.go 定义Logger接口相关对象,实现LoggerStd、LooggerInit对象
  • server.go 定义Server接口相关对象,实现默认Server版本ServerStd。
  • router.go 定义Router接口相关对象,实现RouterStd对象和中间件存储前缀树;
  • routerstd.go 定义RouterCoreStd实现,使用radix实现高性能路由器。
  • context.go 定义Context接口,同时实现默认Context对象和ContextBase;
  • handler.go 定义http Handler对象以及实现处理函数扩展机制。
  • controller.go 定义控制器相关接口,同时给与几种默认控制器实现。
  • bindrender.go 定义Binder & Renderer对象并实现。
  • validater.go 定义Validate接口和实现。

下列文件未出现在上述关系图,提供了基本对象的支持:

  • const.go 定义全部常量。
  • http.go 定义http对象。
  • util.go 实现简单类型转换函数封装。

results matching ""

    No results matching ""