电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

springboot基于過(guò)濾器實(shí)現(xiàn)接口請(qǐng)求耗時(shí)統(tǒng)計(jì)操作

瀏覽:40日期:2023-04-21 13:24:52

Spring Boot中實(shí)現(xiàn)一個(gè)過(guò)濾器相當(dāng)簡(jiǎn)單,實(shí)現(xiàn)javax.servlet.Filter接口即可。

下面以實(shí)現(xiàn)一個(gè)記錄接口訪問(wèn)日志及請(qǐng)求耗時(shí)的過(guò)濾器為例:

1、定義ApiAccessFilter類,并實(shí)現(xiàn)Filter接口

@Slf4j@WebFilter(filterName = 'ApiAccessFilter', urlPatterns = '/*')public class ApiAccessFilter implements Filter { @Override public void init(FilterConfig filterConfig) { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; Long requestId = IdGenUtils.nextIdByMem(); // 請(qǐng)求ID,這個(gè)是我業(yè)務(wù)中的id,大家可自行決定是否需要 long start = System.currentTimeMillis(); // 請(qǐng)求進(jìn)入時(shí)間 log.info('[Api Access] start. id: {}, uri: {}, method: {}, client: {}', requestId, request.getRequestURI(), request.getMethod(), getIP(request)); filterChain.doFilter(servletRequest, servletResponse); log.info('[Api Access] end. id: {}, duration: {}ms', requestId, System.currentTimeMillis() - start); } @Override public void destroy() { } /** * 獲取IP地址 * * @param request 請(qǐng)求 * @return request發(fā)起客戶端的IP地址 */ 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)) { //多次反向代理后會(huì)有多個(gè)ip值,第一個(gè)ip才是真實(shí)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、啟用該過(guò)濾器

springboot中兩種啟用過(guò)濾器的方式,第一種在FilterRegistrationBean中注冊(cè)該Filter,第二種,采用注解的方式啟用

個(gè)人覺(jué)得注冊(cè)方式比較麻煩,所有本例中使用的是第二種。

在Filter中添加注解@WebFilter(filterName = 'ApiAccessFilter', urlPatterns = '/*'),配置了過(guò)濾器名和需要過(guò)濾的請(qǐng)求地址,/*表示過(guò)濾所有請(qǐng)求。然后在啟動(dòng)類上,通過(guò)@ServletComponentScan注解,指明該過(guò)濾器即可

@SpringBootApplication@ServletComponentScan('com.yclouds.service.demo')public class YCloudsServiceDemoApplication { public static void main(String[] args) { SpringApplication.run(YCloudsServiceDemoApplication.class, args); }}

3、效果展示

springboot基于過(guò)濾器實(shí)現(xiàn)接口請(qǐng)求耗時(shí)統(tǒng)計(jì)操作

發(fā)送了兩次http請(qǐng)求,每次都會(huì)打印日志內(nèi)容,并且統(tǒng)計(jì)了整個(gè)請(qǐng)求的耗時(shí)情況。

GitHub地址:https://github.com/ye17186/spring-boot-learn

補(bǔ)充知識(shí):spring cloud gateway 之zuul通過(guò)filter配置接口請(qǐng)求的時(shí)間耗時(shí)記錄到日志

zuul中的Filter的配置,zuul中提供了三種類型的Filter,preFilter,routeFilter和postFilter,分別對(duì)應(yīng)請(qǐng)求中的不同的階段,針對(duì)同一個(gè)請(qǐng)求,有一個(gè)RequestContext對(duì)象,在三個(gè)階段的Filter中進(jìn)行共享

springboot基于過(guò)濾器實(shí)現(xiàn)接口請(qǐng)求耗時(shí)統(tǒng)計(jì)操作

假設(shè)我們要開(kāi)發(fā)一個(gè)統(tǒng)計(jì)請(qǐng)求時(shí)間的功能,需要在preFilter里邊記錄開(kāi)始時(shí)間,并將整個(gè)開(kāi)始時(shí)間放在RequestContext中,在postFilter里邊拿到開(kāi)始時(shí)間,用當(dāng)前的時(shí)間減去開(kāi)始時(shí)間,就是請(qǐng)求執(zhí)行的時(shí)間

定義一個(gè)preFilter:

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; /** * Created with Intellij IDEA * * @author: * Mail: * Date: * Time: * To change this template use File | Settings | Editor | File and Code Templates */ 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; } /** * 判斷是否要攔截的邏輯 * * @return */ @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; /** * Created with Intellij IDEA * * @author: * Mail: * Date: * Time: * To change this template use File | Settings | Editor | File and Code Templates */ 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('請(qǐng)求完成,耗時(shí){}秒', (System.currentTimeMillis() - startTime) / 1000); return null; }}

在一個(gè)配置類中將這兩個(gè)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; /** * Created with Intellij IDEA * * @author: * Mail: * Date: * Time: * To change this template use File | Settings | Editor | File and Code Templates */@Configurationpublic class FilterConfig { @Bean public ZuulFilter timeCostPreFilter() { return new TimeCostPreFilter(); } @Bean public ZuulFilter timeCostPostFilter() { return new TimeCostPostFilter(); } @Bean public ZuulFilter pdsFilter() { return new PDSFilter(); }}

啟動(dòng)項(xiàng)目,可以發(fā)現(xiàn),zuul網(wǎng)關(guān)已經(jīng)注冊(cè)到了eureka上:

springboot基于過(guò)濾器實(shí)現(xiàn)接口請(qǐng)求耗時(shí)統(tǒng)計(jì)操作

請(qǐng)求provide對(duì)應(yīng)的地址,發(fā)現(xiàn),zuul可以成功地調(diào)用eureka上對(duì)應(yīng)的服務(wù),并將結(jié)果正確返回:

springboot基于過(guò)濾器實(shí)現(xiàn)接口請(qǐng)求耗時(shí)統(tǒng)計(jì)操作

以上這篇springboot基于過(guò)濾器實(shí)現(xiàn)接口請(qǐng)求耗時(shí)統(tǒng)計(jì)操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: DDoS安全防护官网-领先的DDoS安全防护服务商 | 视频教程导航网_视频教程之家_视频教程大全_最新视频教程分享发布平台 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | 医学动画公司-制作3d医学动画视频-医疗医学演示动画制作-医学三维动画制作公司 | 嘉兴泰东园林景观工程有限公司_花箱护栏| (中山|佛山|江门)环氧地坪漆,停车场地板漆,车库地板漆,聚氨酯地板漆-中山永旺地坪漆厂家 | 雨燕360体育免费直播_雨燕360免费NBA直播_NBA篮球高清直播无插件-雨燕360体育直播 | 广东青藤环境科技有限公司-水质检测 | 大型工业风扇_工业大风扇_大吊扇_厂房车间降温-合昌大风扇 | BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 台式低速离心机-脱泡离心机-菌种摇床-常州市万丰仪器制造有限公司 | 电梯乘运质量测试仪_电梯安全评估测试仪-武汉懿之刻 | 铁艺,仿竹,竹节,护栏,围栏,篱笆,栅栏,栏杆,护栏网,网围栏,厂家 - 河北稳重金属丝网制品有限公司 山东太阳能路灯厂家-庭院灯生产厂家-济南晟启灯饰有限公司 | 皮带机_移动皮带机_大倾角皮带机_皮带机厂家 - 新乡市国盛机械设备有限公司 | SRRC认证_电磁兼容_EMC测试整改_FCC认证_SDOC认证-深圳市环测威检测技术有限公司 | 硫化罐_蒸汽硫化罐_大型硫化罐-山东鑫泰鑫智能装备有限公司 | 台式恒温摇床价格_大容量恒温摇床厂家-上海量壹科学仪器有限公司 | 污水提升器,污水提升泵,地下室排水,增压泵,雨水泵,智能供排水控制器-上海智流泵业有限公司 | 雷蒙磨,雷蒙磨粉机,雷蒙磨机 - 巩义市大峪沟高峰机械厂 | 玻纤土工格栅_钢塑格栅_PP焊接_单双向塑料土工格栅_复合防裂布厂家_山东大庚工程材料科技有限公司 | 酵素生产厂家_酵素OEM_酵素加盟_酵素ODM_酵素原料厂家_厦门益力康 | 重庆磨床过滤机,重庆纸带过滤机,机床伸缩钣金,重庆机床钣金护罩-重庆达鸿兴精密机械制造有限公司 | 包装机传感器-搅拌站传感器-山东称重传感器厂家-济南泰钦电气 | SDG吸附剂,SDG酸气吸附剂,干式酸性气体吸收剂生产厂家,超过20年生产使用经验。 - 富莱尔环保设备公司(原名天津市武清县环保设备厂) | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 岸电电源-60HZ变频电源-大功率变频电源-济南诚雅电子科技有限公司 | 智能电表|预付费ic卡水电表|nb智能无线远传载波电表-福建百悦信息科技有限公司 | 成都中天自动化控制技术有限公司 | 活性氧化铝|无烟煤滤料|活性氧化铝厂家|锰砂滤料厂家-河南新泰净水材料有限公司 | 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 密封无忧网 _ 专业的密封产品行业信息网 | 恒温恒湿试验箱厂家-高低温试验箱维修价格_东莞环仪仪器_东莞环仪仪器 | 郑州水质检测中心_井水检测_河南废气检测_河南中环嘉创检测 | 回收二手冲床_金丰旧冲床回收_协易冲床回收 - 大鑫机械设备 | 巨野月嫂-家政公司-巨野县红墙安康母婴护理中心 | 耐力板-PC阳光板-PC板-PC耐力板 - 嘉兴赢创实业有限公司 | 空气净化器租赁,空气净化器出租,全国直租_奥司汀净化器租赁 | 北京模型公司-工业模型-地产模型-施工模型-北京渝峰时代沙盘模型制作公司 | 耐酸碱泵-自吸耐酸碱泵型号「品牌厂家」立式耐酸碱泵价格-昆山国宝过滤机有限公司首页 |