香蕉云编原创发布日期:2019-6-26
在一些中大型的项目,各服务之间调用频繁,很容易出现假如某一个子服务A长时间无响应,会导致其他的服务因为调用了A服务,而造成大面积的接口拒绝服务无响应,因此我们需要一个监控机制实现对接口或服务响应时间的监控。
很多人都知道spring cloud+zipkin可以实现对微服务的监控,但其实有更简单的方法实现对微服务或入口网关的监控。这个方法就是过滤器。
那么为什么我们自建过滤器,而不使用现成的zipkin服务去监控呢?因为我们只需要找到响应慢的服务或接口就行了(下面我们统一称为“慢接口”),而spring cloud+zipkin的原理是每调用一次微服务都会将数据汇报到zipkin服务里去,这会产生很多没必要的流量和调用zipkin的消耗。假如自定义过滤器,我们只需要把慢接口记录下日志就行,也更加轻量化。
当今的分布式系统,越来越多的额外服务消耗,比如session使用redis共享导致Spring默认过滤器初始化session的时间消耗,调用微服务经过注册中心得出微服务的地址又有时间消耗,然后假如监控又调用几次zipkin服务,则产生大量的服务调用消耗。因此,很容易出现一个原本单机应用30ms能完成的事情,微服务化后响应时间变成了500ms。因此,我还是建议轻量级化,能减少服务调用的尽量减少服务的调用。小编在这里弃用zipkin,而使用自建过滤器去实现。
下面,重点列出过滤器的代码:
@Order(1)
@WebFilter(urlPatterns = "/*",filterName = "MyFilter")
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
Date d1=new Date();
filterChain.doFilter(request,response);
Date d2=new Date();
long time=d2.getTime()- d1.getTime();
String strUrl=((HttpServletRequest)request).getRequestURI();
if(time>1000)
{
//todo:调用慢接口日志记录服务
System.out.println("写入慢接口日志服务:"+strUrl);
}
System.out.println("time:"+time);
}
}
在spring boot的启动类里面记得加入这个属性让过滤器生效:@ServletComponentScan
以上就是过滤器的全部代码,只需要在web的入口网关,或每个微服务的实现项目里添加这个过滤器,就可以实现对慢接口的记录,大大的减少了访问zipkin的流量,而且过滤器的实现并不复杂。
这个是监控web接口或微服务的慢接口的方法,能把性能低的微服务迅速定位出来,从而优化项目。
假如你使用的是mysql数据库,你还可以开启mysql的慢查询日志记录功能,因为目前大部分的系统,主要的性能瓶颈就是数据查询的瓶颈,因此对数据库慢查询的监控还是非常有必要的。
开启mysql慢查询日志的方法很简单,只需要在mysql的配置文件里面的[mysqld]节点添加下面的代码即可:
[mysqld]
slow_query_log = on
slow_query_log_file = /data/mysql/slow.log
long_query_time = 2
上面long_query_time的单位是秒,代表将查询时间超过2秒的sql语句写进慢查询日志。