版本管理

v3.0.0-RELEASE

change log

  • 兼容 elastic search 存储操作日志
  • 新增白名单通配符*

介绍视频


操作日志设计与实现

为了方便开发人员定位线上的问题,设计并实现了这个操作日志app,具体需求参考: http://192.168.175.55:9888/appDev/sie-nest-log/issues/1
该需求目前分为两期,第一期是只实现了rpc层面的请求参数和返回结果的记录, 第二期实现了rpc请求过程中涉及到的各个方法调用的详情,包括方法执行前参数、 调用后的结果数据、请求速率限制、请求黑白名单配置等功能。

设计

  • 日志功能需求
    由 http://192.168.175.55:9888/appDev/sie-nest-log/issues/1 需求可知, 需要记录rpc请求参数、执行过程详情和返回结果等需求。
  • 性能需求
    由于日志是非常频繁的,为了尽量影响用户的rpc请求,需要异步执行存储日志,防止大量日志影响用户的请求。 目前使用异步队列,日志生成后放入队列,消费方在独立的线程中批处理或者定时处理日志并存储。
  • 黑名单需求
    为了过滤掉一些非常频繁的rpc请求,需要对这些频繁的请求进行日志数据的限制, 同时为了保活用户要求的rpc方法防止因频率过高而被放置到黑名单,因为提供了黑白名单的功能,黑名单的方法不会保存日志,白名单的方法一定会保存日志。

实现

  • 日志功能
  1. 引擎部分

Image not found 如上图所示,主要在rpc的入口和finally出口进行数据采集并写入日志队列。

另外,需要采集rpc请求过程中的详情,那么就需要在 bussModelDataAccess create/update/delete 三个方法中记录相关日志

Image not found Image not found Image not found

可以发现在执行多个操作方法时,是按照执行的顺序,依次追加进context中的operatorData中的, 这个追加顺序就是链路的顺序。

  1. app部分
    app源码仓库参考:http://192.168.175.55:9888/appDev/sie-nest-log
    首先在app中定义了三个模型,分别是:操作日志模型、日志详情模型和黑白名单模型 这三个模型对应这两张数据库表,保存对应的数据内容。其中操作日志和日志详情表,是通过操作日志表的主键去关联日志详情表, 也就是说,一条操作日志可能会关联多条日志详情记录,日志详情记录了该操作日志操作过程中的create/update/delete前后的数据,由于在追加的时候已经维护了操作顺序,那么就可以通过生成spanID来在表中维护它们之间的顺序。 可参考下图所示代码:

Image not found

  • 性能
  1. 异步阻塞队列 考虑到写入日志的性能,维护了一个异步阻塞队列
    ArrayBlockingQueue<Map<String, Object>> queue = new ArrayBlockingQueue<>(5000); 任何日志产生后都写入该队列,独立线程进行阻塞消费该队列,触发消费行为由两个方面触发,一个是日志已经满200条,另一个是超时时间10s.

Image not found

  • 黑白名单

黑白名单是为了让用户配置哪些方法需要记录日志,哪些方法不需要记录日志。 此外,该日志app还会自动检测哪些方法的打印日志频率超过了给定的阈值,也会自动加入到黑名单,但是如果该方法已经配置了白名单, 那么不会再加入白名单了。简单来说判断顺序是:白名单 > app自动检测 > 黑名单

另外,考虑到查询黑白名单的性能,做了进程内缓存,会将使用到的黑白名单缓存在本地内存,并设置缓存的过期时间,也会定时扫描清楚过期的缓存 由于本地缓存与数据库的数据一致性,所以会存在一定的延迟,但最终是一致的。

Image not found

web页面效果

Image not found