aop監控spring cloud接口超時,并記錄到數據庫

引入pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>order</artifactId><version>0.0.1-SNAPSHOT</version><name>order</name><description>order</description><properties><java.version>17</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>3.0.2</spring-boot.version><spring-cloud-alibaba.version>2022.0.0.0-RC2</spring-cloud-alibaba.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 添加MyBatisPlus的依賴 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.4.1</version></dependency><!-- MySQL數據 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><!-- druid  連接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.14</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.0.0</version></dependency><!--引入aop--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.76</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-alibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>17</source><target>17</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.example.order.OrderApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build></project>

yml配置

mybatis-plus:configuration:log-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:mapper/*.xml
server:port: 8082
spring:application:name: ordercloud:nacos:discovery:namespace: publicpassword: nacosserver-addr: localhost:8848username: nacosdatasource:driverClassName: com.mysql.cj.jdbc.Driverpassword: 123456type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:mysql://localhost:3306/dmg1?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: root

設置實體類

package com.example.order.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;import java.util.Date;/*** 記錄接口超時*/
@Data
@TableName("timeout_log")
public class TimeOutLog {//主鍵@TableId(type = IdType.AUTO)private Long id;//請求方法private String requestMethod;//請求參數private String requestParams;//創建時間private Date createTime;//超時時間private Long time;
}

創建dao

package com.example.order.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.order.entity.TimeOutLog;public interface TimeOutLogMapper extends BaseMapper<TimeOutLog> {}

設置監聽類

package com.example.order.config;import com.alibaba.fastjson.JSONObject;
import com.example.order.entity.TimeOutLog;
import com.example.order.mapper.TimeOutLogMapper;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;import java.util.Date;/*** 超時接口監聽 記錄到數據庫*/
@Slf4j
@Aspect
@Component
public class TimedOutListen {@Autowiredprivate TimeOutLogMapper timeOutLogMapper;/*** 環繞通知 監聽controller里面的接口超時* @param proceedingJoinPoint* @return* @throws Throwable*/@Around("execution(* com.example.order.controller.*.*(..))")public Object around(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {//返回結果Object result = null;//開始時間long startTime = System.currentTimeMillis();try {//執行方法result = proceedingJoinPoint.proceed();return result;} catch (Throwable throwable) {throw throwable;} finally {//結束時間long endTime = System.currentTimeMillis();//如果大于3000毫秒那么就說明超時了if (endTime - startTime > 3000L) {//方法的名字String method=proceedingJoinPoint.getSignature().toShortString();//超時時間 毫秒long time=endTime-startTime;//請求參數String str= JSONObject.toJSONString(proceedingJoinPoint.getArgs());log.info("請求方法:{},超時時間:{},請求參數:{}",method,time,str);//把超時日志 記錄到數據庫中TimeOutLog bean=new TimeOutLog();bean.setTime(time);bean.setCreateTime(new Date());bean.setRequestMethod(method);bean.setRequestParams(str);timeOutLogMapper.insert(bean);//TODO 這時候 也可以設置發送短信 或者郵件的功能 通知程序員 去解決這個超時的問題}}}}

創建控制層

package com.example.order.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@Slf4j
@RestController
public class OrderController {@GetMapping("/aa")public void aa(@RequestParam("name")String name){log.info("進入添加方法:{}",name);try {//阻塞4秒Thread.sleep(1000*4);} catch (InterruptedException e) {throw new RuntimeException(e);}log.info("添加完畢");}
}

啟動類

?

package com.example.order;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@MapperScan(basePackages = {"com.example.order.mapper"})
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class, args);}}

創建表

CREATE TABLE `timeout_log` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主鍵',`request_method` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '請求方法',`request_params` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci COMMENT '請求參數',`create_time` datetime DEFAULT NULL COMMENT '創建時間',`time` bigint DEFAULT NULL COMMENT '超時時間',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='接口超時日志表';

?

在瀏覽器訪問aa這個接口

可以看到超時的信息都記錄到數據庫中了

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/717101.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/717101.shtml
英文地址,請注明出處:http://en.pswp.cn/news/717101.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

寶塔面板安裝各種組件以及部署應用服務

在linux服務器安裝寶塔面板 一、從寶塔官網下載exe安裝包&#xff0c;安裝命令從寶塔官網&#xff08;https://www.bt.cn/&#xff09;獲取 yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh二、安…

自動駕駛加速落地,激光雷達放量可期(上)

1 激光雷達應用廣泛&#xff0c;汽車有望成最大催化 激光雷達&#xff08;LiDAR&#xff09;是一種主動遙感技術&#xff0c;通過測定傳感器發出的激光在傳感器與目標物體之間的傳播距離&#xff0c;來分析目標地物表面的反射能量大小、反射波譜的幅度、頻率和相位等信息&#…

Vue項目如何進行優化?

Vue項目優化 1.移除控制臺打印2.壓縮圖片3.CDN加速 1.移除控制臺打印 可以使用插件自動去除&#xff0c;插件包括babel-plugin-transform-remove-console、uglifyjs-webpack-plugin、terser-webpack-plugin。最后選擇了terser-webpack-plugin&#xff0c;腳手架vue-cli用這個插…

一文掃盲:訂單管理系統,訂單是公司生命線。

hello&#xff0c;我是貝格前端工場&#xff0c;本期給大家分享訂單管理系統的知識點&#xff0c;歡迎老鐵們點贊、關注&#xff0c;如有需求可以私信我們。 一、什么是訂單管理系統 單管理系統是一種用于管理和處理訂單的軟件系統。它通常用于企業、電子商務平臺、零售店等需…

高并發高可用--反向代理與負載均衡

高并發高可用架構是指能夠應對大量并發請求并保持高度可用的系統架構。為了實現這一目標&#xff0c;通常會采用一系列技術和策略&#xff0c;包括負載均衡、緩存、分布式系統、冗余部署、容錯處理等。 以下是一些構建高并發高可用架構的關鍵要點&#xff1a; 負載均衡&#…

GEE高階應用python wxee 和eemont——MODIS 中生成NDVI 數據的月度時序影像

結合 wxee 和 eemont eemont概述 谷歌地球引擎是一種基于云的服務,用于矢量和柵格數據的地理空間處理。地球引擎平臺擁有 JavaScript 和 Python API,可使用不同方法處理地理空間對象。谷歌地球引擎還提供了一個巨大的 PETABYTE 級柵格和矢量數據目錄,用戶可以在線處理這些…

技術小知識:面向對象和過程的區別 ⑤

一、思想區別 面相對象&#xff1a;始終把所有事情思考歸類、抽離封裝成對象來調用完成。 面向過程&#xff1a;直接平鋪展開按順序執行完成任務。 面向對象多了很多對象的創建、使用&#xff0c;銷毀的過程資源消耗。是一種模塊化編程思想。 https://www.cnblogs.com/kuangmen…

網絡爬蟲彈幕

1.分析網頁&#xff0c;獲取代碼&#xff0c;提取時間 想要提取出彈幕所在的節點&#xff0c;我們要使用 Beautiful Soup 解析模塊&#xff0c;需要從 bs4 中導入 BeautifulSoup 模塊 創建一個 BeautifulSoup 對象&#xff0c;傳入變量 xml 和解析器 lxml&#xff0c;將該對象賦…

Java自學day5

流程控制語句 流程控制語句:通過一些語句,控制程序的執行流程 順序結構 順序結構語句是Java程序默認的執行流程,按照代碼的先后順序,從上到下依次執行! package orderdemo;public class OrderDemo {public static void main(String[] args) {System.out.println("…

2.2 mul、div、and、or乘除指令及所有寄存器英文名

匯編語言 1. mul乘指令 兩個相乘的數&#xff0c;要么都是8位&#xff0c;要么都是16位 兩個8位數相乘 一個默認放在al中&#xff0c;另一個放在8位reg或內存字節單元中8位乘法&#xff0c;結果默認放在ax中例如&#xff1a;計算100*10 100和10小于255&#xff0c;可以做8位…

一(四)班課表

第二學期 課節時間星期一星期二星期三星期四星期五上午18:20-9:00數學數學數學京劇語文29:10-9:50勞動音樂語文語文音樂310:30-11:10語文語文美術道德與法治數學思維411:20-12:00科學輪滑美術體育英語下午513:20-14:00數學實踐活動音樂欣賞語文英語語文拓展614:10-14:50體育英語…

信息系統安全與對抗-作業2

目錄 1、使用自己姓名拼音創建一個賬戶&#xff0c; 并使用命令和圖形化查看 2、使用自己拼音打頭字母創建一個隱藏賬戶 &#xff0c;并使用命令和圖形化查看 3、使用命令啟動 telnet 服務 4、使用命令打開防火墻 23 端口 5、熟悉LINUX系統&#xff0c;使用命令行創建用戶…

Spring Cloud Nacos集成Seata2.0 AT模式

Spring Cloud Nacos集成Seata2.0 AT模式 以CentOS 7為例&#xff0c;介紹Spring Cloud Nacos集成Seata2.0 AT模式的流程。分成兩個步驟&#xff1a;1.安裝配置seata-server、2.項目集成seata-client 一、下載seata-server安裝包 根據自己的操作系統選擇要下載的安裝包格式&a…

2023年第十四屆藍橋杯大賽軟件類省賽C/C++大學A組真題

2023年第十四屆藍橋杯大賽軟件類省賽C/C大學A組部分真題和題解分享 文章目錄 藍橋杯2023年第十四屆省賽真題-平方差思路題解 藍橋杯2023年第十四屆省賽真題-更小的數思路題解 藍橋杯2023年第十四屆省賽真題-顏色平衡樹思路題解 藍橋杯2023年第十四屆省賽真題-買瓜思路題解 藍橋…

05-Linux部署MySQL

Linux部署MySQL 在今后的使用過程中&#xff0c;需要頻繁使用Linux系統&#xff0c;所以在Linux上安裝軟是必不可少的操作 。 前置要求 需要學習前四章知識&#xff0c;初識Linux、Linux基礎命令、Linux權限管理、Linux高階技巧這4個章節。需要開啟多態虛擬機&#xff0c;電…

KubeSphere簡介,功能介紹,優勢,架構說明及應用場景

KubeSphere 是在目前主流容器調度平臺 Kubernetes 之上構建的企業級分布式多租戶容器平臺&#xff0c;提供簡單易用的操作界面以及向導式操作方式&#xff0c;在降低用戶使用容器調度平臺學習成本的同時&#xff0c;極大減輕開發、測試、運維的日常工作的復雜度&#xff0c;旨…

每日一題 — 快樂數

202. 快樂數 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 可以借用判斷鏈表是否有環的思想&#xff1a; 定義快慢指針&#xff08;兩個變量賦值就行&#xff09;快指針走兩次&#xff0c;慢指針走一次快慢指針相遇&#xff0c;看是不是等于一 public int bitSum(…

c++之stack(棧)與queue(隊列)的使用與簡單實現

文章目錄 說明stack與 queuepushpop()刪除top()查頭queue的back()查尾size()長度empty()判空 說明 棧的簡單實現很簡單&#xff0c;但是有一個強制要求&#xff0c;傳過來的類模版中&#xff0c;必須包含尾插頭刪等操作 隊列同理 他們兩個叫空間適配器,不同于其他stl的類 stack…

緩存相關問題:雪崩、穿透、預熱、更新、降級的深度解析

??祝屏幕前的小伙伴們每天都有好運相伴左右?? &#x1f388;&#x1f388;作者主頁&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; 目錄 引言 1. 緩存雪崩 1.1 問題描述 1.2 解決方案 1.2.1 加鎖防止并發重建緩存 2. 緩存穿透 2.1 問題描述 2.2 解決方案 2.2.1 …

【解決方案】ArcGIS Engine二次開發時,運行后出現“正嘗試在 OS 加載程序鎖內執行托管代碼。不要嘗試在 DllMain...”

我們在做ArcGIS Engine二次開發時&#xff0c;特別是新手&#xff0c;安裝好了開發環境&#xff0c;滿懷信心的準備將按照教程搭建好的框架在Visual Studio中進行運行。點擊運行后&#xff0c;卻出現了“正嘗試在 OS 加載程序鎖內執行托管代碼。不要嘗試在 DllMain 或映像初始化…