bavix/gripmockGripMock 是一个 gRPC 服务的 mock 服务器,通过 .proto 文件或编译后的 .pb 描述符生成 gRPC 服务实现。您可以使用它搭建端到端测试环境,或在软件开发阶段作为虚拟服务器使用。服务器使用 Go 语言实现,客户端可支持任何编程语言的 gRPC 客户端。
本项目是 tokopedia/gripmock 的分支版本,具有更优的性能和更多增强功能,包括更新依赖、支持 YAML 静态存根、健康检查端点等。
.proto 文件、包含多个 .proto 文件的文件夹或编译后的 .pb 描述符启动服务/api/health/liveness 和 /api/health/readiness 端点equals(精确匹配)、contains(包含匹配)、matches(正则匹配),支持嵌套字段和 ignoreArrayOrder(忽略数组顺序).pb 描述符以加快启动速度bashdocker pull bavix/gripmock
Homebrew(macOS/Linux):
bashbrew tap bavix/homebrew-gripmock brew install gripmock
预编译二进制:从 Releases 下载对应平台的二进制文件并添加到 PATH
Go 直接安装:
bashgo install github.com/bavix/gripmock/v3@latest
对于复杂项目,推荐编译 .pb 描述符以加快启动速度:
protoc:bashprotoc --proto_path=. --descriptor_set_out=service.pb --include_imports hello.proto
buf:bashbuf build -o service.pb
bash# 通过 .pb 文件启动 gripmock service.pb # 通过 .proto 文件启动 gripmock service.proto # 通过包含 .proto 文件的文件夹启动 gripmock protofolder/
指定包含静态存根文件的文件夹:
bash# 文件夹中的 proto 文件 gripmock --stub stubfolder/ protofolder/ # 单个 proto 文件 gripmock --stub stubfolder/ service.proto # 预编译 .pb 文件 gripmock --stub stubfolder/ service.pb
bashdocker run -p 4770:4770 -p 4771:4771 \ -v /本地存根文件夹:/stubs \ -v /本地proto文件夹:/proto \ bavix/gripmock /proto/
bashdocker run -p 4770:4770 -p 4771:4771 \ -v /本地存根文件夹:/stubs \ -v /本地proto文件夹:/proto \ bavix/gripmock /proto/service.proto
bashdocker run -p 4770:4770 -p 4771:4771 \ -v /本地存根文件夹:/stubs \ -v /本地pb文件路径:/proto \ bavix/gripmock /proto/service.pb
端口说明:
- 4770:gRPC 服务端口(客户端连接)
- 4771:HTTP 管理端口(Web UI 和 REST API)
通过 HTTP 存根服务器(端口 4771)管理存根,支持以下接口:
GET /api/stubs:列出所有存根POST /api/stubs:添加新存根POST /api/stubs/search:搜索匹配的存根DELETE /api/stubs:清除所有存根json{ "service": "Greeter", // proto 中定义的服务名 "method": "SayHello", // 要模拟的方法名 "headers": { // 可选,请求头匹配规则 "equals": { "authorization": "token" } }, "input": { // 输入匹配规则 "ignoreArrayOrder": true, // 可选,忽略数组顺序 "equals": { "name": "gripmock" } }, "output": { // 匹配成功的输出 "data": { "message": "Hello" }, // 响应数据 "headers": { "x-resp": "ok" }, // 可选,响应头 "error": "错误信息", // 可选,错误消息(指定则返回错误) "code": "2" // 可选,gRPC 错误码(非 0 则返回错误) } }
bashcurl -X POST -H "Content-Type: application/json" -d '{ "service": "Greeter", "method": "SayHello", "input": { "equals": { "name": "gripmock" } }, "output": { "data": { "message": "Hello GripMock" } } }' http://localhost:4771/api/stubs
将存根文件(JSON/YAML 格式)放置在文件夹中,通过 --stub 参数指定:
yaml# stub.yaml 示例 - service: Greeter method: SayHello input: equals: name: gripmock output: data: message: Hello GripMock
启动命令:
bash# 本地 gripmock --stub ./stubfolder ./service.proto # Docker docker run -p 4770:4770 -p 4771:4771 \ -v /本地存根文件夹:/stubs \ -v /本地proto文件夹:/proto \ bavix/gripmock --stub /stubs /proto/service.proto
支持三种匹配方式,可作用于嵌套字段和数组:
匹配输入中指定字段的精确值(默认检查数组顺序):
json"input": { "equals": { "name": "gripmock", "greetings": { "english": "Hello" }, "numbers": [1, 2, 3], "active": true } }
匹配输入中包含指定字段及值:
json"input": { "contains": { "user": { "id": "123" }, "tags": ["test"] } }
使用正则表达式匹配字符串字段:
json"input": { "matches": { "email": "^[a-z]+@example\\.com$", "id": "^\\d{6}$" } }
配合 equals 使用,忽略数组元素顺序:
json"input": { "ignoreArrayOrder": true, "equals": { "numbers": [3, 1, 2] } // 匹配 [1,2,3]、[2,1,3] 等 }
与输入匹配规则类似,支持 equals、contains、matches:
json"headers": { "equals": { "authorization": "Bearer token" }, "contains": { "x-version": "v1" }, "matches": { "request-id": "^[a-f0-9-]+$" } }
本项目采用 MIT 许可证,详情参见 LICENSE。





manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务