最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用Spring提高接口吞吐量的常見(jiàn)方法

 更新時(shí)間:2025年06月23日 09:49:21   作者:天天摸魚(yú)的java工程師  
吞吐量衡量系統(tǒng)性能的關(guān)鍵指標(biāo),通常指單位時(shí)間內(nèi)系統(tǒng)可以處理的請(qǐng)求數(shù)量,面對(duì)高并發(fā),我們?cè)撊绾卫?nbsp;Spring 構(gòu)建一個(gè)高吞吐、高可用的接口系統(tǒng)?本文系統(tǒng)地分享在 Spring 中提升接口吞吐量的幾種常見(jiàn)手段,需要的朋友可以參考下

一、引言

在我早期參與的一個(gè)電商項(xiàng)目中,曾遭遇過(guò)一次“秒殺”場(chǎng)景的接口雪崩:用戶量激增,接口響應(yīng)緩慢,系統(tǒng)幾近崩潰。那次經(jīng)歷讓我深刻意識(shí)到: “接口吞吐量”是高并發(fā)系統(tǒng)的生命線。

吞吐量(Throughput)是衡量系統(tǒng)性能的關(guān)鍵指標(biāo),通常指單位時(shí)間內(nèi)系統(tǒng)可以處理的請(qǐng)求數(shù)量。面對(duì)高并發(fā),我們?cè)撊绾卫?Spring 構(gòu)建一個(gè)高吞吐、高可用的接口系統(tǒng)?

本文將結(jié)合我這些年的實(shí)戰(zhàn)經(jīng)驗(yàn),從經(jīng)典場(chǎng)景到核心代碼實(shí)現(xiàn),系統(tǒng)地分享在 Spring 中提升接口吞吐量的幾種常見(jiàn)手段。

二、哪些場(chǎng)景需要關(guān)注接口吞吐量?

  • 大促秒殺:電商活動(dòng)接口瞬時(shí)訪問(wèn)量暴漲
  • 實(shí)時(shí)數(shù)據(jù)上報(bào):IoT設(shè)備每秒數(shù)萬(wàn)請(qǐng)求
  • 內(nèi)部高頻接口:服務(wù)間調(diào)用頻繁
  • 熱點(diǎn)接口:首頁(yè)推薦、商品詳情等訪問(wèn)量大

三、Spring 提高接口吞吐量的幾種手段

1. 接口異步化處理 —— 解耦請(qǐng)求與處理邏輯

應(yīng)用場(chǎng)景:非實(shí)時(shí)返回的業(yè)務(wù),如短信發(fā)送、日志收集、消息推送。

實(shí)戰(zhàn)代碼:

@RestController
public class NotifyController {

    @Autowired
    private Executor asyncExecutor;

    @PostMapping("/send-notify")
    public ResponseEntity<?> sendNotify(@RequestBody NotifyRequest request) {
        asyncExecutor.execute(() -> notifyService.send(request));
        return ResponseEntity.ok("已接收");
    }

    @Bean
    public Executor asyncExecutor() {
        return Executors.newFixedThreadPool(10);
    }
}

使用異步線程池,主線程快速返回,提高系統(tǒng)響應(yīng)速度和吞吐能力。

2. 請(qǐng)求緩存 —— 減少數(shù)據(jù)庫(kù)/遠(yuǎn)程調(diào)用壓力

應(yīng)用場(chǎng)景:商品詳情、配置數(shù)據(jù)、熱點(diǎn)用戶信息等讀多寫(xiě)少的數(shù)據(jù)。

實(shí)戰(zhàn)代碼(基于 Spring Cache + Redis):

@Cacheable(value = "product", key = "#productId")
public Product getProductById(Long productId) {
    return productRepository.findById(productId).orElse(null);
}

結(jié)合 Redis 做讀緩存,可以顯著減輕數(shù)據(jù)庫(kù)壓力,提升 QPS。

3. 接口限流 —— 保護(hù)系統(tǒng)穩(wěn)態(tài)運(yùn)行

應(yīng)用場(chǎng)景:秒殺接口、登錄接口、支付接口等敏感資源。

實(shí)戰(zhàn)代碼(基于 Spring + Bucket4j):

@Aspect
@Component
public class RateLimitAspect {

    private final Map<String, Bucket> cache = new ConcurrentHashMap<>();

    @Around("@annotation(RateLimit)")
    public Object limit(ProceedingJoinPoint pjp) throws Throwable {
        String key = pjp.getSignature().toShortString();
        Bucket bucket = cache.computeIfAbsent(key, k -> Bucket4j.builder()
            .addLimit(Bandwidth.simple(100, Duration.ofSeconds(1)))
            .build());

        if (bucket.tryConsume(1)) {
            return pjp.proceed();
        } else {
            throw new RateLimitExceededException();
        }
    }
}

動(dòng)態(tài)限流,防止服務(wù)因突發(fā)流量而雪崩。

4. 請(qǐng)求合并 —— 減少重復(fù)查詢

應(yīng)用場(chǎng)景:批量請(qǐng)求同一資源,如查詢多個(gè)用戶信息。

實(shí)戰(zhàn)代碼(利用 Guava + Future 合并請(qǐng)求):

public class UserBatchService {

    private final LoadingCache<Long, CompletableFuture<User>> userCache = CacheBuilder.newBuilder()
        .refreshAfterWrite(10, TimeUnit.MILLISECONDS)
        .build(CacheLoader.asyncReloading(this::batchLoad, Executors.newFixedThreadPool(5)));

    private CompletableFuture<Map<Long, User>> batchLoad(Set<Long> userIds) {
        return CompletableFuture.supplyAsync(() -> userRepository.findByIds(userIds));
    }

    public CompletableFuture<User> getUser(Long id) {
        return userCache.get(id);
    }
}

請(qǐng)求合并降低數(shù)據(jù)庫(kù)壓力,提高單位時(shí)間處理能力。

5. 使用響應(yīng)式編程(Reactive)提升吞吐量

應(yīng)用場(chǎng)景:高并發(fā)、IO密集型接口(如 WebFlux + MongoDB)

示例代碼:

@RestController
public class ReactiveProductController {

    @Autowired
    private ProductReactiveRepository repo;

    @GetMapping("/product/{id}")
    public Mono<Product> getProduct(@PathVariable String id) {
        return repo.findById(id);
    }
}

Reactive 編程模型通過(guò)非阻塞 IO 提升資源利用率,提升吞吐量。

6. 連接池優(yōu)化(DB、Redis、HTTP)

應(yīng)用場(chǎng)景:數(shù)據(jù)庫(kù)連接、遠(yuǎn)程調(diào)用、緩存訪問(wèn)等。

  • 使用 HikariCP 替代默認(rèn) DBCP(Spring Boot 默認(rèn))
  • 使用連接池客戶端(如 Lettuce、OkHttp)
  • 合理設(shè)置連接池大?。?code>maxPoolSize ≈ CPU 核心數(shù) * 2 + IO線程數(shù)

四、多策略組合優(yōu)化的真實(shí)案例

在一個(gè)用戶畫(huà)像平臺(tái)中,我們有接口 /api/user/portrait/{id},訪問(wèn)頻率極高,初始 QPS 僅能支撐 200 左右。

通過(guò)以下優(yōu)化組合,最終提升至 QPS > 3000+

優(yōu)化項(xiàng)效果提升
Redis 緩存熱點(diǎn)數(shù)據(jù)+5倍
接口異步化回調(diào)+2倍
請(qǐng)求合并+2倍
限流保護(hù)穩(wěn)定系統(tǒng)
響應(yīng)式重構(gòu)IO 利用率大幅提升

五、總結(jié):高吞吐的本質(zhì)是“減負(fù) + 異步 + 限速 + 快取”

在高并發(fā)場(chǎng)景下,提升吞吐量不是“堆機(jī)器”,而是“做減法”。

總結(jié)起來(lái),有8年經(jīng)驗(yàn)的我認(rèn)為:

  • 異步化:能異步就不要阻塞
  • 緩存化:能緩存就不要重復(fù)查
  • 限流化:能攔截就不要撐爆
  • 批量化:能合并就不要重復(fù)
  • 輕量化:能響應(yīng)式就不要阻塞式

六、附:性能優(yōu)化的思考路徑圖

                    +------------------+
                    |   性能瓶頸分析   |
                    +------------------+
                             ↓
                +--------------------------+
                | 是 CPU 吞吐 還是 IO 阻塞? |
                +--------------------------+
                             ↓
           +------------------------------------+
           | 線程池優(yōu)化 | 緩存 | 異步 | 限流 | 批處理 |
           +------------------------------------+

到此這篇關(guān)于使用Spring提高接口吞吐量的常見(jiàn)方法的文章就介紹到這了,更多相關(guān)Spring提高接口吞吐量?jī)?nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • idea打包不出現(xiàn)target的原因及解決

    idea打包不出現(xiàn)target的原因及解決

    文章主要介紹了在使用Maven進(jìn)行項(xiàng)目打包時(shí),`packaging` 屬性的重要性和配置方法,默認(rèn)情況下,Maven會(huì)將項(xiàng)目打包成jar包,如果項(xiàng)目是父級(jí)項(xiàng)目,則`packaging`屬性應(yīng)設(shè)置為`pom`,并通過(guò)`modules`標(biāo)簽引入子項(xiàng)目,這樣可以確保項(xiàng)目的模塊化管理和正確的構(gòu)建順序
    2024-11-11
  • SpringBoot實(shí)戰(zhàn)項(xiàng)目之谷歌瀏覽器全屏效果實(shí)現(xiàn)

    SpringBoot實(shí)戰(zhàn)項(xiàng)目之谷歌瀏覽器全屏效果實(shí)現(xiàn)

    這篇文章主要介紹了通過(guò) Java SpringBoot來(lái)實(shí)現(xiàn)谷歌瀏覽器的全屏效果,希望頁(yè)面展示時(shí)可以實(shí)現(xiàn)全屏效果以提高用戶體驗(yàn)。感興趣的小伙伴跟著小編往下看吧
    2021-09-09
  • Java 位圖法排序的使用方法

    Java 位圖法排序的使用方法

    本篇文章,小編將為大家介紹關(guān)于Java 位圖法排序的使用方法,有需要的朋友可以參考一下
    2013-04-04
  • java配置dbcp連接池(數(shù)據(jù)庫(kù)連接池)示例分享

    java配置dbcp連接池(數(shù)據(jù)庫(kù)連接池)示例分享

    java配置dbcp連接池示例分享,大家參考使用吧
    2013-12-12
  • ThreadLocal原理及內(nèi)存泄漏原因

    ThreadLocal原理及內(nèi)存泄漏原因

    這篇文章主要介紹了ThreadLocal原理及內(nèi)存泄漏原因,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Java中ClassNotFoundException的類加載問(wèn)題排查與修復(fù)方法

    Java中ClassNotFoundException的類加載問(wèn)題排查與修復(fù)方法

    在Java開(kāi)發(fā)中,java.lang.ClassNotFoundException是常見(jiàn)的運(yùn)行時(shí)異常,通常表示JVM在嘗試加載某個(gè)類時(shí)未能找到其定義,本文結(jié)合實(shí)戰(zhàn)經(jīng)驗(yàn),系統(tǒng)性分析ClassNotFoundException的排查與修復(fù)方法,并提供豐富的代碼示例和表格分析,需要的朋友可以參考下
    2025-06-06
  • 一次線上websocket返回400問(wèn)題排查的實(shí)戰(zhàn)記錄

    一次線上websocket返回400問(wèn)題排查的實(shí)戰(zhàn)記錄

    最近項(xiàng)目中有端對(duì)端通信場(chǎng)景,實(shí)時(shí)性要求較高,考慮后選用了websocket 這一通信協(xié)議,下面這篇文章主要給大家介紹了一次線上websocket返回400問(wèn)題排查的實(shí)戰(zhàn)記錄,需要的朋友可以參考下
    2022-04-04
  • Java中的內(nèi)存泄漏與避免指南

    Java中的內(nèi)存泄漏與避免指南

    在Java開(kāi)發(fā)中,內(nèi)存管理是不可忽視的重要課題之一,雖然Java的垃圾回收機(jī)制(GC)大大簡(jiǎn)化了內(nèi)存管理的復(fù)雜度,但隨著程序的不斷增長(zhǎng)和復(fù)雜度的增加,內(nèi)存泄漏的問(wèn)題依然常常困擾著開(kāi)發(fā)者,本文將深入探討內(nèi)存泄漏的概念、成因,并介紹一些常見(jiàn)的檢測(cè)工具和最佳實(shí)踐
    2025-09-09
  • SpringMVC實(shí)現(xiàn)用戶登錄全過(guò)程

    SpringMVC實(shí)現(xiàn)用戶登錄全過(guò)程

    這篇文章主要介紹了SpringMVC實(shí)現(xiàn)用戶登錄全過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-09-09
  • Java使用ExecutorService來(lái)停止線程服務(wù)

    Java使用ExecutorService來(lái)停止線程服務(wù)

    這篇文章主要介紹了Java使用ExecutorService來(lái)停止線程服務(wù),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評(píng)論

长汀县| 获嘉县| 当雄县| 高淳县| 周宁县| 东丰县| 青岛市| 兴化市| 崇明县| 健康| 新和县| 浑源县| 白银市| 沂源县| 沂水县| 青岛市| 万荣县| 剑川县| 将乐县| 陵水| 金平| 武功县| 临夏县| 巫溪县| 乡宁县| 河源市| 德化县| 屯昌县| 江川县| 满城县| 新密市| 土默特右旗| 长春市| 江门市| 申扎县| 卢氏县| 滨海县| 株洲县| 乐东| 武川县| 武穴市|