作为一名全栈开发者,我每天都在和 API 打交道。前端开发等后端接口、第三方 API 限流、微服务联调......这些场景都需要 Mock 数据。
试过不少 Mock 工具,但总觉得差点意思:
于是我决定自己造轮子。目标很简单:
零依赖、单二进制、功能完整、高性能
三个月后,MockAPI 诞生了。
| 指标 | 数值 |
|---|---|
| 运行时依赖 | 0 |
| 安装方式 | go install 一条命令 |
| 启动时间 | < 100ms |
| 路由匹配性能 | 提升 24 倍 |
| 内存占用 | 减少 94% |
支持的功能:
选择 Go 不是因为我只会 Go (虽然这也有关系),而是它完美契合这个场景:
编译成单个二进制文件,用户不需要安装 Node.js 、JVM 或任何其他运行时。下载即用,上传即跑。
# 安装
go install github.com/fynntang/MockAPI@latest
# 启动
mockapi serve
# 完成!
Go 的 net/http 性能优异,encoding/json 够用,embed 可以把 Web UI 嵌入二进制。不需要引入重型框架。
一次编译,到处运行:
GOOS=darwin GOARCH=amd64 go build # macOS
GOOS=linux GOARCH=amd64 go build # Linux
GOOS=windows GOARCH=amd64 go build # Windows
没有复杂的依赖关系,不需要 Docker 也能轻松部署。当然,如果你喜欢容器化:
docker run -p 8088:8088 mockapi
项目初期,路由匹配是这样的:
// 线性搜索 O(n)
func (s *Server) matchRoute(method, path string) *Route {
for _, route := range s.routes {
if route.Method == method && route.Match(path) {
return route
}
}
return nil
}
当路由数量少时没问题,但随着功能增加,性能急剧下降:
100 个路由: ~500ns
1000 个路由: ~5ms
10000 个路由:~50ms // 不可接受!
我设计了一个两层索引结构:
┌─────────────────────────────────────────┐
│ RouteIndex │
├─────────────────────────────────────────┤
│ exact: map["GET:/users"] -> Route │ ← O(1)
├─────────────────────────────────────────┤
│ param: map["GET:/users"] -> []Route │ ← O(k)
│ map["GET:/posts"] -> []Route │
├─────────────────────────────────────────┤
│ wildcard: map["GET"] -> []Route │ ← O(m)
└─────────────────────────────────────────┘
匹配逻辑:
优化前:BenchmarkRouteMatch-8 231218 5169 ns/op 6400 B/op
优化后:BenchmarkRouteMatch-8 5589621 214 ns/op 68 B/op
性能提升:24 倍
内存减少:94%
这就是算法优化的力量。没有黑魔法,只是把数据结构选对了。
支持 :param 参数和 * 通配符:
# routes.json
- path: /users/:id
method: GET
response:
body: |
{
"id": {{params.id}},
"name": "User {{params.id}}"
}
- path: /api/*
method: ANY
proxy: https://real-api.com
当静态响应不够用时,可以用 JavaScript 动态生成:
// 条件响应
if (headers["x-api-key"] === "secret") {
return { authorized: true, user: "admin" };
}
// 模拟延迟
sleep(100);
return { data: "delayed response" };
// 随机数据
return {
id: Math.floor(Math.random() * 1000),
name: faker.name(),
email: faker.email()
};
有现成的 API 文档?一键导入:
mockapi import swagger.yaml
自动解析所有端点,生成 Mock 路由。
支持 Query 和 Mutation:
- operation: GetUser
response:
data:
user:
id: "1"
name: "John"
模拟实时数据推送:
- path: /ws/chat
messages:
- delay: 1000
data: "Hello!"
- delay: 2000
data: "How are you?"
不想写配置文件?打开浏览器就能管理:
http://localhost:8088/_ui
功能:
后端 API 还没好?自己 Mock:
# 1. 创建配置
mockapi init
# 2. 添加路由(或用 Web UI )
# 3. 启动服务
mockapi serve
# 4. 前端请求 http://localhost:8088/api/...
调用外部 API 有限流? Mock 它:
- path: /external/*
proxy: https://api.external.com
rateLimit: 10/s
未匹配的请求转发到真实 API ,匹配的返回 Mock 数据。
把 routes/ 目录加入 Git:
git add routes/
git commit -m "Add mock routes"
团队成员 git pull 后自动同步 Mock 数据。
| 特性 | MockAPI | MockServer | JSON Server | Postman Mock |
|---|---|---|---|---|
| 零依赖 | ✅ | ❌ (JVM) | ❌ (Node.js) | ❌ (联网) |
| 动态响应 | ✅ | ✅ | ❌ | ✅ |
| GraphQL | ✅ | ❌ | ❌ | ✅ |
| WebSocket | ✅ | ✅ | ❌ | ❌ |
| gRPC | ✅ | ❌ | ❌ | ❌ |
| Web UI | ✅ | ❌ | ❌ | ✅ |
| 开源 | ✅ | ✅ | ✅ | ❌ |
# 安装
go install github.com/fynntang/MockAPI@latest
# 启动
mockapi serve
# 打开 Web UI
open http://localhost:8088/_ui
就这么简单!
如果这个项目对你有帮助,欢迎 Star ⭐
开发 MockAPI 的过程让我学到了很多:
如果你也需要一个轻量级 Mock 服务器,不妨试试 MockAPI 。有问题或建议,欢迎在 GitHub 提 Issue !
Happy Mocking! 🦞