成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

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

實際上,Spring Cloud Gateway已經內置了AdaptCachedBodyGlobalFilter過濾器,它在Exchange中巧妙地緩存了Request的Body,避免了直接讀取導致的一系列問題。這種方式更為穩妥,避免了潛在的內存溢出風險。

圖片圖片

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

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

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

AdaptCachedBodyGlobalFilter會監聽EnableBodyCachingEvent事件,當發布該事件時就將RouteId放入routesToCache中。為了方便使用,我們可以編寫一個配置類,在初始化時發布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內容,避免了一些常見的問題。在實際應用中,考慮到穩定性和性能,這種解決方案提供了一種更為可靠的選擇。

責任編輯:武曉燕 來源: JAVA日知錄
相關推薦

2021-12-03 12:15:01

QT中文亂碼Windows

2023-02-27 08:08:54

Pulsar源碼重復消費

2009-11-27 10:31:02

GPRS路由

2010-01-11 18:05:24

VB.NET窗體繼承

2025-03-03 00:13:50

2009-12-25 09:39:08

ADSL MODEM

2010-01-04 15:05:53

2009-11-24 19:50:10

2009-12-03 18:45:41

2022-10-08 23:55:58

iOS蘋果開發

2010-01-14 10:19:05

2025-06-17 06:40:45

DockerDocker鏡像

2020-09-28 14:41:24

Event Loop

2024-11-04 10:05:00

AI模型

2009-12-03 16:54:04

無線寬帶路由器

2009-12-04 16:25:24

2018-09-18 11:28:01

2009-12-21 14:12:30

路由器配置故障

2009-12-03 16:33:02

路由交換設備

2025-04-09 10:36:32

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本在线看 | 免费国产一区二区视频 | 在线免费看黄 | 性精品| 男女在线免费观看 | 久久久久久国模大尺度人体 | 日韩在线一区二区 | 欧洲成人免费视频 | 精品免费国产一区二区三区四区介绍 | 国产成人精品一区二区三区四区 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 亚洲精品不卡 | 久久精品一区二 | 天久久 | 成人二区| 在线免费黄色小视频 | 成人一区二区视频 | 欧美久久一区二区三区 | 欧美一区二区三区在线观看视频 | 久久久久久国产精品 | 亚洲一区二区三区在线观看免费 | 中文字幕加勒比 | www狠狠干| 亚洲国产精品自拍 | 欧美三级免费观看 | 国产精品美女久久久久aⅴ国产馆 | 久久99网 | 日日骚av| 久久久久久久久久久久久久国产 | avhd101在线成人播放 | 久久精品色欧美aⅴ一区二区 | 青春草国产 | 日韩www视频| av日日操 | 日韩精品一区二区三区视频播放 | 日本黄色影片在线观看 | 中文字幕在线剧情 | se婷婷| 国产亚洲网站 | 亚洲日日操 | 亚洲午夜精品 |