# 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
~~~