一、具体要求

  • 在真实业务场景中,经常需要对各个业务接口的响应性能进行监控(常用指标为:TP90、TP99)
  • 通过扩展Dubbo的Filter(TPMonitorFilter),完成简易版本 Dubbo 接口方法级性能监控,记录下TP90、TP99请求的耗时情况
要求 说明
1 提供一个Dubbo服务,提供3个方法(eat、sleep、beatBeanBean),每方法都实现了随机休眠0-100ms
2 编写一个消费端程序,不断调用Dubbo服务的3个方法(建议利用线程池进行并行调用,确保在1分钟内可以被调用2000次以上)
3 利用TPMonitorFilter在消费端记录每个方法的请求耗时时间(异步调用不进行记录)
4 每隔5s打印一次最近1分钟内每个方法的TP90、TP99的耗时情况

二、实现思路介绍

说明:api/consumer/provider 三个模块的内容 在这里就不多介绍了,感兴趣的可以到下方的源码下载中,下载没有过滤器的基础案例

三、自定义过滤器,实现方法拦截,统计方法执行时间,存储方法执行信息,计算TP90/99

步骤1:自定义拦截器TPNMonitorFilter,方法执行就拦截,利用TPMonitorFilter在消费端记录每个方法的请求耗时时间

TPNMonitorFilter 实现接口Filter 重写invoke方法,在方法内部进行方法拦截,并计算方法耗时

//在消费者端进行激活此拦截器
@Activate(group = {CommonConstants.CONSUMER})
public class TPNMonitorFilter implements Filter ,Runnable{/*** 方法执行就拦截:利用TPMonitorFilter在消费端记录每个方法的请求耗时时间* @param invoker* @param invocation* @return* @throws RpcException*/@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {       //(具体实现看下方功能实现代码) //获取方法执行的起始时间//执行方法//计算方法执行的耗时//将当前的方法添加到全局map中,在map中指定一个集合进行记录当前方法执行情况}}
步骤2:创建一个集合存储三个方法执行得相关信息(包括:方法名称,方法执行耗时,方法执行结束时间)
//在消费者端进行激活此拦截器
@Activate(group = {CommonConstants.CONSUMER})
public class TPNMonitorFilter implements Filter ,Runnable{/*** 存储方法执行得相关信息(方法名称,方法执行耗时,方法执行结束时间)*/Map<String, List<MethodInfo>> methodTimes = new ConcurrentHashMap<>();}

自定义bean存储方法执行信息

public class MethodInfo {// 方法名private  String name;// 执行耗时private  long   times;// 结束时间private  long   endTimes;public MethodInfo() {}public MethodInfo(String name, long times,long endTimes) {this.name = name;this.times = times;this.endTimes = endTimes;}public String getName() {return name;}public void setName(String name) {this.name = name;}public long getTimes() {return times;}public void setTimes(long times) {this.times = times;}public long getEndTimes() {return endTimes;}public void setEndTimes(long endTimes) {this.endTimes = endTimes;}
}
步骤3:自定义线程,计算tp90/tp99

TPNMonitorFilter 实现接口Runnable重写run方法,在方法内部进行方法拦截,并计算方法耗时

//在消费者端进行激活此拦截器
@Activate(group = {CommonConstants.CONSUMER})
public class TPNMonitorFilter implements Filter ,Runnable{//在消费者端进行激活此拦截器@Activate(group = {CommonConstants.CONSUMER})public class TPNMonitorFilter implements Filter ,Runnable{/*** 线程方法*/@Overridepublic void run() {//计算并打印最近1分钟内每个方法的TP90、TP99的耗时情况(具体实现看下方功能实现代码)}}
}
步骤4:配置filter的spi


此时整个自定义Filter的整理结构就介绍完了


功能实现1:每隔5s打印一次最近1分钟内每个方法的TP90、TP99的耗时情况
//每隔5s调用一次下方的run方法,统计计算一次1分钟内每个方法的TP90、TP99的耗时情况
public TPNMonitorFilter(){// 创建定时线程,每隔5s打印一次最近1分钟内每个方法的TP90、TP99的耗时情况Executors.newSingleThreadScheduledExecutor().scheduleWithFixedDelay(this, 5,5, TimeUnit.SECONDS);}
}

线程具体执行操作:

  /*** 线程方法*/@Overridepublic void run() {Date date = new Date();SimpleDateFormat sdf  = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");String dateStr = sdf.format(date);/*** 线程使用情况*/for(Map.Entry<String,List<MethodInfo>> methodInfos : methodTimes.entrySet()){System.out.println(dateStr+ methodInfos.getKey() +"的TP90:" + getTP(methodInfos.getValue(),0.9) + "毫秒,"+ "TP99:" + getTP(methodInfos.getValue(),0.99)+ "毫秒" );}}

TP90、TP99的耗时情况计算:

/*** 后续会每隔5s调用一次此方法,打印最近1分钟内每个方法的TP90、TP99的耗时情况** 计算tp90和tp99* @param methodInfos* @param rate 代表百分比 90 传入 0.9 即可  99 就是 0.99* @return*/private  long  getTP(List<MethodInfo> methodInfos,double  rate){// 构建一个临时集合保存 用于满足1一分钟之内的数据List<MethodInfo>  sortInfo = new ArrayList<>();// 计算最近一分钟的TP90 和 TP99long  endTime = System.currentTimeMillis();long  startTime = System.currentTimeMillis() - 60000;// 遍历列表集合int  length = methodInfos.size();for (int i=0;i<length;i++){MethodInfo  methodInfo = methodInfos.get(i);if (methodInfo.getEndTimes() >= startTime && methodInfo.getEndTimes() <= endTime){//将满足条件的方法信息存储到临时集合中sortInfo.add(methodInfo);}}//对满足1一分钟之内的数据进行排序sortInfo.sort(new Comparator<MethodInfo>() {@Overridepublic int compare(MethodInfo o1, MethodInfo o2) {if(o1.getTimes() > o2.getTimes()){return  1;}else if(o1.getTimes() < o2.getTimes()){return -1;}else{return  0;}}});//获取当前排序后集合中的指定百分比数值的位置,此位置存储的数据就是当前计算的tp90/99int  index = (int)(sortInfo.size() * rate);return sortInfo.get(index).getTimes();}
功能实现2:方法执行就拦截,利用TPMonitorFilter在消费端记录每个方法的请求耗时时间
   /*** 方法执行就拦截:利用TPMonitorFilter在消费端记录每个方法的请求耗时时间* @param invoker* @param invocation* @return* @throws RpcException*/@Overridepublic Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {// 获取执行方法名Result result = null;Long takeTime = 0L;try{//获取方法执行的起始时间Long startTime = System.currentTimeMillis();//执行方法result = invoker.invoke(invocation);if (result.getException() instanceof Exception) {throw new Exception(result.getException());}//计算方法执行的耗时takeTime = System.currentTimeMillis() - startTime;}catch (Exception e){e.printStackTrace();return result;}System.out.println("method="+invocation.getMethodName() + "消耗的时间:"+takeTime +"毫秒");String methodName = invocation.getMethodName();List<MethodInfo> methodInfos =  methodTimes.get(methodName);//方法执行第一次的时候,创建空集合进行存储if (methodInfos == null){methodInfos = new ArrayList<>();methodTimes.put(methodName,methodInfos);}//将当前的方法添加到map中指定的记录当前方法执行情况的集合中methodInfos.add(new MethodInfo(invocation.getMethodName(),takeTime,System.currentTimeMillis()));return  result;}

运行程序

  1. 启动zookeepr
    2. 启动provider
    3. 启动consumer

源码下载

案例 地址
基础案例 下载地址:gitee代码下载
功能实现案例 下载地址:gitee代码下载

简易版Dubbo方法级性能监控(实现TP90、TP99)相关推荐

  1. 简易版Dubbo方法级性能监控(TP90、TP99)

    简易版Dubbo方法级性能监控(TP90.TP99) 代码:https://gitee.com/szile20/lagou_stage3_module3 一.实现思路 创建API模块,提供consum ...

  2. 性能调优之Java系统级性能监控及优化

    性能调优之Java系统级性能监控及优化 对于性能调优而言,通常我们需要经过以下三个步骤:1,性能监控:2,性能剖析:3,性能调优 性能调优:通过分析影响Application性能问题根源,进行优化Ap ...

  3. java -jar 未响应_Java 方法性能监控和统计工具 MyPerf4J

    一个针对高并发.低延迟应用设计的高性能 Java 性能监控和统计工具. 特性 高性能: 单线程支持每秒 1000 万次 响应时间的记录,每次记录只花费 73 纳秒 无侵入: 采用 JavaAgent ...

  4. Informix 11.5 SQL 语句性能监控方法及实现

    本文主要介绍 Informix 11.5 中 SQL 语句性能监控的基本方法及实现,希望能够使大家有一个比较全面的了解. 我们知道,在数据库应用系统中,SQL 语句的性能好坏至关重要.如果 SQL 语 ...

  5. 《深入理解Java虚拟机第3版》垃圾收集器与内存分配策略、虚拟机性能监控故障处理工具

    目录 往期博客:Java课堂篇3_初识JMM.常量池简单理解(字符串常量池.静态常量池.大整型常量池) 为什么要了解垃圾收集和内存分配? 如何判断对象已死? 引用计数算法 可达性分析算法 JDK1.2 ...

  6. [NewLife.XCode]实体列表缓存(最土的方法实现百万级性能)

    NewLife.XCode是一个有10多年历史的开源数据中间件,支持nfx/netcore,由新生命团队(2002~2019)开发完成并维护至今,以下简称XCode. 整个系列教程会大量结合示例代码和 ...

  7. 磁盘 I/O 性能监控指标和调优方法

    在介绍磁盘 I/O 监控命令前,我们需要了解磁盘 I/O 性能监控的指标,以及每个指标的所揭示的磁盘某方面的性能.磁盘 I/O 性能监控的指标主要包括: 指标 1:每秒 I/O 数(IOPS 或 tp ...

  8. Duilib版视频监控客户端(简易版)

    Duilib版视频监控客户端(简易版) 基于目前物联网发展的形式,网络视频监控几乎无处不在,对监控的视频的查看和回放自然成了必不可少的部分,下面介绍一下使用Duilib来开发的视频监控客户端例子. 界 ...

  9. linux如何脚本监控tps,对Linux进行详细的性能监控的方法

    这是我们正在进行的Linux命令和性能监控系列的一部分.vmstat和iostat两个命令都适用于所有主要的类unix系统(Linux/unix/FreeBSD/Solaris). 如果vmstat和 ...

最新文章

  1. 力压 Java 与 C 的 Python 现状如何了?
  2. 【星球知识卡片】换脸算法和人脸驱动都有哪些核心技术,如何对其长期深入学习...
  3. 介绍微软一个罕为人知的无敌命令
  4. python渐变色代码_如何在Python中创建颜色渐变?
  5. apache目录 vscode_VsCode搭建Java开发环境(Spring Boot项目创建、运行、调试)
  6. 用API OleLoadPicture通过IStream来加载JPG、GIF格式的图片
  7. Firefox附加在合谋表演,谁跟踪你上网
  8. 微信技术总监周颢:一亿用户背后的架构秘密
  9. [转载]Qlist的用法
  10. caffe安装系列——综述
  11. emblog博客打开显示 数据库密码错误,请返回主页的解决办法!
  12. 基于偏微分方程的图像分割(二)Snake模型 Matlab实现
  13. 1、Dreamweaver工具的使用
  14. selenium网页截图总结
  15. 相似剩余金额宝数值添加的动画
  16. 音频线是什么 音频线如何连接
  17. linux进程的通信文件映射,Linux进程间通信 -- mmap函数的使用
  18. python培训班哪些比较好-python培训机构哪家好?怎样选择python培训机构?
  19. Sql server AlwaysOn搭建常见问题
  20. mysql学习-Innodb行格式compact行记录解析

热门文章

  1. python自动化运维之python2.6升级2.7和集中病毒扫描
  2. CentOS 6.3 下编译cyrus-sasl报错解决
  3. SilverLight小游戏
  4. javaweb基础 02--javaweb基础概念
  5. 高质量 Node.js 微服务的编写和部署
  6. bzoj 1096 斜率优化DP
  7. #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  8. 判断是否是2的N次方各方法运行速度比较
  9. LeetCode 201. 数字范围按位与
  10. B+树索引和哈希索引