测试gRPC服务:grpcurl方案
上节课介绍了使用OpenSSL命令调试gRPC服务的方式。本节介绍第二种更便捷的调试方式——使用grpcurl工具,它通过Go语言环境安装,提供命令行级别的gRPC服务测试能力。
Go环境安装(GVM)
grpcurl基于Go语言编写,需要先安装Go环境。推荐使用GVM(Go Version Manager)管理Go版本,类似于Node.js的NVM。
安装GVM
# 安装依赖
sudo apt-get install curl git mercurial make binutils bison gcc build-essential
# 安装GVM
bash < <(curl -s -S -L https://raw.githubusercontent.com/moovweb/gvm/master/binscripts/gvm-installer)
bash
macOS用户可以参考课程资料文件夹中的安装文档。
配置Go加速源
# 在shell配置文件中添加(推荐使用国内加速源)
export GOPROXY=https://goproxy.cn,direct
# 或
export GOPROXY=https://goproxy.io,direct
bash
GVM常用命令
# 查看本地已安装的Go版本
gvm list
# 查看所有可安装的Go版本
gvm listall
# 安装指定版本(-b使用二进制安装,速度更快)
gvm install go1.22.0 -b
# 切换到指定版本并设为默认
gvm use go1.22.0 --default
# 验证安装
go version
bash
安装grpcurl
有了Go环境后,安装grpcurl非常简单:
# 从GitHub安装最新版
go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
bash
安装完成后,grpcurl在全局环境中可用。
grpcurl基本用法
无SSL加密的服务测试
# 语法结构
grpcurl -plaintext -import-path [proto目录] \
-proto [proto文件名] \
-d '[JSON参数]' \
[服务地址] \
[package.service/method]
bash
实战示例:
grpcurl -plaintext \
-import-path app/client/proto \
-proto hero.proto \
-d '{"id": 1}' \
localhost:50100 \
hero.HeroService/FindOne
bash
关键点:
-plaintext:使用明文连接(不使用TLS)-import-path:proto文件所在目录-proto:proto文件名-d:传递JSON参数(用单引号包裹)- 最后的路径格式为
package.ServiceName/MethodName,必须与proto文件中定义的完全一致
带SSL证书的服务测试
grpcurl -cacert app/client/certs/ca.crt \
-import-path app/client/proto \
-proto hero.proto \
-d '{"id": 1}' \
example.com:50100 \
hero.HeroService/FindOne
bash
坑点提醒:即使指定了-cacert参数,grpcurl默认会尝试使用系统根证书做校验。这意味着即使你的自签名证书有问题,grpcurl也可能测试通过(因为使用了系统证书而非你指定的证书)。要验证证书是否真正生效,可以:
- 使用
-plaintext连接SSL端口,应该会报context deadline exceeded错误 - 对比Node.js客户端和openssl s_client的验证结果
grpcurl vs OpenSSL对比
| 维度 | grpcurl | OpenSSL |
|---|---|---|
| 安装 | 需要Go环境 | 系统自带 |
| 使用方式 | 命令行一行搞定 | 需要手动输入gRPC帧格式 |
| 参数传递 | JSON格式(-d) | 需要编码为二进制 |
| 功能范围 | 专用于gRPC | 通用SSL/TLS工具 |
| 适合场景 | 日常快速测试 | SSL证书问题排查 |
grpcurl高级用法
# 列出服务端所有服务
grpcurl -plaintext localhost:50100 list
# 查看某个服务的所有方法
grpcurl -plaintext localhost:50100 list hero.HeroService
# 查看方法的详细描述(包括请求/响应格式)
grpcurl -plaintext localhost:50100 describe hero.HeroService.FindOne
# 传递复杂参数(使用JSON字符串)
grpcurl -plaintext -d '{"name": "test", "items": [{"id": 1}, {"id": 2}]}' \
localhost:50100 package.Service/Method
bash
优缺点总结
优点:
- 命令简单,一行搞定测试
- JSON格式传参直观
- 日常调试效率极高
缺点:
- 复杂参数的构造仍然麻烦
- 需要安装Go环境
- 对于SSL证书的验证不够严格(可能使用系统根证书绕过)
↑