当前位置:首页 > 科技  > 软件

SpringBoot自带Controller接口监控,赶紧用起来

来源: 责编: 时间:2024-07-05 09:05:34 1190观看
导读环境:SpringBoot2.7.181. 简介项目中监控记录接口请求的相关信息是一个至关重要的环节,它对于提升系统稳定性、优化性能、快速定位问题以及保障数据安全等方面都起着至关重要的作用。大致可概况如下几方面:问题追踪与定

环境:SpringBoot2.7.18aTN28资讯网——每日最新资讯28at.com

1. 简介

项目中监控记录接口请求的相关信息是一个至关重要的环节,它对于提升系统稳定性、优化性能、快速定位问题以及保障数据安全等方面都起着至关重要的作用。大致可概况如下几方面:aTN28资讯网——每日最新资讯28at.com

问题追踪与定位:当系统出现错误或异常时,通过查看接口调用的请求信息,可以快速定位问题发生的源头。比如,通过查看请求参数、响应状态码、执行时间等aTN28资讯网——每日最新资讯28at.com

性能优化:监控接口请求的处理时间、响应时间性能指标,可以帮助开发团队了解系统的瓶颈所在,从而进行相应的优化。aTN28资讯网——每日最新资讯28at.com

用户行为分析:通过记录用户的请求信息,包括请求频率、请求时间、请求参数等,可以对用户行为进行分析,了解用户的使用习惯和需求,从而优化产品功能和用户体验。aTN28资讯网——每日最新资讯28at.com

安全审计:记录接口请求信息也是安全审计的一部分。通过监控和分析请求数据,可以发现潜在的安全威胁,如恶意请求、SQL注入、跨站脚本攻击等aTN28资讯网——每日最新资讯28at.com

在SpringBoot中我们可通过Actuator来实现对Http接口进行监控记录,接下来我们通过实操来演示如何通过Actuator来监控记录我们的即可。aTN28资讯网——每日最新资讯28at.com

2. 实战案例

2.1 引入依赖&配置

<dependency>  <groupId>org.springframework.boot</groupId>  <artifactId>spring-boot-starter-actuator</artifactId></dependency>

要使用Actuator的http接口监控功能,你还需要注册一个HttpTraceRepository类型的Bean,Actuator默认提供的是基于内存的实现aTN28资讯网——每日最新资讯28at.com

@Configurationpublic class HttpActuatorConfig {    @Bean  InMemoryHttpTraceRepository inMemoryHttpTraceRepository() {    return new InMemoryHttpTraceRepository() ;  }}

默认情况下,Actuator只开启了health接口(健康检查),我们还需要手动开启httptrace接口。aTN28资讯网——每日最新资讯28at.com

management:  endpoints:    web:      exposure:        include: httptrace

以上配置后,可以通过/actuator接口查看是否开启了httptrace接口aTN28资讯网——每日最新资讯28at.com

成功开启成功开启aTN28资讯网——每日最新资讯28at.com

2.2 测试接口

编写几个测试用的接口

@RestController@RequestMapping("/users")public class UserController {    private static List<User> DATAS = new ArrayList<>() ;  static {    DATAS.add(new User(1L, "张三", 22)) ;    DATAS.add(new User(2L, "李四", 32)) ;    DATAS.add(new User(3L, "王五", 33)) ;    DATAS.add(new User(4L, "赵六", 26)) ;    DATAS.add(new User(5L, "田七", 29)) ;    DATAS.add(new User(6L, "嘿哈", 44)) ;  }  @PostMapping("")  public ResponseEntity<Void> save(@RequestBody User user) {    DATAS.add(user) ;    return ResponseEntity.created(URI.create(String.format("/users/%s", user.getId()))).build() ;  }  @DeleteMapping("/{id}")  public ResponseEntity<Void> delete(@PathVariable("id") Long id) {    DATAS.removeIf(user -> user.getId() == id) ;    return ResponseEntity.noContent().build() ;  }  @PutMapping("")  public ResponseEntity<Void> update(@RequestBody User user) {    DATAS.stream()      .filter(u -> u.getId() == user.getId())      .findFirst()      .ifPresent(u -> {        u.setAge(user.getAge()) ;        u.setName(u.getName()) ;      });    return ResponseEntity.noContent().build() ;  }  @GetMapping("")  public ResponseEntity<List<User>> list() {    return ResponseEntity.ok(DATAS) ;  }  @GetMapping("/{id}")  public ResponseEntity<User> get(@PathVariable("id") Long id) {    return ResponseEntity.ok(DATAS.stream()            .filter(u -> u.getId() == id)            .findFirst().orElse(null)          ) ;  }  // 测试异常情况  @GetMapping("/exception")  public ResponseEntity<Void> exce() {    System.out.println(1 / 0) ;    return ResponseEntity.noContent().build() ;  }}

为了简单,上面操作都是基于内存数据进行。包括了CRUD及异常情况。aTN28资讯网——每日最新资讯28at.com

2.3 记录接口访问情况

访问上面定义的任意接口之后通过/actuator/httptrace接口查看访问情况aTN28资讯网——每日最新资讯28at.com

图片图片aTN28资讯网——每日最新资讯28at.com

每个接口会详细的记录请求的URL,header,响应状态码及header信息。上图中的timeTaken属性记录的是该接口请求的耗时情况(单位:毫秒)。aTN28资讯网——每日最新资讯28at.com

通过以上的示例演示,使用Actuator监控接口还是非常简单的,你只需要做简单的配置即可,接下来继续介绍更多的配置及使用。aTN28资讯网——每日最新资讯28at.com

2.4 自定义记录信息

要自定义记录的信息,可以通过如下配置aTN28资讯网——每日最新资讯28at.com

management:  trace:    http:      include:      - time-taken      - response-headers

注:在SpringBoot3以上的版本这里的配置发生了变化使用的是如下配置:aTN28资讯网——每日最新资讯28at.com

management:  httpexchanges:    recording:      include:      - time-taken

通过上面的配置后,再次访问接口aTN28资讯网——每日最新资讯28at.com

图片图片aTN28资讯网——每日最新资讯28at.com

此时,将不再包含请求headers。还支持如下的配置:aTN28资讯网——每日最新资讯28at.com

图片图片aTN28资讯网——每日最新资讯28at.com

2.5 手动获取请求响应信息

在项目中你可以通过 HttpTraceRepository 获取所有请求中的请求-响应交换信息。如下示例,获取所有错误的请求(状态码为500)。aTN28资讯网——每日最新资讯28at.com

private final HttpTraceRepository httpTraceRepository ;public HttpController(HttpTraceRepository httpTraceRepository) {  this.httpTraceRepository = httpTraceRepository ;}@GetMapping("/{status}")public Object info(@PathVariable("status") Integer status) {  return httpTraceRepository.findAll()          .stream()          .filter(trace -> trace.getResponse().getStatus() == status)          .collect(Collectors.toList()) ;}

通过上面的接口,我们可以过滤指定状态码的请求信息。aTN28资讯网——每日最新资讯28at.com

2.6 自定义存储方式

InMemoryHttpExchangeRepository,默认情况下,它会存储最近 100 次请求-响应信息,并且是内存级的。所以如果你需要在生产环境下使用还是建议你自定义HttpTraceRepository实现,将信息存入到Redis或者是ES中。如下存入Redis示例aTN28资讯网——每日最新资讯28at.com

@Componentpublic class PackHttpTraceRepository implements HttpTraceRepository {  private static final String HTTP_TRACE_KEY = "http_request_response" ;    private final StringRedisTemplate stringRedisTemplate ;  public PackHttpTraceRepository(StringRedisTemplate stringRedisTemplate) {    this.stringRedisTemplate = stringRedisTemplate ;  }    @Override  public List<HttpTrace> findAll() {    return this.stringRedisTemplate.opsForList().range(HTTP_TRACE_KEY, 0, -1).stream().map(json -> {      try {        return objectMapper.readValue(json, HttpTrace.class);      }    }).collect(Collectors.toList()) ;  }  @Override  public void add(HttpTrace trace) {    String json = null ;    try {      json = objectMapper.writeValueAsString(trace) ;    }    this.stringRedisTemplate.opsForList().leftPush(HTTP_TRACE_KEY, json) ;  }}

这样我们就可以持久化存储数据了,你还可以根据当前日期来进行存储。aTN28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-98864-0.htmlSpringBoot自带Controller接口监控,赶紧用起来

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 你知道缓存的这个问题到底把多少程序员坑惨了吗?

下一篇: 10 款炫酷的前端 CSS 加载器和进度条动画

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 苹果、三星、惠普等暂停向印度出口笔记本和平板电脑

    集微网消息,据彭博社报道,在8月3日印度突然禁止在没有许可证的情况下向印度进口电脑/平板及显示器等产品后,苹果、三星电子和惠普等大公司暂停向印度
  • 超级标准版旗舰!iQOO 11S全球首发iQOO超算独显芯片

    上半年已接近尾声,截至目前各大品牌旗下的顶级旗舰都已悉数亮相,而下半年即将推出的顶级旗舰已经成为了数码圈爆料的主流,其中就包括全新的iQOO 11S系
Top