放着,我来 by zhongl

利用测试用例提升 Code Review 的效率

一说到 Code Review 没人不说好, 可一旦开始做就呵呵哒了。 貌似写测试用例也是如此, 本文斗胆将二者结合起来,看看是否能够提升 Code Review 的效率, 同时还增加一个写好测试用例的理由。

回顾我的微服务之旅

引言

2015年的元旦,我加入了挖财,而后的两年时间里我所经历的,在今天看来是非常值得记录的。

整个过程看起来有点像是一场没有计划的探险,大多都是自己和伙伴们见招拆招凭着经验和直觉一路走下来的。

现在,我把它称之为是“微服务之旅”,并这里细数道来,为的是让它作为Microservices一文的补充案例,供同道者借鉴与反思。

maven-shade-plugin遭遇log4j2会出现的问题与解决办法

引言

Java 应用开发时常会有一个 隐隐作痛 的问题, 就是部署的 jar 很臃肿。 大多数情况下,当传输和存储都还未成瓶颈时, 对此我们还是可以容忍的, 哪怕是它已经有几百兆。但在有些场景下, 例如 Android 开发, 我们则需要非常严肃地对待这个问题,将其 jar 的大小降至最低。

Android 开发中使用的打包裁剪工具是 ProGuard。相较 maven-shade-plugin 而言,它裁剪粒度更精细,使得最终裁剪的大小可以做得更小, 只是相应的我们需要付出更多时间才能做到。

作为一个有轻度强迫症的程序员, 我在近期试图应对这个问题的时候, 花了不少时间踩坑, 觉得有必要记录一下。

Stagemonitor中获取执行SQL的调用方法的实现与改进

Stagemonitor 有个特性是, 可以展示出所有执行 SQL 调用的方法测量数据, 比如请求量, 耗时分布。实现计量数据的收集并不难(原理可见《动态实时跟踪你的java程序》),但要想获取执行SQL的调用方法是什么,则是需要一点“小聪明”。

相信你已经想到了!通过Thread.currentThread().getStackTrace()就可以拿到当前方法的调用栈StackTraceElement[],遍历它便可确定调用执行 SQL 的方法究竟有哪些。具体我们看看 Stagemonitor实现代码吧:

零侵入式启动javaagent在stagemonitor中的实现

启动 Javaagent

以下摘自 Oracle Javase 8 Doc

Command-Line Interface

An implementation is not required to provide a way to start agents from the command-line interface. On implementations that do provide a way to start agents from the command-line interface, an agent is started by adding this option to the command-line:

-javaagent:jarpath[=options]

通过命令行参数的方式启动 Javaagent 是最常用的一种方式,但却不是唯一的方式。正如文档中提到的, 启动 Javaagent 其实是有两个入口方法:

public static void premain(...);        // [1]

public static void agentmain(...);      // [2]
  1. 命令行参数的方式启动的是 premain,而另一种
  2. agentmain 则是通过 Attach API 启动的,如下:
String pid = ...
VirtualMachine vm = VirtualMachine.attach(pid);
vm.loadAgent("/path/to/agent");
vm.detach();

零侵入式随JVM运行而启动 Javaagent

所谓零侵入, 是指对目标JVM应用不做任何修改,有且仅将 Javaagent 置于特定的位置就能实现对其启动呢?

只是基于前文的知识,几乎是不可能做到的。幸运的是,我曾和一位资深专家聊到过这个话题,他启发我从 stagemonitor 中找到了答案。