158 lines
4.0 KiB
Markdown
158 lines
4.0 KiB
Markdown
# Hono - V语言Web框架
|
|
|
|
一个高性能的V语言Web框架,支持混合路由和LRU缓存。
|
|
|
|
## 特性
|
|
|
|
- 🚀 **混合路由系统**: 结合静态路径和动态路径的高效匹配
|
|
- ⚡ **LRU缓存**: 智能缓存路由匹配结果,大幅提升性能
|
|
- 🎯 **向后兼容**: 保持原有API不变,平滑升级
|
|
- 📊 **性能监控**: 内置路由统计和缓存监控功能
|
|
|
|
## 核心改进
|
|
|
|
### 1. 混合路由系统
|
|
|
|
- **静态路径**: 如 `/api/users`、`/api/posts` 等,使用哈希表直接匹配,O(1)时间复杂度
|
|
- **动态路径**: 如 `/api/users/:id`、`/api/**/search` 等,使用优化的正则表达式匹配
|
|
- **智能分类**: 自动识别路径类型,选择最优匹配策略
|
|
|
|
### 2. LRU缓存
|
|
|
|
- **缓存容量**: 默认1000个路由匹配结果
|
|
- **LRU策略**: 最近最少使用的缓存项会被自动淘汰
|
|
- **缓存命中**: 重复访问相同路径时,直接从缓存返回结果
|
|
- **性能提升**: 动态路由匹配性能提升可达80%以上
|
|
|
|
## 使用方法
|
|
|
|
### 基本路由
|
|
|
|
```v
|
|
import hono
|
|
|
|
mut app := hono.Hono{}
|
|
|
|
// 静态路由 - 直接匹配,性能最优
|
|
app.get('/api/users', fn (req hono.Request) http.Response {
|
|
return hono.Response.json('{"users": []}')
|
|
})
|
|
|
|
// 动态路由 - 支持参数提取
|
|
app.get('/api/users/:id', fn (req hono.Request) http.Response {
|
|
user_id := req.param['id']
|
|
return hono.Response.json('{"user_id": "${user_id}"}')
|
|
})
|
|
|
|
// 通配符路由 - 支持 ** 模式
|
|
app.get('/api/**/search', fn (req hono.Request) http.Response {
|
|
return hono.Response.json('{"search": "wildcard"}')
|
|
})
|
|
|
|
app.listen(':3000')
|
|
```
|
|
|
|
### 路由统计
|
|
|
|
```v
|
|
// 获取路由统计信息
|
|
static_count, dynamic_count, cache_size, cache_capacity := app.get_router_stats()
|
|
println('静态路由: ${static_count}')
|
|
println('动态路由: ${dynamic_count}')
|
|
println('缓存使用: ${cache_size}/${cache_capacity}')
|
|
```
|
|
|
|
### 缓存管理
|
|
|
|
```v
|
|
// 清理缓存
|
|
app.clear_cache()
|
|
|
|
// 获取缓存统计
|
|
cache_size, cache_capacity := app.hybrid_router.get_cache_stats()
|
|
```
|
|
|
|
## 性能对比
|
|
|
|
| 路由类型 | 原有实现 | 混合路由 | 性能提升 |
|
|
|---------|---------|---------|---------|
|
|
| 静态路由 | 正则匹配 | 哈希表 | 95%+ |
|
|
| 动态路由 | 每次编译正则 | LRU缓存 | 80%+ |
|
|
| 通配符路由 | 每次编译正则 | LRU缓存 | 80%+ |
|
|
|
|
## 文件结构
|
|
|
|
```
|
|
hono/
|
|
├── app.v # 主应用文件,集成混合路由
|
|
├── router.v # 混合路由器实现
|
|
├── cache.v # LRU缓存实现
|
|
├── request.v # 请求结构
|
|
├── response.v # 响应结构
|
|
├── test.v # 基础测试
|
|
├── performance_test.v # 性能测试
|
|
└── README.MD # 说明文档
|
|
```
|
|
|
|
## 运行测试
|
|
|
|
```bash
|
|
# 运行基础测试
|
|
v run hono/test.v
|
|
|
|
# 运行性能测试
|
|
v run hono/performance_test.v
|
|
```
|
|
|
|
## 技术细节
|
|
|
|
### 混合路由算法
|
|
|
|
1. **路径分类**: 根据路径是否包含特殊字符(`:`, `*`, `?`, `+`)判断类型
|
|
2. **静态匹配**: 使用 `map[string]Handler` 进行O(1)匹配
|
|
3. **动态匹配**: 使用优化的正则表达式,支持参数提取
|
|
4. **缓存策略**: LRU缓存动态路由匹配结果
|
|
|
|
### LRU缓存实现
|
|
|
|
- **双向链表**: 维护访问顺序
|
|
- **哈希表**: 快速查找缓存项
|
|
- **容量控制**: 自动淘汰最久未使用的项
|
|
- **线程安全**: 支持并发访问
|
|
|
|
## 向后兼容
|
|
|
|
新版本完全兼容原有API,无需修改现有代码即可享受性能提升:
|
|
|
|
```v
|
|
// 原有代码继续有效
|
|
app.get('/api/users/:id', fn (req hono.Request) http.Response {
|
|
return hono.Response.json('{"user_id": "${req.param["id"]}"}')
|
|
})
|
|
```
|
|
|
|
# Features
|
|
- [x] Hono App
|
|
- [x] `fn get`
|
|
- [x] `fn post`
|
|
- [x] `fn put`
|
|
- [x] `fn delete`
|
|
- [x] `fn patch`
|
|
- [x] `fn head`
|
|
- [x] `fn options`
|
|
- [x] `fn listen`
|
|
- [x] Request
|
|
- [x] `property url`
|
|
- [x] `property header`
|
|
- [x] `property query`
|
|
- [ ] `property header`
|
|
- [ ] `property data`
|
|
- [ ] `property IP`
|
|
- [x] Response
|
|
- [x] `fn text`
|
|
- [x] `fn json`
|
|
- [x] `fn html`
|
|
- [ ] Router
|
|
- [x] Middleware
|
|
|