# Seinego Seine是基于Golang实现的一套**轻量级**、**高性能**的MVC开发框架,主要用于HTTP API、前端WEB、以及各种后台服务的开发。 Seine继承Go语言的优良传统,以KISS(Keep It Stupid Simple)原则为宗旨,保持整个框架的实用、简洁、易懂。让用户不仅成为框架的使用者,也可以很容易的成为框架的撑控者。 Seine开发框架非常轻量,整个框架的核心代码量控制在数百行内,使用者几乎可以在很短的时间内掌控整个框架代码以及内部的实现细节,并在此基础上,结合本身业务特点,快速进行二次开发。 通过Seine构建API开发框架,可以有效的保证请求处理流的统一以及开发规范的统一,并实现API服务的快速构建。 Seine不仅仅是一个开发框架,更重要的是,也会提供一系列的公共组件,解决一些面上的问题,例如 - **通用查询** 以API的形式,提供对二维数据源的通用查询,默认支持mysql。也可以快速扩展为对其它数据源的查询,比如MongoDB, ElasticSearch等等。通用查询以配置化,而非代码化的形式,快速完成查询功能的构建。与此同时,通用查询组件还会结合页面实现,提供一系列的配套服务。 - 根据规范的表结构(表存在自增主键和字段注释),自动生成查询配置文件(至少可以节省90%的配置文件编写工作)。 - 查询字段特殊处理器(Handler)文档自动生成,并可通过页面查看。 - 根据配置文件内容,自动生成面向用户的API协议文档。 > 通过通用查询组件,并且结合配套的开发工具,提供API查询服务,几乎可以实现API的量产式开发。 - **通用操作** 以API的形式,提供对mysql的增、删、改操作。在开发过程中以配置化,而非代码化的形式,快速完成对数据表增、删、改的操作,并且在组件中集成各种数据校验规则。与此同时,通用操作组件还会结合页面实现,提供一系列的配套服务。 - 根据规范的表结构(表存在自增主键和字段注释),自动生成通用操作配置文件(至少可以节省90%的配置文件编写工作)。 - 操作字段特殊处理器(Handler)文档自动生成,并可通过页面查看。 - 根据配置文件内容,自动生成面向用户的API协议文档。 > 通过通用操作组件,并且结合配套的开发工具,提供API增、删、改服务,几乎可以实现API的量产式开发。 - **通用校验** 通过配置数据模板的方式,完成对复杂数据结构的校验。在开发过程中以配置化,而非代码化的形式,快速完成数据校验。 - **页面通用列表** 通过配置文件,而非代码开发的方式,自动生成页面数据列表,生成的页面数据列表包括以下功能。 - 字段条件查询 - 列表所显示的字段个性化定制 - 记录删除 - 记录新增、修改(结合以下将提到的页面通用表单组件) - 记录批量导入(结合以下将提到的页面通用表单组件) - 列表导出 - 列表刷新 > 在页面通用列表的实现过程中,仍然会提供页面工具,根据数据表结构信息自动生成配置文件,以达到页面列表量产式开发的目的。 同时,根据已实现的列表处理器逻辑以及查询控件逻辑,自动生成文档指南,用户可以通过在线文档,即可以了解那些处理器和查询控件类型是可用的,以及如何使用,实现功能文档的规范化管理。 - **页面通用表单** 通过配置文件,而非代码开发的方式,自动生成页面数据输入表单,生成的页面数据输入表单包括以下功能。 - 根据配置文件自动生成字段输入控件(控件类型根据配置文件的Control指令确定)。 - 根据配置文件自动校验表单数据的合法性,包括前端JS校验以及后台逻辑二次校验。 - 根据配置文件中指定的逻辑进行数据新增、修改操作(其中指定的逻辑可以为通用逻辑或特定逻辑)。 > 在页面通用表单的实现过程中,仍然会提供页面工具,根据数据表结构自动生成配置文件,以达到页面表单量产式开发的目的。同时,根据已实现的表单控件逻辑以及表单处理器逻辑,自动生成文档指南,用户可以通过在线文档,即可以了解那些表单控件和表单处理器是可用的,以及如何使用,实现功能文档的规范化管理。 ## 性能评测 > 压测环境:24核CPU/64G内存/tlinux2.2/空闲物理机 相同的环境下分别对Seine, Beego框架进行1-2000不同级别的空载并发测试,每轮测试请求20000次。当并发量大于200后,Seine的QPS维持在6.8w/s左右,而Beego的QPS维持在3.2w/s左右。 ## 安装与使用 ### 安装 下载源码包,并将源码包解压到某个目录下。 ### 导入DB基础表(MySQL) 将{源码根目录}/documents/database/下的所有sql语句导入MySQL数据库(seine)中,如 mysql -h 127.0.0.1 --port=3306 -u seine -pseine123 --default-character-set=utf8 seine < seine.sql 系统默认的mysql连接配置为 seine:seine123@tcp(127.0.0.1:3306)/seine?charset=utf8&timeout=3s&writeTimeout=5s 如需修改请前往 {源码根目录}/configs/app-config-test.conf (用于开发测试环境) {源码根目录}/configs/app-config-product.conf (用于运营环境) 登录系统的初始用户名: admin, 密码: M8478cya (成功登录后请及时修改密码,或新建用户后删除该帐号) ### 编译 > GO编译器建议使用go1.11.1或以上的版本(之下的版本在逻辑高并发动态调用下存在编译器bug) 在linux下,进入到源码包的bin目录下,执行 chmod +x * ./build.sh 在windows下,通过cmd命令行,进入到源码包的bin目录下,执行 build.bat 即可快速完成编译,编译完成后,会在bin目录下生成一个seine的二进制文件(windows下为seine.exe) ### 启动服务 编译完成后,可以通过以下命令启动Http服务 在linux下 ./seine -cmd=HttpServer -arg=9701 //端口为9701 在windows下 seine.exe -cmd=HttpServer -arg=9701 //端口为9701 启动Http Server时,这里的-arg参数可以指定为有效的监听端口 ### 开始请求 服务成功启动后,输入 http://127.0.0.1:9701/ 可以看到欢迎信息,说明运行正常。 另外,还可以测试一下API服务的返回,发起HTTP POST请求,如 curl -d '{"Action":"Test","Method":"Run","SystemKey":"ucloud"}' http://127.0.0.1:9701/api 可以看到相应的返回信息 {"Data":"welcome to here.","Details":"","Return":0} 访问 http://127.0.0.1:9701/sys 进入开发者后台管理平台。 ----------- 到此,项目框架完成搭建,接下来,你就可以从 {源码根目录}/src/seine/main.go 开启Seine框架的探索之旅了。 > 建议使用框架之前,一定要读懂框架的核心源码,然后基于此进行具体业务适配和二次开发,才能在开发过程中游刃有余。 # 开发指南 ## 新增模块(子系统) > 在Seine框架中,为了使功能模板划分更明确,更易于组织,引入了模块的概念(也称为子系统)。 > > 比如我们将后台API服务(api)、API文档平台(docs)、开发者平台(sys)、后台管理系统(backend)等划分为不同的子系统模块。子系统模块可以没有UI(如后台API服务),也可以有不同的UI布局(如开发者平台、API文档平台、后台管理系统等)。 > > 这样,我们在同一个工程中就可以方便的衍生出各种不同的独立子系统模块,甚至可以通过不同的二级域名访问。 **新增子系统模块步骤** ### 1. 修改配置文件配置项 (必须) 进入configs/com-config.conf配置文件 ;模块配置,与controller下的子包相对应,最后一个为默认的请求子系统模块 Modules = shr;api;docs;backend;sys ### 2. 修改webServer主路由文件 (必须) 进入src/services/services.go switch modName { case "sys": ctrlObj, ctrlObjErr = csys.GetControllerInstance(ctrlName) if ctrlObjErr != nil { w.Write([]byte(ctrlObjErr.Error())) return } //更多模板在继续在此添加... //同时要求将名称添加到配置文件com-config.conf中的Modules项中 default: w.Write([]byte("module name " + modName + " is invalid.")) return } ### 3. 创建controller环境 (必须) 1. 进入src/controller目录下,创建子目录,目录名称格式为 c${模块名称} 2. 进入src/controller/c${模块名称}/目录下,创建route_table.go文件,可以考虑从其它模块下copy相应文件,然后重命名package名称,同时修改controlInPackage变量为相应的包名。 3. 进入src/controller/c${模块名称}/目录下,创建index.go文件,也可以考虑从其它模块下copy相应文件,重命名package名称,然后开始相关逻辑编写。 ### 4. 新子系统/模块页面菜单配置 (可选) 进入configs/json/ 目录下,创建菜单配置文件 menu_${模块名称}.json 然后在此文件中配置相关菜单项