按照惯例先谈谈最近情况,最近不是刚好跨年吗?看到很多人都在写年度总结,所以我也在写年度总结文章(其实之前我基本没有写过的,今年有点感触,也想记录一下),结果发现写起来有点多,之前还想着元旦前发出来,结果元旦过后,今天我也还在写,而且还写不完,不过也差不多了,预计明天会发出来。然后最近需求比较多,工作比较忙,同时遇到了一个比较麻烦的需求,就想着记录一下,先充当一下这周的文章任务。

背景

最近,我在公司做这样的一个事情,整理老旧的api服务,需要统计接口的每个请求的ip和请求参数,找出对应的调用的ip,以便通知业务方修改为新的api服务。其中我们的这个api服务调用有分为thrift调用和http调用,由于之前的旧的服务设计比较简陋,没有通过dubbo 等注册中心调用,也没有完整的监控(不要问我为什么没有,我也很无奈),导致我想找出调用ip也找不到,日志里面没有记录。

具体操作方法

方法一,直接修改业务代码

刚开始我们是想修改原业务代码,加上调用ip和请求参数的日志打印的。原本以为不会有什么问题,但是我们准备开始动手改造的时候,发现http协议提供的接口,比较好改造,直接 httpRequest 可以获取到客户端ip ,请求参数也很好打印。接着我们打算动手也修改一下thrift 接口的那部分,原本以为都是接口,估计thrift框架也会提供对应的方式获取(我们使用的原生的apche thrift 框架来提供服务),于是网上找了一下,发现thrift 接口好像并 http 接口那么好改造,网上说需要加个监听类,监听请求,类似以下情况:

     /**
* 调用RPC服务的时候触发
* 每调用一次方法,就会触发一次
*/
public void processContext(ServerContext serverContext, TTransport inputTransport, TTransport outputTransport)
{
/**
* 把TTransport对象转换成TSocket,然后在TSocket里面获取Socket,就可以拿到客户端IP (这里有可能转化不成功的,inputTransport 不一定为 TSocket 类来的,还有可能为 TFrmef ,这里依赖于thrift 提供服务的方式 )
*/
TSocket socket = (TSocket)inputTransport;
System.out.println(socket.getSocket().getRemoteSocketAddress());
}

参考:两种方式获取Thrift调用的客户端IP地址

https://blog.csdn.net/mn960mn/article/details/50585278

但是,我们实际操作的时候,建了这个监听类,起了自己的本地服务,并用单元测试去测试的时候,发现报了以下这样的一个错误。

org.apache.thrift.transport.TFramedTransport cannot be cast to org.apache.thrift.transport.TSocket

说TFramedTransport 不能转成 TSocket 这个类 ,估计是实例类跟要强转的类不一致。

一开始,还以为自己的写错了,对着网上的博客检查了以下没有问题。只是发现这个实际实例化出来的类不是 TSocket 类型。试了几次后,发现还是不行,于是有根据这个错误在网上找了一下,TFramedTransport 获取 IP(参考这个错误描述: https://www.oschina.net/question/858822_2182069) 。这才发现,我们的thrift接口提供方式跟网上说的不一样,而我们这种情况,如果需要获取Client Ip ,有这几种方式:1. 修改thrift 框架源码, 2. 重新继承TFramedTransport类重写里面的一个方法。

看到这两种方法,我们一下子就放弃了,原本想着只是简单加个监控,没想着修改太多东西,如果为了见这样一个监控,改动那么大的,害怕影响业务(我们这个api服务还是挺多业务方在使用的)。

方法二,网络抓包

于是,我们考虑起第二种方案,使用抓包去打印出客户端ip和请求参数。tcpdump 是一开始就会想到的工具,当用 tcpdump 去抓包的时候,发现 thrift 接口有些是乱码的。接着就网上找一下是否thrift接口的监控工具,一圈下来,说 thrift-tool ,wireshark(tshark)可以使用,然后又去试了,安装了挺久的,发现由于我们机器的ubuntu的版本太久了,安装不了最新的 thrift-tool (这个是安装之后,还要依赖tcpdump的版本,tcpdump版本太老也不行,tcpdump命令重装也重装了很久,最后发现也安装不了指定版本)和 wireshark ,发现都没有办法使用这两种工具。考虑到我们这个api服务都部署在很多老的物理机上面,考虑兼容性问题和可以方便在其他机器上也部署(我们这个api服务分别部署在10多台的物理机上)。

于是又重新考虑回tcpdump 命令了兜兜转转一圈又回到原点, tcpdump 逼。简单实验了一下,抓包的出的thrift请求参数和响应结构,如果是英文的,大部分还是能正常显示的,可以根据 判断是否包含 接口请求参数英文关键字 和判断目标ip和端口,获取到对应的请求参数和的请求ip。如果发送的参数为英文tcpdump直接抓包是能显示大部分参数的,需要完整的参数信息也可以通过直接在业务代码中加监控,thrift 接口在代码中监控发送请求参数还是挺简单的,主要是获取请求ip有点麻烦。

大概命令是这样的(这里假设read为请求参数关键字)

tcpdump -i any -A -s 0 'tcp port 9521' | grep -E "read|> [0-9\.]+9521"

这样就可以获取到 thrift 接口请求到的 9521 端口 的访问ip和请求参数,不过打印出来的日志,还需要自己的去处理一下的。基本上的请求参数的上一行就是该请求的ip。

总结

这篇文章主要介绍了解决获取 thrift接口 的请求参数和客户端请求 ip 的问题。算作记录一下自己的解决问题的流程。其中顺便了解一下抓包工具 wireshark 的使用,之前一直有听说过这个软件,但是一直没有实际使用过,感觉的确好用。 另外算作也提醒自己在搭建api服务的时候,记得做好每次接口调用ip和请求ip的监控,不然后面接手的人查起来真的想崩溃,例如:我。

这篇也算一篇比较水的文章吧,不过我自己从这次解决问题中还是学到了很多东西的,稍微记录一下:

  1. wireshark 过滤可以通过 tcp and ip.addr == 127.0.0.1 and thrift 命令设置在 dispaly filter 来获取目标的请求, thrift 表示协议,不过如果wireshark 版本太低的话,可以识别不了这个协议。
  2. wireshark 的命令行版本为: tshark
  3. wireshark 的帮助文档地址 https://gitlab.com/wireshark/wireshark/-/wikis/home ,wireshark 的CaptureFilters(捕捉前过滤) 和DisplayFilters(捕捉后筛选) 区别
  4. sudo tshark -s 512 -i eth0 -n -f 'tcp dst port 9521' -l tshark 的命令,捕捉tcp 的请求的,参考: https://www.cnblogs.com/liun1994/p/6142505.html

简单谈谈网络抓包,特别是thrift 接口的更多相关文章

  1. Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布

    来自官方日志的喜悦 被誉为全新开始的消息分析器时代,由MMA为您开启,博客原文写的很激动,大家可以点击这里浏览:http://blogs.technet.com/b/messageanalyzer/a ...

  2. 三种经典iPhone上网络抓包方法详解

    此文章来自:听云博客 很多时候需要网络抓包分析,在iPhone上抓包稍有不同,下面介绍三种常用的方式.分析工具以wireshark为例. 一.最简单的方式:用PC作为热点,在PC上抓包 优点:简单 缺 ...

  3. [工具]Mac平台开发几个网络抓包工具(sniffer)

    Cocoa Packet Analyzer http://www.tastycocoabytes.com/cpa/ Cocoa Packet Analyzer is a native Mac OS X ...

  4. python编写网络抓包分析脚本

    python编写网络抓包分析脚本 写网络抓包分析脚本,一个称手的sniffer工具是必不可少的,我习惯用Ethereal,简单,易用,基于winpcap的一个开源的软件 Ethereal自带许多协议的 ...

  5. Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布

    Microsoft Message Analyzer (微软消息分析器,“网络抓包工具 - Network Monitor”的替代品)官方正式版现已发布 来自官方日志的喜悦 被誉为全新开始的消息分析器 ...

  6. golang gopacket网络抓包和分析

    gopacket 是golang语言使用的网络数据抓取和分析的工具包. 本文简单介绍如何使用gopacket进行网络抓包. 下载gopacket # go get git@github.com:goo ...

  7. 开源网络抓包与分析框架学习-Packetbeat篇

    开源简介packbeat是一个开源的实时网络抓包与分析框架,内置了很多常见的协议捕获及解析,如HTTP.MySQL.Redis等.在实际使用中,通常和Elasticsearch以及kibana联合使用 ...

  8. 笔记-网络-抓包-wireshark

    笔记-网络-抓包-wireshark 1.      开始 环境:win8笔记本,无线网 1.1.    无线网卡设置 因为需抓捕无线网卡上的数据包,需要进行一项设置,如捕获有线网卡,无需设置. 打开 ...

  9. 网络抓包工具wireshark and tcpdump 及其实现基于的libpcap

    最近无意中看到博客园中一篇介绍wireshark的文章,写得不错,它简单清楚介绍了wireshark的使用 简介 wireshark以前叫做Ethereal, 在大学时候的网络课程中就常看到它,它是世 ...

随机推荐

  1. python模块wifi使用小记

    安装命令 pip install wifi 连接命令 sudo wifi connect --add-hoc ssid,使用该命令会修改/etc/network/interfaces配置文件,导致启动 ...

  2. 详解Hadoop3.x新特性功能-HDFS纠删码

    文章首发于微信公众号:五分钟学大数据 EC介绍 ​Erasure Coding 简称EC,中文名:纠删码 EC(纠删码)是一种编码技术,在HDFS之前,这种编码技术在廉价磁盘冗余阵列(RAID)中应用 ...

  3. Codeforces Round 665 (div2)

    2020.8.22 装修完了我的博客,喜欢这个造型,挂上友链就更好了 昨天cf就是一个彻头彻尾的悲剧,本来能上蓝,结果因为在A题耽误时间过多导致掉了30分,不过没关系,这算是一个小波动吧,影响不了什么 ...

  4. PyQt(Python+Qt)学习随笔:QScrollArea的widgetResizable属性

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 滚动区域的widgetResizable属性用于控制滚动区域的内容部署层是否应跟随滚动区域的大小变化 ...

  5. 问题: 刚安装的PyCharm执行代码报“ModuleNotFoundError: No module named XXXX”错

    老猿刚安装好PyCharm后,直接新建了一个工程文件并导入了一个已有的爬虫程序文件,该文件原来在Python解释器下能执行,但在PyCharm下执行时报错: F:\学习\python\SRC\proj ...

  6. PyQt(Python+Qt)学习随笔:QAbstractItemView的tabKeyNavigation属性

    老猿Python博文目录 老猿Python博客地址 tabKeyNavigation属性为bool类型,用于控制视图中是否启用tab键和backtab(shift+tab)进行数据项之间的导航切换. ...

  7. 理解 tf.reduce_sum(),以及tensorflow的维axis

    易错点:注意带上参数axis,否则的话,默认对全部元素求和,返回一个数值int 参考:https://www.jianshu.com/p/30b40b504bae tf.reduce_sum( inp ...

  8. 哀悼疫情,全站灰色如何实现,CSS滤镜一行代码实现

    庚子清明,以国家之名哀悼,以国家之名哀悼在新冠肺炎疫情中牺牲的烈士和逝世的同胞! 向抗疫英雄致敬! 今日打开各样的app,各大电商,爱奇艺都是灰色的 这里我也一直很好奇该功能,前端如何实现,了解过后发 ...

  9. Linux文件权限问题

    更改权限命令   chmod 常用参数 -R, --recursive change files and directories recursively (以递归的方式对目前目录下的所有档案与子目录进 ...

  10. nginx学习之——信号控制和配置

    一.信号控制 1)TERM, INT   Quick shutdown  \\麻溜停掉(暴力停止),一般不常用 // 启动和停止nginx 当前目录:/usr/local/bin/nginx 启动: ...