java metrics.counter_技术专栏 | 深入理解Metrics(二):Counters
原标题:技术专栏 | 深入理解Metrics(二):Counters
本章会继续讲解Metrics的第二个工具:Counters。
1. Counters的使用
在account内部使用Counters检测接口发生异常的次数,一段时间内如果超过阀值,会触发报警。
下面的一段代码是account用来检测用户登录失败发生的次数。
public class MetricsCounterTest extendsTest0Abstract {
private List users;
private String password;
@Autowired
@Qualifier("officialCustomerService")
private LoginService loginService;
@Before
public void before() {
password = "RIYU3ZOsYAThlfqfazyEbT+qe5ACN";
users = new ArrayList<>();
users.add("bingxin.li@tendcloud.com">bingxin.li@tendcloud.com");
users.add("bingxin.li001@tendcloud.com">bingxin.li001@tendcloud.com");
users.add("bingxin.li002@tendcloud.com">bingxin.li002@tendcloud.com");
users.add("bingxin.li003@tendcloud.com">bingxin.li003@tendcloud.com");
users.add("bingxin.li004@tendcloud.com">bingxin.li004@tendcloud.com");
users.add("bingxin.li005@tendcloud.com">bingxin.li005@tendcloud.com");
users.add("libingxin2013@outlook.com">libingxin2013@outlook.com");
}
@Test
public void login() throws Exception {
MetricRegistry metrics = new MetricRegistry();
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics).build();
reporter.start(1, TimeUnit.SECONDS);
Counter counter = metrics.counter(
MetricRegistry.name(MetricsCounterTest.class, "failed","size"));
for (String user : users) {
try {
loginService.login(Base64.getEncoder().encodeToString(user.getBytes()),password);
} catch (HttpUnauthorizedException e) {
counter.inc();
TimeUnit.SECONDS.sleep(2);
Assert.assertTrue(counter.getCount() < 3);
}
}
}
}
运行后输出:
17-11-28 17:35:30=============================================================
-- Counters --------------------------------------------------------------------
metrics.MetricsCounterTest.failed.size
count = 3
java.lang.Asserti
atorg.junit.Assert.fail(Assert.java:86)
atorg.junit.Assert.assertTrue(Assert.java:41)
atorg.junit.Assert.assertTrue(Assert.java:52)
atmetrics.MetricsCounterTest.login(MetricsCounterTest.java:66)
atsun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
atjava.lang.reflect.Method.invoke(Method.java:498)
atorg.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
atorg.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
atorg.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
atorg.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
atorg.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
从输出结果可以看出,ConsoleReporter每秒输出异常次数,当异常次数达到阀值3时,断言失败。
2. Counter 层级结构
Counter内部通过持有LongAdderAdapter的实例来实现Counting接口,而LongAdderAdapter内部依赖的是JDK1.8并发原子操作的LongAdder。
那么Counter是如何获取到LongAdderAdapter的实例呢?
3. LongAdder 工作原理
通过上面的创建和适配过程,并发原子操作最终交由LongAdder类完成,下面让我们来研究下LongAdder类的工作流程。
工作流程说明:
1. LongAdder继承Striped64类,Striped64使用不安全的Unsafe类来进行原子操作。为了防止不可预测的情况发生,建议不要在代码中直接使用,除非你有Doug Lea的实力。
2.LongAdder最核心的就是 add(long x) 方法,不管自增和自减都会调用此方法。
3.add方法基于base的CAS操作返回值来验证是否发生并发。
4.未发生并发:后续的原子操作、返回值都是基于base。
5.发生并发:通过Cell数组将原子操作分散到子项中进行,Cell是Striped64的内部类,里面有存储long值的value字段。
6.Cell数组的索引:依赖与当前线程的threadLocalRandomProbe。
获取偏移量的代码解析:
是否发生了并发操作:
实际的并发操作:
4. 结束语
Java除了并发包,还有很多集合类等都是Doug Lea编写的,他的个人主页:http://g.oswego.edu/
通过本章对Counters的讲解,相信你一定会有所收获。返回搜狐,查看更多
责任编辑:
java metrics.counter_技术专栏 | 深入理解Metrics(二):Counters相关推荐
- 网络技术概念与Java网络编程技术——最通俗的理解(转载)
网络编程 网络编程对于很多的初学者来说,都是很向往的一种编程技能,但是很多的初学者却因为很长一段时间无法进入网络编程的大门而放弃了对于该部分技术的学习. 在 学习网络编程以前,很多初学者可能觉得网络编 ...
- Java架构师成长之道之Java架构师技术栈
Java架构师成长之道之Java架构师技术栈 Java架构师成长之道 JavaSE篇 Java概述与开发环境搭建 Java数据存储 Java数据运算 Java程序流程控制 Java数组 Java面向对 ...
- 阿里高级专家:我对技术架构的理解
点击上方"芋道源码",选择"设为星标" 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | ...
- 阿里JAVA开发手册零度的思考理解(二)
转载请注明原创出处,谢谢! 说在前面 人生的大道上默默地走,就必须要有一盏灯亮着为你引导方向!而这盏灯抑或只是一句话,一句鼓励,一个赞美,一次承认,一次认可,一次相识一次交流-- 上篇文章:阿里JAV ...
- Java Web - Ajax技术
一 为什么会有Ajax技术的出现 想必大家肯定用过百度,当我们在百度的搜索框中输入文字的时候,下面就会自动出现你可能希望搜索的内容,但是页面中的其他内容都没有变化: 可以想象,这些内容都是根据在输入框 ...
- Java开发与技术挑战——关于技术的技术思考
Java开发与技术挑战--关于技术的技术思考 width="22" height="16" src="http://hits.sinajs.cn ...
- java swing 组件技术(上)
2019独角兽企业重金招聘Python工程师标准>>> 第一次写自己的博客,明知道写得很水,还是努力去写了,希望踏出第一步之后,能有着更好的发展.这几天看了一些资料,总结了一下自己所 ...
- 国外JAVA与IT技术网站地址
以下是国外JAVA与IT技术网站地址,每个都可以打开的,特此共享,希望对大家有帮助! 1.http://www.onjava.com - O'Reilly的Java网站. 每周都有新文章. 2.htt ...
- 对java面向对象的三大特征的理解_Java面向对象的三大特征是什么?
面向对象的三大核心特性简介 面向对象开发模式更有利于人们开拓思维,在具体的开发过程中便于程序的划分,方便程序员分工合作,提高开发效率. 该开发模式之所以使程序设计更加完善和强大,主要是因为面向对象具有 ...
最新文章
- bzoj1601【Usaco2008 Oct】灌水
- Django+xadmin打造在线教育平台(十)
- 【Python之旅】第二篇(三):基于列表处理的购物清单程序
- php小结,PHP编程小结
- idea运行项目报错Cannot run program “C:\Program Files\Java\jdk1.8.0_121\bin\java.exe......解决办法
- Android之EditText自定义边框和边框颜色(转载)
- 【重难点】【Java基础 06】浅克隆与深克隆、Object类的常用方法、util包下的接口
- RFC 8998: ShangMi (SM) Cipher Suites for TLS 1.3
- 如何反编译APK文件
- Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX AVX2”
- 深入了解字符集和编码
- 收评:5月24日资金流向(摘自益盟)
- WIN10 下 autocad2006 及其他版本打开文件多窗口不能一个窗口的解决办法
- 数论学习笔记1之积性函数与线性筛求积性函数
- 华为交换机配置consol密码及vty密码
- linux内核全局变量重定位,动态链接库中全局变量的重定位问题
- php苹果笔记本编程,Mac端软件推荐,让你成为编程高富帅!
- 【win10】文件重命名怎么改不了文件格式/改不了后缀/想要更改文件后缀/改变文件类型
- windows11微软官方安装介质制作
- 部署WekaFS并行文件系统的10大理由