成人免费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窗體繼承

2009-12-25 09:39:08

ADSL MODEM

2025-03-03 00:13:50

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

2009-12-03 16:54:04

無線寬帶路由器

2024-11-04 10:05:00

AI模型

2009-12-04 16:25:24

2009-12-21 14:12:30

路由器配置故障

2018-09-18 11:28:01

2009-12-03 16:33:02

路由交換設備

2025-04-09 10:36:32

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: av国产精品 | 国产欧美一区二区精品忘忧草 | 午夜大片| 日韩福利片 | 91玖玖| av影音| 久久久久av | 国产成人精品免高潮在线观看 | 国产美女高潮 | 久久国产成人精品国产成人亚洲 | 成人免费一区二区三区视频网站 | 国产精品欧美一区二区三区不卡 | 久久99精品久久久久久国产越南 | 99久久婷婷国产综合精品电影 | 亚洲国产欧美精品 | 又黄又爽的网站 | 国产一区免费视频 | 国产精品久久久久久久久久免费看 | 亚洲精品99 | 毛片毛片毛片毛片毛片 | 亚洲成人自拍 | 自拍偷拍视频网 | 午夜av成人 | 羞羞网站免费观看 | 国产精品激情小视频 | 久久精彩视频 | 一区二区三区小视频 | 免费黄色网址视频 | 亚洲一区二区免费电影 | 亚洲精品视频免费 | 久久久中文 | 亚洲视频区 | 男女羞羞在线观看 | 国产 欧美 日韩 一区 | 欧美性大战久久久久久久蜜臀 | 国产精品视频导航 | av综合站| 欧美亚洲另类丝袜综合网动图 | 午夜视频在线观看一区二区 | 日韩欧美三区 | 中文字幕亚洲区一区二 |