日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

SpringBoot 3.3 中實現(xiàn) API 接口限流就是這么簡單

來源: 責(zé)編: 時間:2024-09-10 09:46:18 107觀看
導(dǎo)讀在互聯(lián)網(wǎng)飛速發(fā)展的今天,隨著系統(tǒng)用戶規(guī)模的不斷擴大和分布式架構(gòu)的廣泛應(yīng)用,API 接口的穩(wěn)定性和性能成為系統(tǒng)設(shè)計中至關(guān)重要的因素。無論是應(yīng)對突發(fā)的流量高峰,還是防止惡意爬蟲的惡意請求,限流策略都已成為現(xiàn)代系統(tǒng)不可

在互聯(lián)網(wǎng)飛速發(fā)展的今天,隨著系統(tǒng)用戶規(guī)模的不斷擴大和分布式架構(gòu)的廣泛應(yīng)用,API 接口的穩(wěn)定性和性能成為系統(tǒng)設(shè)計中至關(guān)重要的因素。無論是應(yīng)對突發(fā)的流量高峰,還是防止惡意爬蟲的惡意請求,限流策略都已成為現(xiàn)代系統(tǒng)不可或缺的一部分。FAe28資訊網(wǎng)——每日最新資訊28at.com

為什么需要接口限流?FAe28資訊網(wǎng)——每日最新資訊28at.com

  1. 防止系統(tǒng)過載: 在短時間內(nèi)大量的請求可能導(dǎo)致系統(tǒng)資源耗盡,進而導(dǎo)致服務(wù)降級甚至宕機。通過限流,我們可以有效控制流量的上限,確保系統(tǒng)在高負載下仍然能夠提供穩(wěn)定的服務(wù)。
  2. 保護關(guān)鍵資源: 一些關(guān)鍵的 API 接口可能涉及到數(shù)據(jù)庫、緩存等有限資源的操作,如果不加限制,可能會導(dǎo)致資源耗盡,影響系統(tǒng)整體性能。限流可以確保這些關(guān)鍵資源的訪問量在可控范圍內(nèi)。
  3. 應(yīng)對惡意攻擊: 分布式拒絕服務(wù)攻擊(DDoS)是常見的網(wǎng)絡(luò)攻擊手段,攻擊者通過發(fā)送大量請求癱瘓系統(tǒng)。限流策略可以作為第一道防線,快速識別并過濾掉異常流量,減少攻擊對系統(tǒng)的影響。
  4. 提升用戶體驗: 在用戶訪問量大的情況下,如果不加以控制,可能會出現(xiàn)系統(tǒng)響應(yīng)速度下降的情況,影響用戶體驗。合理的限流策略能夠為用戶提供更加穩(wěn)定和一致的服務(wù)質(zhì)量。
  5. 公平資源分配: 在多用戶、多租戶的場景下,限流能夠確保系統(tǒng)資源的公平分配,避免某個用戶或租戶獨占資源,影響其他用戶的正常使用。

為了解決上述問題,我們可以在 API 接口上實施限流策略,使得系統(tǒng)能夠在高并發(fā)環(huán)境下保持穩(wěn)定,并且能夠合理應(yīng)對各類突發(fā)情況。在本文中,我們將探討如何在 SpringBoot 3.3 中,通過簡單的配置和代碼實現(xiàn) API 接口的限流。FAe28資訊網(wǎng)——每日最新資訊28at.com

運行效果:FAe28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片FAe28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片FAe28資訊網(wǎng)——每日最新資訊28at.com

若想獲取項目完整代碼以及其他文章的項目源碼,且在代碼編寫時遇到問題需要咨詢交流,歡迎加入下方的知識星球。FAe28資訊網(wǎng)——每日最新資訊28at.com

項目結(jié)構(gòu)

我們將從項目的結(jié)構(gòu)開始,先了解一下本示例項目的文件布局。FAe28資訊網(wǎng)——每日最新資訊28at.com

rate-limiter/├── src/│   ├── main/│   │   ├── java/com/icoderoad/ratelimiter/│   │   │   ├── controller/│   │   │   │   └── RateLimiterController.java│   │   │   ├── config/│   │   │   │   └── RateLimiterConfig.java│   │   │   ├── properties/│   │   │   │   └── RateLimiterProperties.java│   │   │   └── application/│   │   │       └── SpringBootRateLimiterApplication.java│   │   ├── resources/│   │   │   ├── templates/│   │   │   │   └── index.html│   │   │   └── application.yml└── pom.xml

接下來,我們將逐步搭建項目,實現(xiàn) API 接口限流功能。FAe28資訊網(wǎng)——每日最新資訊28at.com

引入依賴

在 pom.xml 中引入以下依賴:FAe28資訊網(wǎng)——每日最新資訊28at.com

<?xml versinotallow="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>	<parent>		<groupId>org.springframework.boot</groupId>		<artifactId>spring-boot-starter-parent</artifactId>		<version>3.3.3</version>		<relativePath/> <!-- lookup parent from repository -->	</parent>	<groupId>com.icoderoad</groupId>	<artifactId>ratelimiter</artifactId>	<version>0.0.1-SNAPSHOT</version>	<name>ratelimiter</name>	<description>Demo project for Spring Boot</description>		<properties>		<java.version>17</java.version>		<guava.version>31.1-jre</guava.version>	</properties>	<dependencies>		 <!-- Spring Boot Web Starter -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!-- Guava 用于限流 -->        <dependency>            <groupId>com.google.guava</groupId>            <artifactId>guava</artifactId>            <version>${guava.version}</version>        </dependency>        <!-- Thymeleaf 模板引擎 -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-thymeleaf</artifactId>        </dependency> 		<dependency>	        <groupId>org.projectlombok</groupId>	        <artifactId>lombok</artifactId>	        <optional>true</optional>	    </dependency>	    		<dependency>			<groupId>org.springframework.boot</groupId>			<artifactId>spring-boot-starter-test</artifactId>			<scope>test</scope>		</dependency>	</dependencies>	<build>		<plugins>			<plugin>				<groupId>org.springframework.boot</groupId>				<artifactId>spring-boot-maven-plugin</artifactId>			</plugin>		</plugins>	</build></project>

配置限流參數(shù)

在 src/main/resources/application.yml 中配置限流參數(shù):FAe28資訊網(wǎng)——每日最新資訊28at.com

server:  port: 8080rate-limiter:  permits-per-second: 5       # 每秒許可數(shù)  warmup-period: 0            # 預(yù)熱時間(秒)  timeout: 0                  # 獲取許可的超時時間(秒)

參數(shù)說明:FAe28資訊網(wǎng)——每日最新資訊28at.com

  • permits-per-second: 每秒允許的請求數(shù)量。
  • warmup-period: 限流器預(yù)熱時間,用于平滑地增加到最大速率。
  • timeout: 獲取許可的超時時間,0 表示立即返回獲取結(jié)果。

創(chuàng)建限流配置屬性類

在 src/main/java/com/icoderoad/ratelimiter/properties/RateLimiterProperties.java 中創(chuàng)建配置屬性類,用于映射 application.yml 中的配置:FAe28資訊網(wǎng)——每日最新資訊28at.com

package com.icoderoad.ratelimiter.propertie;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;import lombok.Data;@Data@Component@ConfigurationProperties(prefix = "rate-limiter")public class RateLimiterProperties {    /**     * 每秒許可數(shù)     */    private double permitsPerSecond;    /**     * 預(yù)熱時間(秒)     */    private long warmupPeriod;    /**     * 獲取許可的超時時間(秒)     */    private long timeout;}

說明:FAe28資訊網(wǎng)——每日最新資訊28at.com

  • 使用 @ConfigurationProperties 注解將配置屬性映射到類中,便于在代碼中使用。
  • 提供對應(yīng)的 Getter 和 Setter 方法,方便 Spring Boot 自動注入配置。

配置 RateLimiter

在 src/main/java/com/icoderoad/ratelimiter/config/RateLimiterConfig.java 中創(chuàng)建限流器配置:FAe28資訊網(wǎng)——每日最新資訊28at.com

package com.icoderoad.ratelimiter.config;import java.util.concurrent.TimeUnit;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import com.google.common.util.concurrent.RateLimiter;import com.icoderoad.ratelimiter.propertie.RateLimiterProperties;@Configurationpublic class RateLimiterConfig {    /**     * 配置 RateLimiter Bean     *     * @param properties 注入的限流配置屬性     * @return RateLimiter 實例     */    @Bean    public RateLimiter rateLimiter(RateLimiterProperties properties) {        if (properties.getWarmupPeriod() > 0) {            // 創(chuàng)建帶有預(yù)熱期的 RateLimiter            return RateLimiter.create(                    properties.getPermitsPerSecond(),                    properties.getWarmupPeriod(),                    TimeUnit.SECONDS            );        } else {            // 創(chuàng)建標準的 RateLimiter            return RateLimiter.create(properties.getPermitsPerSecond());        }    }}

說明:FAe28資訊網(wǎng)——每日最新資訊28at.com

  • 根據(jù)配置文件中的參數(shù)動態(tài)創(chuàng)建 RateLimiter 實例。
  • 支持帶有預(yù)熱期的限流器配置,滿足不同場景下的需求。

創(chuàng)建控制器

在 src/main/java/com/icoderoad/ratelimiter/controller/RateLimiterController.java 中創(chuàng)建控制器,處理 API 請求:FAe28資訊網(wǎng)——每日最新資訊28at.com

package com.icoderoad.ratelimiter.controller;import java.util.concurrent.TimeUnit;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.ResponseBody;import com.google.common.util.concurrent.RateLimiter;import com.icoderoad.ratelimiter.propertie.RateLimiterProperties;@Controllerpublic class RateLimiterController {    @Autowired    private RateLimiter rateLimiter;    @Autowired    private RateLimiterProperties properties;    /**     * 測試限流接口     *     * @return 請求結(jié)果     */    @GetMapping("/api/test")    @ResponseBody    public ResponseEntity<String> testApi() {        boolean acquired = rateLimiter.tryAcquire(properties.getTimeout(), TimeUnit.SECONDS);        if (acquired) {            // 允許請求,返回成功響應(yīng)            return ResponseEntity.ok("請求成功!");        } else {            // 拒絕請求,返回限流響應(yīng)            return ResponseEntity.status(429).body("請求過多,請稍后再試!");        }    }}

說明:FAe28資訊網(wǎng)——每日最新資訊28at.com

  • 使用 rateLimiter.tryAcquire(timeout, TimeUnit.SECONDS) 方法嘗試獲取許可,支持超時等待。
  • 根據(jù)獲取許可的結(jié)果返回對應(yīng)的響應(yīng):

成功獲取:返回 200 狀態(tài)碼和成功消息。FAe28資訊網(wǎng)——每日最新資訊28at.com

獲取失敗:返回 429 狀態(tài)碼和錯誤提示。FAe28資訊網(wǎng)——每日最新資訊28at.com

創(chuàng)建前端頁面

在 src/main/resources/templates/index.html 中創(chuàng)建前端頁面,使用 Thymeleaf、Bootstrap 和 jQuery 實現(xiàn):FAe28資訊網(wǎng)——每日最新資訊28at.com

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head>    <meta charset="UTF-8">    <title>API 限流測試</title>    <!-- 引入 Bootstrap CSS -->    <link rel="stylesheet" >    <!-- 自定義樣式 -->    <style>        body {            padding-top: 50px;        }    </style></head><body><div class="container">    <h1 class="mb-4">API 限流測試</h1>    <button id="testButton" class="btn btn-primary">發(fā)送請求</button>    <div id="alertPlaceholder" class="mt-3"></div></div><!-- 引入 jQuery --><script src="https://code.jquery.com/jquery-3.6.0.min.js"></script><!-- 引入 Bootstrap JS --><script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script><script>    $(document).ready(function () {        $('#testButton').click(function () {            $.ajax({                url: '/api/test',                method: 'GET',                success: function (response) {                    showAlert(response, 'success');                },                error: function (xhr) {                    if (xhr.status === 429) {                        showAlert(xhr.responseText, 'danger');                    } else {                        showAlert('發(fā)生未知錯誤,請稍后重試。', 'warning');                    }                }            });        });        /**         * 顯示提示信息         * @param message 消息內(nèi)容         * @param type 提示類型('success', 'danger', 'warning' 等)         */        function showAlert(message, type) {            const alertHtml = `                <div class="alert alert-${type} alert-dismissible fade show" role="alert">                    ${message}                    <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>                </div>            `;            $('#alertPlaceholder').html(alertHtml);        }    });</script></body></html>

說明:FAe28資訊網(wǎng)——每日最新資訊28at.com

  • 引入資源:

使用 CDN 加載 Bootstrap 和 jQuery,確保資源的快速和穩(wěn)定加載。FAe28資訊網(wǎng)——每日最新資訊28at.com

  • 頁面結(jié)構(gòu):
  • 一個按鈕用于觸發(fā) API 請求。FAe28資訊網(wǎng)——每日最新資訊28at.com

  • 一個占位符 div 用于顯示提示信息。FAe28資訊網(wǎng)——每日最新資訊28at.com

  • JavaScript 邏輯:FAe28資訊網(wǎng)——每日最新資訊28at.com

  • 使用 jQuery 監(jiān)聽按鈕點擊事件,發(fā)送 AJAX 請求到 /api/test 接口。FAe28資訊網(wǎng)——每日最新資訊28at.com

  • 根據(jù)響應(yīng)結(jié)果,調(diào)用 showAlert 函數(shù),在頁面上顯示不同類型的提示信息。FAe28資訊網(wǎng)——每日最新資訊28at.com

  • showAlert 函數(shù)使用 Bootstrap 的 Alert 組件,提供友好的用戶提示。FAe28資訊網(wǎng)——每日最新資訊28at.com

效果展示:FAe28資訊網(wǎng)——每日最新資訊28at.com

  • 請求成功: 顯示綠色的成功提示。
  • 請求被限流: 顯示紅色的錯誤提示,提示用戶請求過多。
  • 未知錯誤: 顯示黃色的警告提示,提示發(fā)生未知錯誤。

啟動應(yīng)用

在 src/main/java/com/icoderoad/ratelimiter/application/SpringBootRateLimiterApplication.java 中啟動 Spring Boot 應(yīng)用:FAe28資訊網(wǎng)——每日最新資訊28at.com

package com.icoderoad.ratelimiter;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication(scanBasePackages = "com.icoderoad.ratelimiter")public class RatelimiterApplication {	public static void main(String[] args) {		SpringApplication.run(RatelimiterApplication.class, args);	}}

說明:FAe28資訊網(wǎng)——每日最新資訊28at.com

  • 使用 @SpringBootApplication 注解標注主啟動類,并指定掃描的基礎(chǔ)包路徑。
  • 運行 main 方法即可啟動應(yīng)用。

8. 測試與驗證

步驟:FAe28資訊網(wǎng)——每日最新資訊28at.com

  1. 啟動應(yīng)用: 運行主啟動類,啟動 Spring Boot 應(yīng)用。
  2. 訪問頁面: 在瀏覽器中訪問 http://localhost:8080/,看到 API 限流測試頁面。
  3. 發(fā)送請求:點擊“發(fā)送請求”按鈕,觀察頁面提示信息。
  • 正常情況: 如果請求未超過限流閾值,顯示綠色的“請求成功!”提示。
  • 限流情況: 如果在短時間內(nèi)連續(xù)多次點擊按鈕,超過配置的每秒許可數(shù),將顯示紅色的“請求過多,請稍后再試!”提示。
  1. 調(diào)整配置: 可以修改 application.yml 中的限流參數(shù),重新啟動應(yīng)用,測試不同的限流策略效果。

示例演示:FAe28資訊網(wǎng)——每日最新資訊28at.com

  • 設(shè)置 permits-per-second 為 2,表示每秒允許 2 個請求。
  • 連續(xù)快速點擊按鈕,多數(shù)請求將被限流,提示用戶稍后重試。

9. 總結(jié)

通過本文的示例,我們成功地在 Spring Boot 3.3 中實現(xiàn)了簡單而有效的 API 接口限流功能。我們利用了 Guava 提供的 RateLimiter 工具,結(jié)合 Spring Boot 的配置屬性管理和依賴注入機制,實現(xiàn)了靈活可配的限流策略。同時,通過前端頁面的簡單設(shè)計和友好提示,使得用戶能夠清晰地感知到限流機制的存在和作用。FAe28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-112716-0.htmlSpringBoot 3.3 中實現(xiàn) API 接口限流就是這么簡單

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權(quán)等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: flat() 和 flatMap() 有什么區(qū)別?

下一篇: 聊聊 C# 中的ToString()數(shù)字格式化

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 吴桥县| 二手房| 双牌县| 怀来县| 全椒县| 武清区| 岳池县| 碌曲县| 水富县| 昆明市| 旌德县| 西吉县| 东山县| 璧山县| 秀山| 成安县| 夏邑县| 神木县| 溧水县| 拉萨市| 浦北县| 沙田区| 葵青区| 勐海县| 盐边县| 内黄县| 大悟县| 宜章县| 庆元县| 台州市| 平陆县| 墨玉县| 夹江县| 山西省| 电白县| 泗洪县| 张掖市| 通化县| 修文县| 德惠市| 莒南县|