精品一区二区三区在线成人,欧美精产国品一二三区,Ji大巴进入女人66h,亚洲春色在线视频

Spring Boot API 超時配置全解析:五種實現(xiàn)方式詳解

開發(fā) 前端
本篇文章介紹了 Spring Boot 3.4 中 5 種 API 超時配置方案,包括事務超時、Resilience4j 超時保護、異步超時、HTTP 客戶端超時以及 NGINX 代理超時配置。

在開發(fā) API 接口時,合理配置 API 超時時間是保證系統(tǒng)穩(wěn)定性和高效性的關鍵。當服務器因數(shù)據(jù)庫查詢緩慢或外部接口響應延遲等問題導致請求無法及時返回時,合理的超時設置可以防止系統(tǒng)資源被長時間占用,進而避免系統(tǒng)崩潰或性能下降。

Spring Boot 提供了多種方式來實現(xiàn) API 超時控制,針對不同的應用場景,選擇合適的策略至關重要。本文基于 Spring Boot 3.4,介紹以下五種 API 超時配置方案:

  • 事務超時配置用于數(shù)據(jù)庫操作超時控制。
  • 基于 Resilience4j 的超時保護實現(xiàn)接口級別的超時控制。
  • 異步請求超時對異步調(diào)用進行超時控制。
  • HTTP Client 超時配置包括 RestTemplate、RestClient 和 WebClient。
  • 基于 NGINX 代理超時在 NGINX 層面配置超時策略。

實戰(zhàn)案例

事務超時配置

當 API 接口涉及數(shù)據(jù)庫事務時,可以通過 @Transactional 注解的 timeout 參數(shù)來限制事務執(zhí)行時間。例如:

package com.icoderoad.service;


import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.concurrent.TimeUnit;


@Service
public class UserService {


    @Transactional(timeout = 1)
    public List<User> queryUsers() {
        try {
            TimeUnit.SECONDS.sleep(1);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return userRepository.findAll();
    }
}

此外,可以通過全局異常處理器捕獲超時異常:

@ExceptionHandler(TransactionTimedOutException.class)
public ResponseEntity<String> handleTxTimeout(TransactionTimedOutException ex) {
    return ResponseEntity.status(HttpStatus.REQUEST_TIMEOUT).body("請求超時: " + ex.getMessage());
}

基于 Resilience4j 的超時保護

Resilience4j 提供 TimeLimiter 模塊,實現(xiàn)超時控制。

引入依賴

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-spring-boot3</artifactId>
    <version>2.2.0</version>
</dependency>

配置超時策略

@TimeLimiter(name = "queryUser", fallbackMethod = "fallbackQuery")
@GetMapping("/query")
public CompletionStage<ResponseEntity<String>> query() {
    return CompletableFuture.supplyAsync(() -> {
        try {
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            Thread.currentThread().interrupt();
        }
        return ResponseEntity.ok("success");
    });
}


public CompletionStage<ResponseEntity<String>> fallbackQuery(Throwable e) {
    return CompletableFuture.completedStage(ResponseEntity.ok("請求超時,降級處理: " + e.getMessage()));
}

配置文件

resilience4j:
  timelimiter:
    instances:
      queryUser:
        timeout-duration: 1s

異步請求超時

Spring Boot 支持通過配置 request-timeout 來控制異步請求的超時時間。

spring:
  mvc:
    async:
      request-timeout: 1s

異步接口示例:

@GetMapping("/async")
public Callable<String> asyncRequest() {
    return () -> {
        TimeUnit.SECONDS.sleep(10);
        return "異步請求成功";
    };
}

HTTP Client 超時配置

Spring Boot 提供 RestTemplate、RestClient 和 WebClient 三種方式進行 HTTP 請求。

RestTemplate 配置

@Bean
public RestTemplate restTemplate(RestTemplateBuilder builder) {
    return builder
        .setConnectTimeout(Duration.ofSeconds(1))
        .setReadTimeout(Duration.ofSeconds(1))
        .build();
}

RestClient 配置

@Bean
public RestClient restClient() {
    return RestClient.builder()
        .setConnectTimeout(Duration.ofSeconds(1))
        .setReadTimeout(Duration.ofSeconds(1))
        .build();
}

WebClient 配置

@Bean
public WebClient webClient() {
    HttpClient httpClient = HttpClient.create()
        .doOnConnected(conn -> conn
            .addHandlerLast(new ReadTimeoutHandler(1))
            .addHandlerLast(new WriteTimeoutHandler(1)));


    return WebClient.builder()
        .clientConnector(new ReactorClientHttpConnector(httpClient))
        .build();
}

基于 NGINX 代理超時配置

在 NGINX 配置文件 nginx.conf 中添加以下內(nèi)容:

location /api/ {
    proxy_pass http://127.0.0.1:8080;
    proxy_connect_timeout 1s;
    proxy_send_timeout 1s;
    proxy_read_timeout 1s;
}

當超時發(fā)生時,可在 NGINX 日志中查看錯誤:

[error] 11172#27080: *1 upstream timed out (10060: A connection attempt failed)

總結(jié)

本篇文章介紹了 Spring Boot 3.4 中 5 種 API 超時配置方案,包括事務超時、Resilience4j 超時保護、異步超時、HTTP 客戶端超時以及 NGINX 代理超時配置。合理選擇不同的超時控制方案,可以有效提升 API 的穩(wěn)定性,防止因長時間阻塞導致系統(tǒng)資源占用過多,從而提升整體服務的可靠性和用戶體驗。

希望本文能幫助你更好地理解和配置 API 超時策略!

責任編輯:武曉燕 來源: 路條編程
相關推薦

2025-02-12 08:47:07

SpringAPI接口

2011-02-28 13:51:30

Spring事物配置

2009-06-19 18:26:38

Spring事務配置

2011-11-25 10:25:27

SpringJava

2025-06-06 08:28:56

2022-08-18 09:38:02

Spring跨域

2025-07-08 07:15:00

Spring配置多種方式

2025-04-16 10:03:40

開發(fā)Spring應用程序

2025-05-07 08:25:02

Android場景驗證碼

2024-05-30 08:51:28

Spring數(shù)據(jù)分布式

2018-05-30 15:10:24

Spring BootList類型

2025-07-25 07:40:12

2024-10-15 16:41:35

2025-06-04 02:10:00

2025-06-12 02:00:00

Spring簽到打卡

2025-01-03 16:27:35

SpringBoot代碼打包

2021-12-31 13:40:43

Spring Boot熱部署Java

2025-06-27 07:46:53

2023-11-01 15:07:51

環(huán)境配置方式

2013-05-23 09:49:28

虛擬化桌面虛擬化
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 长宁县| 沿河| 通江县| 明星| 孝昌县| 湘潭市| 内江市| 乡宁县| 葫芦岛市| 阿图什市| 象州县| 桓台县| 延吉市| 龙井市| 会理县| 吉林市| 万年县| 永善县| 玛沁县| 宁晋县| 翼城县| 达拉特旗| 公安县| 仁布县| 陕西省| 清涧县| 东兴市| 泰兴市| 长沙市| 桐乡市| 萝北县| 玛曲县| 阳信县| 绍兴市| 丹寨县| 巴彦淖尔市| 乌兰察布市| 湘阴县| 镇宁| 明星| 聊城市|