惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

J
Java Code Geeks
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
Jina AI
Jina AI
B
Blog
aimingoo的专栏
aimingoo的专栏
酷 壳 – CoolShell
酷 壳 – CoolShell
T
The Blog of Author Tim Ferriss
Last Week in AI
Last Week in AI
月光博客
月光博客
H
Help Net Security
V
Visual Studio Blog
量子位
A
About on SuperTechFans
博客园 - Franky
人人都是产品经理
人人都是产品经理
N
Netflix TechBlog - Medium
云风的 BLOG
云风的 BLOG
雷峰网
雷峰网
Martin Fowler
Martin Fowler
Microsoft Security Blog
Microsoft Security Blog
博客园 - 叶小钗
P
Proofpoint News Feed
MongoDB | Blog
MongoDB | Blog

V2EX

我用 AI 写代码,但终端管理反而成了累赘——于是我做了 codux [调研] 各位在公司都用什么 ide 和 agent 写代码? 老运维 share 一个运维平台 看到有公司考核 token 指标,很好奇大家上个月的 AI 账单是多少 GLM-Coding 调用持续报错: z.ai 的 Lite 套餐几乎无法使用,官方 Pro/Max 是否稳定? 现在还有什么渠道可以稳定安全地使用 Claude 吗? 上海漕河泾内推,本组有 2 个 hc,一个后端,一个前端,预算都是 20k 左右,不打卡,氛围好 如果 V2EX 上有一组不永久保存聊天记录(比如只保存 7 天或者 24 小时)的聊天室,那么会开启哪些有用或者有趣的可能? gemini cli 貌似挂了,一直返回 403 第一次在自媒体上赚到钱 收集了最近在使用的低价 GPT, Gemini,邮箱等 AI 会员的小店合集 讨论个大实话:现在企业还在说 AI 编程提效 20%, 30%的,真的太落后,没用懂 AI。因为包括很多前沿公司,已经狂奔到提效 200%-500%的情况 [招聘][远程][币安] 前端/后端/QA/iOS/Android 至少 3 年以上经验 目前有大量 HC 欢迎投递 Chatgpt Pro 用量用不完的可以开这些设置 面试的时候好像遇到钓鱼了,给各位避个坑 cursor 年续费 22 号到期, 自动续费是否还是老的计次套餐呢 被两件破事毁掉的一下午,琐碎的内耗消磨人的精力 使用 Planet 存储 Codex 的会话或者重要信息 如果业务部门领导不要你开发功能,而是要求你教会它用 claude code 开发功能,你会怎么做? 分享一个 MacOS 接绿联 CM818 USB 转 DP 转接器使用感受 我的 HR 朋友 10 年老 Java ,非全大专,大家帮忙看看简历 开源了一个 AI 口语练习工具,音素级发音评分,完全免费可自部署 V2EX 上有哪些你觉得很有趣、印象深刻的妹纸? 字节为啥不出个国内版 Vercel? 有在大马的朋友吗? 问个运营商问题 你们在有领导的公司大群发过的最大胆的消息是什么 公司裁员,目前没有工作。想试试摆摊,做一个移动鲜啤打酒车 我的硬盘 Memblaze Pblaze 5 Linux 下不识别,给 Linux 内核提交了补丁, AI 说有望被合并 只有我一个人觉得 codex 不好用?
我用 Go 写了一个零依赖的 API Mock 服务器,性能提升 24 倍
FzPying · 2026-03-12 · via V2EX

作为一名全栈开发者,我每天都在和 API 打交道。前端开发等后端接口、第三方 API 限流、微服务联调......这些场景都需要 Mock 数据。

试过不少 Mock 工具,但总觉得差点意思:

  • MockServer:功能强大但太重,需要 JVM
  • JSON Server:轻量但只支持 REST ,不支持动态响应
  • Postman Mock:需要联网,付费才能团队协作

于是我决定自己造轮子。目标很简单:

零依赖、单二进制、功能完整、高性能

三个月后,MockAPI 诞生了。


成果一览

指标 数值
运行时依赖 0
安装方式 go install 一条命令
启动时间 < 100ms
路由匹配性能 提升 24 倍
内存占用 减少 94%

支持的功能:

  • ✅ REST Mock (动态路由、路径参数、条件响应)
  • ✅ GraphQL Mock
  • ✅ WebSocket Mock
  • ✅ gRPC-Web Mock
  • ✅ JavaScript 脚本引擎
  • ✅ Swagger/OpenAPI 导入
  • ✅ 内置 Web UI
  • ✅ 热重载

技术选型:为什么是 Go ?

选择 Go 不是因为我只会 Go (虽然这也有关系),而是它完美契合这个场景:

1. 零运行时依赖

编译成单个二进制文件,用户不需要安装 Node.js 、JVM 或任何其他运行时。下载即用,上传即跑。

# 安装
go install github.com/fynntang/MockAPI@latest

# 启动
mockapi serve

# 完成!

2. 标准库足够强大

Go 的 net/http 性能优异,encoding/json 够用,embed 可以把 Web UI 嵌入二进制。不需要引入重型框架。

3. 跨平台编译

一次编译,到处运行:

GOOS=darwin GOARCH=amd64 go build  # macOS
GOOS=linux GOARCH=amd64 go build   # Linux
GOOS=windows GOARCH=amd64 go build # Windows

4. 部署简单

没有复杂的依赖关系,不需要 Docker 也能轻松部署。当然,如果你喜欢容器化:

docker run -p 8088:8088 mockapi

性能优化:从 O(n) 到 O(1)

项目初期,路由匹配是这样的:

// 线性搜索 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

我设计了一个两层索引结构:

┌─────────────────────────────────────────┐
│              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)
└─────────────────────────────────────────┘

匹配逻辑:

  1. 精确匹配:直接查 map ,O(1)
  2. 参数路由:按前缀分组,大幅减少候选集
  3. 通配符路由:按方法分组

优化效果

优化前:BenchmarkRouteMatch-8    231218    5169 ns/op    6400 B/op
优化后:BenchmarkRouteMatch-8    5589621   214 ns/op     68 B/op

性能提升:24 倍
内存减少:94%

这就是算法优化的力量。没有黑魔法,只是把数据结构选对了。


核心功能实现

1. 动态路由

支持 :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

2. JavaScript 脚本引擎

当静态响应不够用时,可以用 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()
};

3. Swagger/OpenAPI 导入

有现成的 API 文档?一键导入:

mockapi import swagger.yaml

自动解析所有端点,生成 Mock 路由。

4. GraphQL Mock

支持 Query 和 Mutation:

- operation: GetUser
  response:
    data:
      user:
        id: "1"
        name: "John"

5. WebSocket Mock

模拟实时数据推送:

- path: /ws/chat
  messages:
    - delay: 1000
      data: "Hello!"
    - delay: 2000
      data: "How are you?"

内置 Web UI

不想写配置文件?打开浏览器就能管理:

http://localhost:8088/_ui

功能:

  • 📋 路由列表和管理
  • ➕ 可视化添加路由
  • 📝 快速模板( 12+ 预设)
  • 📊 请求日志查看
  • 🔍 实时调试

实战案例

场景 1:前端开发

后端 API 还没好?自己 Mock:

# 1. 创建配置
mockapi init

# 2. 添加路由(或用 Web UI )
# 3. 启动服务
mockapi serve

# 4. 前端请求 http://localhost:8088/api/...

场景 2:第三方 API 开发

调用外部 API 有限流? Mock 它:

- path: /external/*
  proxy: https://api.external.com
  rateLimit: 10/s

未匹配的请求转发到真实 API ,匹配的返回 Mock 数据。

场景 3:团队协作

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 的过程让我学到了很多:

  1. 简单往往更好 - 零依赖比功能堆砌更重要
  2. 性能要趁早考虑 - 好的数据结构胜过后期优化
  3. 开发者体验很重要 - CLI 和 Web UI 大幅提升易用性
  4. 测试驱动开发 - 26 个测试用例让我睡得安稳

如果你也需要一个轻量级 Mock 服务器,不妨试试 MockAPI 。有问题或建议,欢迎在 GitHub 提 Issue !


Happy Mocking! 🦞