1. 在数据库中创一个新的表

因为须要存入数据库,所以依据你的理论业务创立这个表,我没弄多大,因为保留不到几天就会删掉。表名称和字段都随你意:
    表名称:biz_monitor_time     id int 5 不是null 主键自增    request_address varchar 50 不是null 申请地址    waste_time int 5 不是null 消耗工夫    create_time datetime 默认值now() 不是null 创立工夫

2. 依据创立的表生成代码

就是那几个层:mapper、service、serviceImpl、controller你能够用代码生成器主动生成,当然你也能够手撸,如果你既不想手撸也没有生成器,我把代码会贴在上面,供你参考:

domain :

package com.cema.manage.project.manage.monitorTime.domain;/** * 统计http申请响应时间表 biz_monitor_time * * @author reasahi * @date 2021-04-27 */@TableName(value = "biz_monitor_time")public class MonitorTime extends Model<MonitorTime> {    private static final long serialVersionUID = 1L;    /**     * 主键     */    @TableId(value = "id")    private Integer id;    /**     * 申请地址     */    @TableField(value = "request_address")    private String requestAddress;    /**     * 消耗工夫     */    @TableField(value = "waste_time")    private Integer wasteTime;    /**     * 创立工夫     */    @TableField(value = "create_time")    private Date createTime;    /**     * 设置:主键     */    public void setId(Integer id) {        this.id = id;    }    /**     * 获取:主键     */    public Integer getId() {        return id;    }    /**     * 设置:申请地址     */    public void setRequestAddress(String requestAddress) {        if (requestAddress != null) {            if (requestAddress.trim().isEmpty()) {                this.requestAddress = null;            } else {                this.requestAddress = requestAddress;            }        }    }    /**     * 获取:申请地址     */    public String getRequestAddress() {        return requestAddress;    }    /**     * 设置:消耗工夫     */    public void setWasteTime(Integer wasteTime) {        this.wasteTime = wasteTime;    }    /**     * 获取:消耗工夫     */    public Integer getWasteTime() {        return wasteTime;    }    /**     * 设置:创立工夫     */    public void setCreateTime(Date createTime) {        this.createTime = createTime;    }    /**     * 获取:创立工夫     */    public Date getCreateTime() {        return createTime;    }    @Override    protected Serializable pkVal() {        return this.id;    }}

mapper :

package com.cema.manage.project.manage.monitorTime.mapper;/** * 统计http申请响应工夫 数据层 *  * @author reasahi * @date 2021-04-27 */public interface MonitorTimeMapper  extends BaseMapper<MonitorTime>{    void insertMonitorTime(MonitorTime monitorTime);}

xml :

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"        "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.cema.manage.project.manage.monitorTime.mapper.MonitorTimeMapper">    <!--  biz_monitor_time  -->    <resultMap id="resultMapMonitorTime" type="com.cema.manage.project.manage.monitorTime.domain.MonitorTime">        <id column="id" property="id"></id>        <result column="request_address" property="requestAddress"></result>        <result column="waste_time" property="wasteTime"></result>        <result column="create_time" property="createTime"></result>    </resultMap>    <insert id="insertMonitorTime" parameterType="com.cema.manage.project.manage.monitorTime.domain.MonitorTime">        INSERT INTO biz_monitor_time (request_address, waste_time)        VALUES (#{requestAddress}, #{wasteTime});    </insert></mapper>

service :

package com.cema.manage.project.manage.monitorTime.service;/** * 统计http申请响应工夫 服务层 *  * @author reasahi * @date 2021-04-27 */public interface IMonitorTimeService extends IService<MonitorTime>{    void insertMonitorTime(MonitorTime monitorTime);    }

serviceImpl :
阐明:
代码中的 @Async("asyncServiceExecutor") 为异步调用 外面的 asyncServiceExecutor 为本人创立的异步服务执行器的bean的名称,它实际上是一个线程池,我将它丢进去做异步解决,你能够本人撸一个,或者复制他人的,都没关系。如果你不喜爱手撸,那我会贴在上面,供你参考:

package com.cema.manage.project.manage.monitorTime.service;/** * 统计http申请响应工夫 服务层实现 * * @author reasahi * @date 2021-04-27 */@Servicepublic class MonitorTimeServiceImpl extends ServiceImpl<MonitorTimeMapper, MonitorTime> implements IMonitorTimeService {    @Resource    private MonitorTimeMapper monitorTimeMapper;    @Override    @Async("asyncServiceExecutor")    public void insertMonitorTime(MonitorTime monitorTime) {        monitorTimeMapper.insertMonitorTime(monitorTime);    }}

异步工作配置 :

package com.cema.manage.config;@Configuration@EnableAsyncpublic class AsyncTaskConfig  {    @Bean(name = "asyncServiceExecutor")    public Executor getAsyncExecutor() {        ThreadPoolTaskExecutor threadPool = new VisiableThreadPoolTaskExecutor();        // 设置外围线程数        threadPool.setCorePoolSize(1000);        // 设置最大线程数        threadPool.setMaxPoolSize(1000000);        // 线程池所应用的缓冲队列        threadPool.setQueueCapacity(Integer.MAX_VALUE);        // 期待工作在关机时实现--表明期待所有线程执行完        threadPool.setWaitForTasksToCompleteOnShutdown(true);        // 等待时间 (默认为0,此时立刻进行),并没期待xx秒后强制进行        threadPool.setAwaitTerminationSeconds(60);        // 线程名称前缀        threadPool.setThreadNamePrefix("Derry-Async-");        // 初始化线程        threadPool.initialize();        return threadPool;    }}

controller : 无需变动。

3. 实现拦截器

阐明:通过构造方法给 iMonitorTimeService 赋值。

package com.cema.manage.config.Interceptor;@Componentpublic class MonitoringTimeInterceptor implements HandlerInterceptor {    private IMonitorTimeService iMonitorTimeService;    public MonitoringTimeInterceptor(IMonitorTimeService iMonitorTimeService) {        this.iMonitorTimeService = iMonitorTimeService;    }    @Override    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {        long start = System.currentTimeMillis();        httpServletRequest.setAttribute("start", start);        return true;    }    @Override    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {        long start = (Long) httpServletRequest.getAttribute("start");        long end = System.currentTimeMillis() - start;        String uri = httpServletRequest.getRequestURI();        MonitorTime monitorTime = new MonitorTime();        monitorTime.setRequestAddress(uri);        monitorTime.setWasteTime((int) end);        iMonitorTimeService.insertMonitorTime(monitorTime);    }    @Override    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {    }}

4. 继承 WebMvc 配置适配器来增加你的拦截器,让它工作

阐明:
registry.addInterceptor(这里就是你刚刚写好的拦截器,咱们通过构造函数赋值)。addPathPatterns(这外面填写你须要拦挡的url,去看看你的controller层,如:"/pfs/**")。

package com.cema.manage.config;@Configurationpublic class ViewConfigure extends WebMvcConfigurerAdapter {    @Resource    private IMonitorTimeService iMonitorTimeService;    @Override    public void addInterceptors(InterceptorRegistry registry) {        // .addPathPatterns("/**") //拦挡所有申请/upload/ecology        registry.addInterceptor(new MonitoringTimeInterceptor(iMonitorTimeService))                .addPathPatterns("/token/**")        ;    }}

5. 总结

代码局部就完结了,当前进了你拦截器的http申请都会被存入到数据库,如下图:

你能够依据各接口响应时长来判断是否须要优化。你能够在数据库中应用一些聚合函数来看看最大响应时长的接口,或者某个接口的均匀响应工夫等。当然,这只是非常简单的拦截器以及数据的存入,你齐全能够撸一个更好哒。

byeBye ^ ^~