自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

徹底解決Spring Cloud Gateway中Body讀取問題

開發(fā) 前端
AdaptCachedBodyGlobalFilter會監(jiān)聽EnableBodyCachingEvent事件,當(dāng)發(fā)布該事件時就將RouteId放入routesToCache中。為了方便使用,我們可以編寫一個配置類,在初始化時發(fā)布EnableBodyCachingEvent事件,將所有路由都啟用緩存功能。

在構(gòu)建微服務(wù)架構(gòu)時,Spring Cloud Gateway作為一個重要的微服務(wù)網(wǎng)關(guān),經(jīng)常需要在過濾器(Filter)中對POST請求的Body內(nèi)容進行操作,如日志記錄、簽名驗證和權(quán)限驗證等。然而,由于Request的Body只能讀取一次,如果直接在過濾器中讀取而不進行封裝,可能導(dǎo)致后續(xù)服務(wù)無法獲取數(shù)據(jù)。

網(wǎng)上搜這個問題的解決方案,大多數(shù)文章都是告訴你寫一個Filter將Request的Body緩存起來。這種方法確實可以,只不過需要對代碼經(jīng)過充分壓力測試,否則很有可能出現(xiàn)如下所示的堆外內(nèi)存溢出問題。

reactor.netty.ReactorNetty$InternalNettyException: io.netty.util.internal.OutOfDirectMemoryError:failed to allocate

實際上,Spring Cloud Gateway已經(jīng)內(nèi)置了AdaptCachedBodyGlobalFilter過濾器,它在Exchange中巧妙地緩存了Request的Body,避免了直接讀取導(dǎo)致的一系列問題。這種方式更為穩(wěn)妥,避免了潛在的內(nèi)存溢出風(fēng)險。

圖片圖片

在需要獲取Body的地方,我們只需要通過以下方法即可:

DataBuffer body = exchange.getAttributeOrDefault("cachedRequestBody", null);
String bodyStr = body.toString(StandardCharsets.UTF_8);

只不過通過源碼可以看出,緩存RequestBody需要路由被標(biāo)記為需要緩存,也就是this.routesToCache.containsKey(rouceId)方法必須返回true。

AdaptCachedBodyGlobalFilter會監(jiān)聽EnableBodyCachingEvent事件,當(dāng)發(fā)布該事件時就將RouteId放入routesToCache中。為了方便使用,我們可以編寫一個配置類,在初始化時發(fā)布EnableBodyCachingEvent事件,將所有路由都啟用緩存功能。

@Configuration(proxyBeanMethods = false)
@Slf4j
public class EnableCachedBodyConfiguration {
    
    @Resource
    private ApplicationEventPublisher publisher;
    
    @Resource
    private GatewayProperties gatewayProperties;
    
    @PostConstruct
    public void init() {
        gatewayProperties.getRoutes().forEach(routeDefinition -> {
            // 對 spring cloud gateway 路由配置中的每個路由都啟用 AdaptCachedBodyGlobalFilter
            EnableBodyCachingEvent enableBodyCachingEvent = new EnableBodyCachingEvent(new Object(), routeDefinition.getId());
            publisher.publishEvent(enableBodyCachingEvent);
        });
    }
}

通過這種方式,我們可以更加方便地處理POST請求的Body內(nèi)容,避免了一些常見的問題。在實際應(yīng)用中,考慮到穩(wěn)定性和性能,這種解決方案提供了一種更為可靠的選擇。

責(zé)任編輯:武曉燕 來源: JAVA日知錄
相關(guān)推薦

2009-11-27 10:31:02

GPRS路由

2021-12-03 12:15:01

QT中文亂碼Windows

2023-02-27 08:08:54

Pulsar源碼重復(fù)消費

2025-03-03 00:13:50

2010-01-04 15:05:53

2010-01-11 18:05:24

VB.NET窗體繼承

2010-01-14 10:19:05

2009-12-25 09:39:08

ADSL MODEM

2009-12-03 18:45:41

2009-11-24 19:50:10

2009-12-03 16:33:02

路由交換設(shè)備

2022-10-08 23:55:58

iOS蘋果開發(fā)

2024-10-09 12:05:27

2025-04-09 10:36:32

2009-12-21 17:20:19

2022-05-31 09:01:13

GitHub工具安全

2009-12-03 16:54:04

無線寬帶路由器

2024-11-04 10:05:00

AI模型

2020-09-28 14:41:24

Event Loop

2009-12-04 16:25:24

點贊
收藏

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