# myserver **Repository Path**: jiffs/myserver ## Basic Information - **Project Name**: myserver - **Description**: 测试用服务端,支持graceful重启,支持解析启动配置文件等 - **Primary Language**: Go - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 1 - **Created**: 2016-06-16 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ======= myserver ==== ##介绍 myserver 是基于negroni/http开发的web框架,但对使用者来说是不需要关注底层的web框架是什么的,底层可以随时替换成任何web框架,而对业务开发来说是不感知的。 注释:negroni框架完全兼容http,可以去掉直接使用http,我个人比较喜欢negroni框架增加一个next http.HandlerFunc的参数,这样可以随时控制业务流向。 ##使用步骤 ###1.配置server.yaml文件 对使用者来说只需要配置location的映射关系配置即可,实例如下:
~~~ - locationblock : matchpath : /aaa handler : DefaultReturnHandler1 root : /root index : - index.html - index.htm - index.go expires : 30d ~~~ 解析yaml格式的server配置文件,配置文件结构参考nginx的conf配置,基本语意也是一致的,考虑golang语言的命名规范,将nginx变量间隔的下划线"_"去掉,golang按照驼峰模式命名,但考虑大小写明感性,配置变量必须是小写的才能被正确识别
###2.编写对应的handler函数 这些处理函数建议单独打包,不必须放在myserver包内,但有几个特殊要求:
* a)函数不带任何参数
* b)必须返回匿名的闭包函数
* c)匿名函数参数只支持两个:func(res http.ResponseWriter, req *http.Request) ,不可随意增加
* d)匿名函数返回值是:http.HandlerFunc
案例如下: ~~~ // DefaultReturnHandler2 /?test=xxx func DefaultReturnHandler2() http.HandlerFunc { return func(res http.ResponseWriter, req *http.Request) { fmt.Fprintf(res, "DefaultReturnHandler2, test = %s", req.FormValue("test")) } } ~~~ 这里多说几句,为什么用匿名函数闭包:
* a)考虑函数内部可能使用外部变量,为了避免变量被并发修改造成错误
* b)归一化参数,外部调用者不使用任何参数,返回类型统一为http.HandlerFunc
* c)更换框架简单,没有任何跟框架有关的信息出现,实现解耦,未来接口升级,不需要调整对外的接口形式
###3.添加函数注册的结构体 实例如下: ~~~ // New register FuncInfo func New() []FuncInfo { var fi []FuncInfo fi = make([]FuncInfo, 100) fi[0] = FuncInfo{Name: "DefaultReturnHandler1", PkgPath: "myserver/handle", FuncName: DefaultReturnHandler1, Decrib: "/"} fi[1] = FuncInfo{Name: "DefaultReturnHandler", PkgPath: "myserver/handle", FuncName: DefaultReturnHandler, Decrib: "/aa?test=aaa"} fi[2] = FuncInfo{Name: "DefaultReturnHandler2", PkgPath: "myserver/handle", FuncName: DefaultReturnHandler2, Decrib: "/"} return fi } ~~~ 实现上述三部即可完成一个完整的web服务及挂载到对应目录。
###4.配置支持include解析 ~~~ includes : dddddddd include : dddddddd include : bb ~~~ 有一点必须注意: include配置文件的缩进问题,必须符合yaml缩进模式,最外层的配置必须是左边没有空格的,也就是认为是顶级缩进,程序会根据引用的位置自动增加缩进的空格数量 当然这个工作还远没有结束,但不影响大家使用这个进行开发,未来也不需要修改代码逻辑
##其他说明 ###TODO: * 1、yaml的配置解析很多工作没有完成
* a)目前不支持多端口启动,无法实现多个进程端口绑定
* b)配置文件中很多配置没有启用和二次处理
* c)log处理没有实现,包括格式化问题和一些常用变量
* d)1K,2h,3M,4ms等简写转化为对应的整数类型没有处理
* e)函数名需要增加pkg包名匹配关系,避免未来函数名冲突问题
* f)https支持为实现
* g)tcp协议甚至非tcp协议支持
* 2、替换新的框架,未来可以随时替换成我们希望的框架,甚至自己实现一个web框架
* 3、配置文件类型升级,也可能不升级,暂时不是重点
* 4、test文件编写
###依赖组件: * 1、negroni框架
* 2、gracehttp,解决无缝重启问题
* 3、yaml/v2.0,yaml解析
###myserver
~~~ ./myserver -file conf/server.yaml ~~~