ghttp router改进中

This commit is contained in:
john
2018-07-27 11:06:30 +08:00
parent 5480fb1440
commit 94e972b210
2 changed files with 54 additions and 54 deletions

90
TODO
View File

@ -1,52 +1,52 @@
ON THE WAY:
orm增加更多数据库支持
增加对于数据表Model的封装
更多数据库的ORM功能支持
考虑gdb对象管理增加二级连接池特性提高New&Close性能
增加图形验证码支持,至少支持数字和英文字母;
增加热编译工具,提高开发环境的开发/测试效率媲美PHP开发效率
增加可选择性的orm tag特性用以数据表记录与struct对象转换的键名属性映射
ghttp.Response增加输出内容后自动退出当前请求机制不需要用户手动return参考beego如何实现
Cookie&Session数据池化处理
ghttp.Client增加proxy特性
gtime增加对时区转换的封装并简化失去转换时对类似+80500时区的支持
改进gf-orm的where查询功能参考thinkphp 里的where查询语法
gpage分页增加对自定义后缀的支持如:2.html, 2.php等等
gvalid包增加tag与校验规则绑定的支持特性
ghttp获取参数支持直接转struct功能
map转struct增加对tag的支持
orm增加更多数据库支持
增加对于数据表Model的封装
更多数据库的ORM功能支持
考虑gdb对象管理增加二级连接池特性提高New&Close性能
增加图形验证码支持,至少支持数字和英文字母;
增加热编译工具,提高开发环境的开发/测试效率媲美PHP开发效率
增加可选择性的orm tag特性用以数据表记录与struct对象转换的键名属性映射
ghttp.Response增加输出内容后自动退出当前请求机制不需要用户手动return参考beego如何实现
Cookie&Session数据池化处理
ghttp.Client增加proxy特性
gtime增加对时区转换的封装并简化失去转换时对类似+80500时区的支持
改进gf-orm的where查询功能参考thinkphp 里的where查询语法
gpage分页增加对自定义后缀的支持如:2.html, 2.php等等
gvalid包增加tag与校验规则绑定的支持特性
ghttp获取参数支持直接转struct功能
map转struct增加对tag的支持
DONE:
1. gconv完善针对不同类型的判断例如尽量减少sprintf("%v", xxx)来执行string类型的转换
2. ghttp.Server请求执行中增加服务退出的方法不再执行后续操作
3. ghttp.Response对象完善并改进数据返回方法(Write/WriteString)
4. ghttp.Server请求执行中增加服务退出的方法不再执行后续操作
5. 增加fsnotify包支持
6. 改进gcfg和gview的文件自动更新机制
7. 将模板变量进行暴露,以便应用端可以进行灵活控制;
8. 跟踪第三方mxj包的issue问题https://github.com/clbanning/mxj/issues/48
9. gdb Where方法参数的改进研究是否可以将string参数类型修改为interface{}
10. gpage分页控制功能
11. https支持
12. ghttp.Server日志中增加请求时间和返回时间以便计算执行时间差
13. 由于去掉了gdb的单例模式并且将gins的部分对象封装迁移到了g包中需要同时梳理文档完善修改
14. 在代码中增加https与http同时开启使用的示例代码这块大家问得比较多
15. ghttp.Server多个事件之间通过ghttp.Request.Param自定义参数传参
16. 研究是否增加配置文件目录检索功能,特别是如何友好改进开发环境的配置文件默认目录问题;
17. 增加ghttp.Server不同状态码的自定义处理方法
18. ghttp.Server平滑重启方案
19. 完善gconv类型转换功能增加time.Time/time.Duration类型转换并增加benchmark测试脚本
20. 当二进制参数为nil时gjson.LoadContent并将gjson.Json对象ToMap时会报错
21. 改进控制器及执行对象注册,更友好地支持动态路由注册,例如:注册规则为 /channel/:name现有的控制器及执行对象注册很难友好支持这种动态形式
22. 当前gpage分页包的输出标签不支持li大多数CSS框架都是li+a标签模式需要提供可更加灵活的定制化功能实现
23. 平滑重启机制改进,以便于开发阶段调试;
24. 对grpool进行优化改进包括属性原子操作封装采用gtype实现修正设计BUGhttps://github.com/johng-cn/gf/issues/6
25. gredis增加redis密码支持
26. 改进ghttp.Server平滑重启机制当新进程接管服务后再使用进程间通信方式通知父进程销毁
27. gproc进程间通信增加分组特性不同的进程间可以通过进程ID以及分组名称发送/获取进程消息;
28. ORM增加获取被执行的sql语句的方法
29. gdb增加查询缓存特性
1. gconv完善针对不同类型的判断例如尽量减少sprintf("%v", xxx)来执行string类型的转换
2. ghttp.Server请求执行中增加服务退出的方法不再执行后续操作
3. ghttp.Response对象完善并改进数据返回方法(Write/WriteString)
4. ghttp.Server请求执行中增加服务退出的方法不再执行后续操作
5. 增加fsnotify包支持
6. 改进gcfg和gview的文件自动更新机制
7. 将模板变量进行暴露,以便应用端可以进行灵活控制;
8. 跟踪第三方mxj包的issue问题https://github.com/clbanning/mxj/issues/48
9. gdb Where方法参数的改进研究是否可以将string参数类型修改为interface{}
10. gpage分页控制功能
11. https支持
12. ghttp.Server日志中增加请求时间和返回时间以便计算执行时间差
13. 由于去掉了gdb的单例模式并且将gins的部分对象封装迁移到了g包中需要同时梳理文档完善修改
14. 在代码中增加https与http同时开启使用的示例代码这块大家问得比较多
15. ghttp.Server多个事件之间通过ghttp.Request.Param自定义参数传参
16. 研究是否增加配置文件目录检索功能,特别是如何友好改进开发环境的配置文件默认目录问题;
17. 增加ghttp.Server不同状态码的自定义处理方法
18. ghttp.Server平滑重启方案
19. 完善gconv类型转换功能增加time.Time/time.Duration类型转换并增加benchmark测试脚本
20. 当二进制参数为nil时gjson.LoadContent并将gjson.Json对象ToMap时会报错
21. 改进控制器及执行对象注册,更友好地支持动态路由注册,例如:注册规则为 /channel/:name现有的控制器及执行对象注册很难友好支持这种动态形式
22. 当前gpage分页包的输出标签不支持li大多数CSS框架都是li+a标签模式需要提供可更加灵活的定制化功能实现
23. 平滑重启机制改进,以便于开发阶段调试;
24. 对grpool进行优化改进包括属性原子操作封装采用gtype实现修正设计BUGhttps://github.com/johng-cn/gf/issues/6
25. gredis增加redis密码支持
26. 改进ghttp.Server平滑重启机制当新进程接管服务后再使用进程间通信方式通知父进程销毁
27. gproc进程间通信增加分组特性不同的进程间可以通过进程ID以及分组名称发送/获取进程消息;
28. ORM增加获取被执行的sql语句的方法
29. gdb增加查询缓存特性

View File

@ -14,8 +14,8 @@ import (
"gitee.com/johng/gf/g/util/gregex"
)
// handler缓存项根据URL.Path进行缓存因此对象中带有缓存参数
type handlerCacheItem struct {
// 路由检索缓存项根据URL.Path进行缓存因此对象中带有缓存参数
type routerCacheItem struct {
item *HandlerItem // 准确的执行方法内存地址
values map[string][]string // GET解析参数
}
@ -27,7 +27,7 @@ func (s *Server) getHandler(r *Request) *HandlerItem {
s.hmcmu.RLock()
defer s.hmcmu.RUnlock()
var cacheItem *handlerCacheItem
var cacheItem *routerCacheItem
cacheKey := s.handlerKey(r.GetHost(), r.Method, r.URL.Path)
if v := s.handlerCache.Get(cacheKey); v == nil {
cacheItem = s.searchHandler(r)
@ -35,7 +35,7 @@ func (s *Server) getHandler(r *Request) *HandlerItem {
s.handlerCache.Set(cacheKey, cacheItem, 0)
}
} else {
cacheItem = v.(*handlerCacheItem)
cacheItem = v.(*routerCacheItem)
}
if cacheItem != nil {
for k, v := range cacheItem.values {
@ -184,7 +184,7 @@ func (s *Server) compareHandlerItemPriority(newItem, oldItem *HandlerItem) bool
}
// 服务方法检索
func (s *Server) searchHandler(r *Request) *handlerCacheItem {
func (s *Server) searchHandler(r *Request) *routerCacheItem {
item := s.searchHandlerStatic(r)
if item == nil {
item = s.searchHandlerDynamic(r)
@ -193,21 +193,21 @@ func (s *Server) searchHandler(r *Request) *handlerCacheItem {
}
// 检索静态路由规则
func (s *Server) searchHandlerStatic(r *Request) *handlerCacheItem {
func (s *Server) searchHandlerStatic(r *Request) *routerCacheItem {
s.hmmu.RLock()
defer s.hmmu.RUnlock()
domains := []string{r.GetHost(), gDEFAULT_DOMAIN}
// 首先进行静态匹配
for _, domain := range domains {
if f, ok := s.handlerMap[s.handlerKey(domain, r.Method, r.URL.Path)]; ok {
return &handlerCacheItem{f, nil}
return &routerCacheItem{f, nil}
}
}
return nil
}
// 检索动态路由规则
func (s *Server) searchHandlerDynamic(r *Request) *handlerCacheItem {
func (s *Server) searchHandlerDynamic(r *Request) *routerCacheItem {
s.hmmu.RLock()
defer s.hmmu.RUnlock()
domains := []string{gDEFAULT_DOMAIN, r.GetHost()}
@ -255,7 +255,7 @@ func (s *Server) searchHandlerDynamic(r *Request) *handlerCacheItem {
if match, err := gregex.MatchString(item.router.RegRule, r.URL.Path); err == nil && len(match) > 1 {
//gutil.Dump(match)
//gutil.Dump(names)
handlerItem := &handlerCacheItem{item, nil}
handlerItem := &routerCacheItem{item, nil}
// 如果需要query匹配那么需要重新正则解析URL
if len(item.router.RegNames) > 0 {
if len(match) > len(item.router.RegNames) {