栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springboot基于过滤器实现接口请求耗时统计操作

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springboot基于过滤器实现接口请求耗时统计操作

Spring Boot中实现一个过滤器相当简单,实现javax.servlet.Filter接口即可。

下面以实现一个记录接口访问日志及请求耗时的过滤器为例:

1、定义ApiAccessFilter类,并实现Filter接口

@Slf4j
@WebFilter(filterName = "ApiAccessFilter", urlPatterns = "
  private String getIP(HttpServletRequest request) {
    if (request == null) {
      return "0.0.0.0";
    }
 
    String Xip = request.getHeader("X-Real-IP");
    String XFor = request.getHeader("X-Forwarded-For");
 
    String UNKNOWN_IP = "unknown";
    if (StringUtils.isNotEmpty(XFor) && !UNKNOWN_IP.equalsIgnoreCase(XFor)) {
      //多次反向代理后会有多个ip值,第一个ip才是真实ip
      int index = XFor.indexOf(",");
      if (index != -1) {
 return XFor.substring(0, index);
      } else {
 return XFor;
      }
    }
 
    XFor = Xip;
    if (StringUtils.isNotEmpty(XFor) && !UNKNOWN_IP.equalsIgnoreCase(XFor)) {
      return XFor;
    }
 
    if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) {
      XFor = request.getHeader("Proxy-Client-IP");
    }
    if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) {
      XFor = request.getHeader("WL-Proxy-Client-IP");
    }
    if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) {
      XFor = request.getHeader("HTTP_CLIENT_IP");
    }
    if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) {
      XFor = request.getHeader("HTTP_X_FORWARDED_FOR");
    }
    if (StringUtils.isBlank(XFor) || UNKNOWN_IP.equalsIgnoreCase(XFor)) {
      XFor = request.getRemoteAddr();
    }
    return XFor;
  }
}

2、启用该过滤器

springboot中两种启用过滤器的方式,第一种在FilterRegistrationBean中注册该Filter,第二种,采用注解的方式启用

个人觉得注册方式比较麻烦,所有本例中使用的是第二种。

在Filter中添加注解@WebFilter(filterName = "ApiAccessFilter", urlPatterns = " public class TimeCostPreFilter extends ZuulFilter { public static final String START_TIME_KEY = "start_time"; private Logger logger = LoggerFactory.getLogger(TimeCostPreFilter.class); @Override public String filterType() { return FilterConstants.PRE_TYPE; } @Override public int filterOrder() { return 0; } @Override public boolean shouldFilter() { return true; } @Override public Object run() throws ZuulException { long startTime = System.currentTimeMillis(); RequestContext.getCurrentContext().set(START_TIME_KEY, startTime); return null; } }

定义以postFilter:

package com.jiaoyiping.springcloud.zuul.filter; 
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
 

 
public class TimeCostPostFilter extends ZuulFilter {
  private static final String START_TIME_KE = "start_time";
  private Logger logger = LoggerFactory.getLogger(TimeCostPostFilter.class);
 
  @Override
  public String filterType() {
    return FilterConstants.POST_TYPE;
  }
 
  @Override
  public int filterOrder() {
    return 0;
  }
 
  @Override
  public boolean shouldFilter() {
    return true;
  }
 
  @Override
  public Object run() throws ZuulException {
    long startTime = (long) RequestContext.getCurrentContext().get(START_TIME_KE);
    logger.info("请求完成,耗时{}秒", (System.currentTimeMillis() - startTime) / 1000);
    return null;
  }
}

在一个配置类中将这两个Filter注入:

package com.jiaoyiping.springcloud.zuul.config; 
import com.jiaoyiping.springcloud.zuul.filter.PDSFilter;
import com.jiaoyiping.springcloud.zuul.filter.TimeCostPostFilter;
import com.jiaoyiping.springcloud.zuul.filter.TimeCostPreFilter;
import com.netflix.zuul.ZuulFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 

@Configuration
public class FilterConfig {
 
  @Bean
  public ZuulFilter timeCostPreFilter() {
    return new TimeCostPreFilter();
  }
 
  @Bean
  public ZuulFilter timeCostPostFilter() {
    return new TimeCostPostFilter();
  }
 
 
  @Bean
  public ZuulFilter pdsFilter() {
    return new PDSFilter();
  }
}

启动项目,可以发现,zuul网关已经注册到了eureka上:

请求provide对应的地址,发现,zuul可以成功地调用eureka上对应的服务,并将结果正确返回:

以上这篇springboot基于过滤器实现接口请求耗时统计操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/131481.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号