亚洲视频二区_亚洲欧洲日本天天堂在线观看_日韩一区二区在线观看_中文字幕不卡一区

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請做好本站友鏈:【 網(wǎng)站目錄:http://www.430618.com 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

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

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

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

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

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

在需要獲取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ā)布該事件時(shí)就將RouteId放入routesToCache中。為了方便使用,我們可以編寫一個(gè)配置類,在初始化時(shí)發(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 路由配置中的每個(gè)路由都啟用 AdaptCachedBodyGlobalFilter
            EnableBodyCachingEvent enableBodyCachingEvent = new EnableBodyCachingEvent(new Object(), routeDefinition.getId());
            publisher.publishEvent(enableBodyCachingEvent);
        });
    }
}

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

分享到:
標(biāo)簽:Spring
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評定2018-06-03

通用課目體育訓(xùn)練成績評定