首页 > 解决方案 > 测量一个请求发送到zuul代理的时间

问题描述

我在spring boot中制作了多个与zuul代理通信的微服务。我的问题是请求花费了太多时间,我想测量从请求到达代理所花费的时间以及请求的时间从代理转发到我的微服务。有没有办法做到这一点?谢谢!

标签: springspring-bootspring-cloudnetflix-zuul

解决方案


与此类似的其他方法可以使用ZuulFilter. 下面的代码是在没有检查的情况下编写的,所以可能会有一些错误,但它应该显示这个想法。首先添加前置过滤器

public class PreFilter extends ZuulFilter {

    private static final Logger logger = LoggerFactory.getLogger(PreFilter.class);

    @Override
    public int filterOrder() {
        return PRE_DECORATION_FILTER_ORDER - 1; // run before PreDecoration
    }

    @Override
    public String filterType() {
        return PRE_TYPE;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        long startTime = Instant.now().toEpochMilli();
        logger.info("Request URL::" + request.getRequestURL().toString() +
        ":: Start Time=" + Instant.now());
        ctx.put("startTime", startTime);
        return null;
    }
}

然后在 Post 过滤器中

public class PostFilter extends ZuulFilter {

    private static final Logger logger = LoggerFactory.getLogger(PostFilter.class);
    @Override
    public String filterType() {
        return POST_TYPE;
    }

    @Override
    public int filterOrder() {
        return SEND_RESPONSE_FILTER_ORDER - 1;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        HttpServletRequest request = ctx.getRequest();
        long startTime = (Long) ctx.get("startTime");

        logger.info("Request URL::" + request.getRequestURL().toString() +
   ":: Time Taken=" + (Instant.now().toEpochMilli() - startTime));
        return null;
    }
}

推荐阅读