在文章使用注解记录方法执行时长中详细介绍了怎么记录一个方法的调用时长。这种方式适合自生应用对自己的应用做自检工作。
在分布式微服务环境下,如果把一整套微服务的环境看成一个整体。想从整体去查看和分析微服务之间的调用情况,网络耗时情况,各个微服务的运行情况。就需要在服务级别去记录运行时长。
看这张图。A调用B的过程可以得到4个时间戳。分别是
① 调用前(请求还没发出)
② 服务执行前(请求到到B,但还没有执行具体业务服务)
③ 服务执行后(B的业务服务执行完毕)
④ 调用后(请求返回到A)
通过上述信息,可以得到3个信息。
① B服务的执行耗时
② A调用B服务的耗时(网络耗时+B服务的执行耗时)
③ 计算出网络耗时
把这些信息记录在数据库表中,并且形成图标就能很好的做查看和分析。看下表中的示例数据。
上代码
public class AccessJnlProviderFilter implements Filter {
private static final Logger LOGGER = LoggerFactory.getLogger(AccessJnlProviderFilter.class);
@Value("${common.dubbo.server.switch}")
private boolean logSwitch;
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
if(logSwitch) {// 开关,true:打开,false:关闭
return invoker.invoke(invocation);
}
String method = invoker.getInterface().getName() + "." + invocation.getMethodName();
LOGGER.debug("--- service provider start:" + method);
Result result = invoker.invoke(invocation);
LOGGER.debug("--- service provider end:" + method);
return result;
}
}
public class AccessJnlConsumerFilter implements Filter {
private static final Logger LOGGER = LoggerFactory.getLogger(AccessJnlConsumerFilter.class);
@Value("${common.dubbo.server.switch}")
private boolean logSwitch;
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
if(logSwitch) {// 开关,true:打开,false:关闭
return invoker.invoke(invocation);
}
String method = invoker.getInterface().getName() + "." + invocation.getMethodName();
LOGGER.debug("--- service consumer start:" + method);
Result result = invoker.invoke(invocation);
LOGGER.debug("--- service consumer end:" + method);
return result;
}
}
两个类,分别代表Provider
和Consumer
。我这边采用日志打印的方式记录信息,然后在线下处理解析日志入库来整理数据。