成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot自帶Controller接口監(jiān)控,趕緊用起來(lái)

開(kāi)發(fā) 前端
在SpringBoot中我們可通過(guò)Actuator來(lái)實(shí)現(xiàn)對(duì)Http接口進(jìn)行監(jiān)控記錄,接下來(lái)我們通過(guò)實(shí)操來(lái)演示如何通過(guò)Actuator來(lái)監(jiān)控記錄我們的即可。

環(huán)境:SpringBoot2.7.18

1. 簡(jiǎn)介

項(xiàng)目中監(jiān)控記錄接口請(qǐng)求的相關(guān)信息是一個(gè)至關(guān)重要的環(huán)節(jié),它對(duì)于提升系統(tǒng)穩(wěn)定性、優(yōu)化性能、快速定位問(wèn)題以及保障數(shù)據(jù)安全等方面都起著至關(guān)重要的作用。大致可概況如下幾方面:

問(wèn)題追蹤與定位:當(dāng)系統(tǒng)出現(xiàn)錯(cuò)誤或異常時(shí),通過(guò)查看接口調(diào)用的請(qǐng)求信息,可以快速定位問(wèn)題發(fā)生的源頭。比如,通過(guò)查看請(qǐng)求參數(shù)、響應(yīng)狀態(tài)碼、執(zhí)行時(shí)間等

性能優(yōu)化:監(jiān)控接口請(qǐng)求的處理時(shí)間、響應(yīng)時(shí)間性能指標(biāo),可以幫助開(kāi)發(fā)團(tuán)隊(duì)了解系統(tǒng)的瓶頸所在,從而進(jìn)行相應(yīng)的優(yōu)化。

用戶行為分析:通過(guò)記錄用戶的請(qǐng)求信息,包括請(qǐng)求頻率、請(qǐng)求時(shí)間、請(qǐng)求參數(shù)等,可以對(duì)用戶行為進(jìn)行分析,了解用戶的使用習(xí)慣和需求,從而優(yōu)化產(chǎn)品功能和用戶體驗(yàn)。

安全審計(jì):記錄接口請(qǐng)求信息也是安全審計(jì)的一部分。通過(guò)監(jiān)控和分析請(qǐng)求數(shù)據(jù),可以發(fā)現(xiàn)潛在的安全威脅,如惡意請(qǐng)求、SQL注入、跨站腳本攻擊等

在SpringBoot中我們可通過(guò)Actuator來(lái)實(shí)現(xiàn)對(duì)Http接口進(jìn)行監(jiān)控記錄,接下來(lái)我們通過(guò)實(shí)操來(lái)演示如何通過(guò)Actuator來(lái)監(jiān)控記錄我們的即可。

2. 實(shí)戰(zhàn)案例

2.1 引入依賴&配置

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

要使用Actuator的http接口監(jiān)控功能,你還需要注冊(cè)一個(gè)HttpTraceRepository類型的Bean,Actuator默認(rèn)提供的是基于內(nèi)存的實(shí)現(xiàn)

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

默認(rèn)情況下,Actuator只開(kāi)啟了health接口(健康檢查),我們還需要手動(dòng)開(kāi)啟httptrace接口。

management:
  endpoints:
    web:
      exposure:
        include: httptrace

以上配置后,可以通過(guò)/actuator接口查看是否開(kāi)啟了httptrace接口

成功開(kāi)啟成功開(kāi)啟

2.2 測(cè)試接口

編寫幾個(gè)測(cè)試用的接口

@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)
          ) ;
  }
  // 測(cè)試異常情況
  @GetMapping("/exception")
  public ResponseEntity<Void> exce() {
    System.out.println(1 / 0) ;
    return ResponseEntity.noContent().build() ;
  }
}

為了簡(jiǎn)單,上面操作都是基于內(nèi)存數(shù)據(jù)進(jìn)行。包括了CRUD及異常情況。

2.3 記錄接口訪問(wèn)情況

訪問(wèn)上面定義的任意接口之后通過(guò)/actuator/httptrace接口查看訪問(wèn)情況

圖片圖片

每個(gè)接口會(huì)詳細(xì)的記錄請(qǐng)求的URL,header,響應(yīng)狀態(tài)碼及header信息。上圖中的timeTaken屬性記錄的是該接口請(qǐng)求的耗時(shí)情況(單位:毫秒)。

通過(guò)以上的示例演示,使用Actuator監(jiān)控接口還是非常簡(jiǎn)單的,你只需要做簡(jiǎn)單的配置即可,接下來(lái)繼續(xù)介紹更多的配置及使用。

2.4 自定義記錄信息

要自定義記錄的信息,可以通過(guò)如下配置

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

注:在SpringBoot3以上的版本這里的配置發(fā)生了變化使用的是如下配置:

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

通過(guò)上面的配置后,再次訪問(wèn)接口

圖片圖片

此時(shí),將不再包含請(qǐng)求headers。還支持如下的配置:

圖片圖片

2.5 手動(dòng)獲取請(qǐng)求響應(yīng)信息

在項(xiàng)目中你可以通過(guò) HttpTraceRepository 獲取所有請(qǐng)求中的請(qǐng)求-響應(yīng)交換信息。如下示例,獲取所有錯(cuò)誤的請(qǐng)求(狀態(tài)碼為500)。

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()) ;
}

通過(guò)上面的接口,我們可以過(guò)濾指定狀態(tài)碼的請(qǐng)求信息。

2.6 自定義存儲(chǔ)方式

InMemoryHttpExchangeRepository,默認(rèn)情況下,它會(huì)存儲(chǔ)最近 100 次請(qǐng)求-響應(yīng)信息,并且是內(nèi)存級(jí)的。所以如果你需要在生產(chǎn)環(huán)境下使用還是建議你自定義HttpTraceRepository實(shí)現(xiàn),將信息存入到Redis或者是ES中。如下存入Redis示例

@Component
public 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) ;
  }
}

這樣我們就可以持久化存儲(chǔ)數(shù)據(jù)了,你還可以根據(jù)當(dāng)前日期來(lái)進(jìn)行存儲(chǔ)。

責(zé)任編輯:武曉燕 來(lái)源: Spring全家桶實(shí)戰(zhàn)案例源碼
相關(guān)推薦

2024-09-05 09:38:55

SpringActuator應(yīng)用程序

2021-01-29 17:40:00

Flyme安卓手機(jī)安全

2020-08-25 08:00:18

Python開(kāi)發(fā)數(shù)據(jù)庫(kù)

2021-06-30 09:20:18

NuShell工具Linux

2024-08-12 12:20:49

Controller接口性能

2021-03-10 09:54:43

RustNuShell系統(tǒng)

2019-08-08 16:12:33

2012-07-11 09:34:39

微軟云計(jì)算

2022-05-22 21:16:46

TypeScriptOmit 工具

2022-01-26 07:42:13

SpringBoot性能系統(tǒng)

2021-09-18 08:52:45

人工智能

2024-05-21 10:28:51

API設(shè)計(jì)架構(gòu)

2024-06-13 08:19:08

Controller接口參數(shù)

2012-12-17 09:54:08

2016-06-12 09:28:46

Ubuntu 16.0升級(jí)Linux

2020-01-06 15:00:43

Linux電腦發(fā)行版

2021-09-29 07:13:12

編程 Python Merge

2021-04-18 07:18:31

Chrome

2021-10-29 11:25:41

代碼編程語(yǔ)言Java

2022-12-27 17:56:40

ack機(jī)制RocketMQ
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 国产一区三区在线 | 成人精品国产一区二区4080 | 97在线观看 | 91久久精品国产 | 日韩一级免费 | 在线a视频 | 欧美jizzhd精品欧美巨大免费 | 国产在线视频在线观看 | 在线日韩精品视频 | 国产精品乱码一区二三区小蝌蚪 | 亚洲3级 | 婷婷激情在线 | 欧美2区 | 亚洲国产中文在线 | 国产人成精品一区二区三 | 久久国产精品免费 | 中文字幕精品一区二区三区在线 | 久久精品在线 | 亚洲欧美精品在线观看 | 91麻豆精品国产91久久久久久久久 | 日韩一二区在线 | 亚洲一区二区三区久久久 | 亚洲欧美成人影院 | 成人深夜小视频 | 美国十次成人欧美色导视频 | 91在线看片| 99精品国产一区二区青青牛奶 | 国产日韩精品一区 | 国产一级免费在线观看 | 91免费福利在线 | 日韩精品视频中文字幕 | 精品国产乱码久久久久久闺蜜 | 国产日韩电影 | 国产丝袜一区二区三区免费视频 | 久久青视频| www.国产日本 | 成人福利在线 | 中文字幕av网址 | 欧美成人手机视频 | 久久国产精品视频 | 国产精品久久亚洲 |