rpcx 官方技术博客

使用 rpcxdump 监控 rpcx服务的通讯

2019.07.01

在很多时候,调试分布式应用并不是一件很容易的事情,异常情况除了和客户端/服务器端的代码实现有关,还和网络的传输有关,甚至在微博我们还曾遇到宇宙射线对服务器的影响。那么如何能更好地更便利的调试rpc服务呢。

tcpdump可以用来抓包,并且提供了丰富的filter进行网络包的筛选,通过wireshark可以图形化的跟踪网络包的通讯。wireshark也提供了协议解析,可以对很多常用的应用层的协议进行解析,但是不幸的,对于很多自定义协议的rpc框架,你只能看到二进制的payload数据,除非你自己编写一个协议解析的插件。

grpc-tools是一个不错的调试grpc服务通讯的工具。

但是grpc-tools需要你设置Proxy, grpc-dump事实上是一个http(s)的proxy,用来拦截通讯的数据。

对于rpcx来说,也有网友提出了能不能提供一个wireshark的插件,用来解析rpcx协议。wireshark插件的编写我没有经验,但是使用抓包的方式也可以实现rpcx消息的抓取和解析,并且它不会影响既有的服务的通讯,你甚至可以在线上跟踪服务的调用。

使用google/gopacket可以用来抓包,我翻译了一篇比较不错的介绍gopacket的文档:利用 gopackage 进行包的捕获、注入和分析。我们可以实现两种方式抓包:一个是实时的监控网络设备,另外一个是读取tcpdump等工具抓取的数据。rpcxdump同时支持这两种方式。

基于gopacket, rpcx提供了一个非常方便的调试工具: rpcxdump

你既可以在客户端使用rpcxdump进行抓包,也可以在服务器端进行抓包,使用起来很方便,它只有四个参数:

  • f: 读取离线的pcap文件,比如tcpdump生成的文件,如果为空,则采用实时抓包
  • c: 要抓取的网络地址和端口,比如127.0.0.1:8972, 使用pcap文件时也需要指定这个地址
  • p: 是否要显示rpcx协议中的payload数据,payload数据有可能很大,显示的时候可能不方便,你可以通过这个参数控制它的显示。如果你监控的rpcx服务使用JSON格式的编解码,那么payload会以JSON格式呈现,否则以byte方式呈现
  • color: 数据各个项是否以彩色方式显示

就这么简单,在rpcx 示例库随便挑选一个例子,让服务调用一直在运行,然后运行./xdump -c 127.0.0.1:8972 -p -color 跟踪一下服务的调用。