通过使用evans来更加便捷地调试grpc服务
有的时候需要调试grpc
服务, 但是通过代码来进行调试比较麻烦, 因为需要编写相关代码, 这个时候需要一个工具来帮助我们进行调试,
这里介绍一个工具evans
.
安装
进入Releases页面下载对应的版本, 然后进行解压.
解压后的文件夹中有一个evans
的可执行文件, 如果想在任意位置都通过evans
来调用, 那么需要做以下操作列表中的任意一种
- 放到
/usr/local/bin
目录下. - 将
/path/to/evans
添加到PATH
环境变量中.
启动
通过evans
命令启动, 由于服务调用需要知道契约, 所以需要指定契约文件, 有两种方式
- 给定protobuf文件
evans --host <HOST> --port <PORT> --path <PROTOBUF_ROOT> --proto <PROTOBUF_FILE>
其中:
<PROTOBUF_ROOT>
是protobuf文件的根目录
<PROTOBUF_FILE>
是protobuf文件相对于<PROTOBUF_ROOT>
的路径
例如以下给定参数:
--path /Users/kuoxiangcheng/protobuf --proto test/test.proto
在这个例子中test/test.proto
是处于/Users/kuoxiangcheng/protobuf
目录下的文件.
当多个protobuf
之间存在依赖关系时, 配置--path
是一个很好的方式, 因为可以通过--path
来指定protobuf文件的根目录
- 通过reflection方式运行
evans --host <HOST> --port <PORT> -r
当执行上面的命令后, 会进入evans的交互式界面, 内容如下
______
| ____|
| |__ __ __ __ _ _ __ ___
| __| \ \ / / / _. | | '_ \ / __|
| |____ \ V / | (_| | | | | | \__ \
|______| \_/ \__,_| |_| |_| |___/
more expressive universal gRPC client
192.168.16.243:27778>
服务调用
当进入evans的交互式界面后, 后续连接特定的服务, 调用特定的方法, 以及传递参数都是通过交互式界面来完成的.
接下来需要几个步骤来完成服务的调用
- 设置
package
- 设置
service
- 调用
rpc
列出package
通过show package
命令来查看当前连接的服务中的package
show package
当执行上述命令后, 会列出当前连接的服务中的所有package
, 参考输出如下
+---------------+
| PACKAGE |
+---------------+
| nott.v1.nottd |
| nott.v1.nottm |
+---------------+
设置package
根据命令执行的结果选择一个特定的package
进行设置.
例如: 设置package
为nott.v1.nottm
service nott.v1.nottm
列出service
当设置完package
后, 还需要设置service
, 通过show service
命令来查看当前package
下的所有service
show service
当执行上述命令后, 会列出当前连接的服务中的所有service
, 参考输出如下
+---------+---------------------+-----------------------+------------------------+
| SERVICE | RPC | REQUEST TYPE | RESPONSE TYPE |
+---------+---------------------+-----------------------+------------------------+
| Nottm | Register | RegisterRequest | RegisterResponse |
| Nottm | ListRegisters | ListRegistersRequest | ListRegistersResponse |
| Nottm | UpdateRegister | UpdateRegisterRequest | UpdateRegisterResponse |
| Nottm | RevokeRegister | RevokeRegisterRequest | RevokeRegisterResponse |
| Nottm | Push | PushRequest | PushResponse |
| Nottm | Poll | PollRequest | PollResponse |
| Nottm | RetrieveSentMessage | PollRequest | PollResponse |
| Nottm | QueryMessages | QueryMessagesRequest | QueryMessagesResponse |
| Nottm | CheckState | CheckStateRequest | CheckStateResponse |
| Nottm | QueueStatus | QueueStatusRequest | QueueStatusResponse |
| Nottm | InspectNottd | InspectNottdRequest | InspectNottdResponse |
| Nottm | InspectNottm | InspectNottmRequest | InspectNottmResponse |
| Nottm | RestartNottd | RestartNottdRequest | RestartNottdResponse |
+---------+---------------------+-----------------------+------------------------+
设置service
根据命令执行的结果选择一个特定的service
进行设置.
例如: 设置service
为Nottm
service Nottm
调用rpc
当设置完service
后, 可以通过call <RPC>
命令来调用rpc
方法.
例如: 调用Register
方法
call Register
然后根据提示输入参数, 当输入完毕后, 会返回调用结果.