Skip to main content

通过使用evans来更加便捷地调试grpc服务

· 3 min read
orange
programmer on jvm platform

有的时候需要调试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进行设置.
例如: 设置packagenott.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进行设置.
例如: 设置serviceNottm

service Nottm

调用rpc

当设置完service后, 可以通过call <RPC>命令来调用rpc方法.

例如: 调用Register方法

call Register

然后根据提示输入参数, 当输入完毕后, 会返回调用结果.

参考