環(huán)境:SpringBoot2.7.12 + SpringCloud2021.0.7
Spring Cloud Gateway 中,路由斷言(predicates)和過(guò)濾器(filters)是兩個(gè)核心概念,它們共同決定了如何處理進(jìn)入網(wǎng)關(guān)的請(qǐng)求。
謂詞工廠用于定義路由斷言。斷言是路由的一個(gè)條件,只有當(dāng)條件滿足時(shí),請(qǐng)求才會(huì)被路由到指定的服務(wù)。Spring Cloud Gateway 提供了一系列的內(nèi)置斷言,例如基于路徑、請(qǐng)求頭、請(qǐng)求方法等的斷言。然而,如果你需要實(shí)現(xiàn)一些特定的業(yè)務(wù)邏輯或自定義條件,你可以創(chuàng)建自定義的謂詞工廠。
自定義謂詞工廠通常需要實(shí)現(xiàn) org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory
或其子類(lèi),并定義斷言的條件。在創(chuàng)建自定義謂詞工廠時(shí),你需要指定謂詞的名字、配置類(lèi)以及斷言的匹配邏輯。
例如,你可以創(chuàng)建一個(gè)自定義謂詞工廠來(lái)檢查請(qǐng)求中是否包含特定的自定義請(qǐng)求頭。
網(wǎng)關(guān)過(guò)濾器工廠用于定義在路由匹配后應(yīng)用于請(qǐng)求的過(guò)濾器。這些過(guò)濾器可以對(duì)請(qǐng)求和響應(yīng)進(jìn)行修改,例如添加請(qǐng)求頭、修改響應(yīng)體或進(jìn)行身份驗(yàn)證等。Spring Cloud Gateway 同樣提供了一系列的內(nèi)置過(guò)濾器,但同樣,如果你需要實(shí)現(xiàn)特定的業(yè)務(wù)邏輯或自定義處理,你可以創(chuàng)建自定義的網(wǎng)關(guān)過(guò)濾器工廠。
自定義網(wǎng)關(guān)過(guò)濾器工廠通常需要實(shí)現(xiàn) org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory
,并定義過(guò)濾器的邏輯。你可以在這里編寫(xiě) Java 代碼來(lái)實(shí)現(xiàn)對(duì)請(qǐng)求和響應(yīng)的自定義處理。
例如,你可以創(chuàng)建一個(gè)自定義網(wǎng)關(guān)過(guò)濾器工廠來(lái)記錄每個(gè)請(qǐng)求的詳細(xì)信息,或者根據(jù)特定的業(yè)務(wù)邏輯修改響應(yīng)的內(nèi)容。
該謂詞工廠的作用檢查請(qǐng)求參數(shù)及header中個(gè)性化的信息。
@Componentpublic class ParamHeaderRoutePredicateFactory extends AbstractRoutePredicateFactory<ParamHeaderRoutePredicateFactory.Config> { public static final String PARAM_KEY = "param"; public static final String HEADER_KEY = "header" ; public static final String PARAM_VALUE = "pv" ; public static final String HEADER_VALUE = "hv" ; public ParamHeaderRoutePredicateFactory() { super(Config.class); } @Override public List<String> shortcutFieldOrder() { return Arrays.asList(PARAM_KEY, PARAM_VALUE, HEADER_KEY, HEADER_VALUE) ; } @Override public Predicate<ServerWebExchange> apply(Config config) { return new GatewayPredicate() { @Override public boolean test(ServerWebExchange t) { String pv = t.getRequest().getQueryParams().getFirst(config.param) ; String hv = t.getRequest().getHeaders().getFirst(config.header) ; System.err.printf("請(qǐng)求參數(shù): %s=%s, 請(qǐng)求頭: %s=%s%n", config.param, pv, config.header, hv) ; return config.pv.equals(pv) && config.hv.equals(hv) ; } } ; } // 驗(yàn)證配置參數(shù) @Validated public static class Config { @NotEmpty(message = "參數(shù)param不能為空") private String param ; @NotEmpty(message = "請(qǐng)求header不能為空") private String header ; private String pv ; private String hv ; // getter, setter }}
使用
spring: cloud: gateway: default-filters: - StripPrefix=1 routes: - id: pack-lbs-1 uri: packlb://cloudAppServiceProvider predicates: #- ParamHeader=q,java,v,1 - name: ParamHeader args: param: q pv: java header: v hv: 1
請(qǐng)求中的q參數(shù)值必須是java,請(qǐng)求header中的v值必須是1,才會(huì)匹配該路徑。
圖片
該過(guò)濾器的功能是改寫(xiě)請(qǐng)求參數(shù)信息。
@Componentpublic class CustomGatewayFilterFactory extends AbstractGatewayFilterFactory<Config> { public CustomGatewayFilterFactory() { super(Config.class) ; } @Override public List<String> shortcutFieldOrder() { return super.shortcutFieldOrder() ; } @Override public GatewayFilter apply(Config config) { return (exchange, chain) -> { Route r = exchange.getAttribute(GATEWAY_ROUTE_ATTR) ; Map<String,Object> metadata = r.getMetadata() ; System.out.println(metadata) ; ServerHttpRequest request = exchange.getRequest() ; URI uri = request.getURI() ; // 獲取idNo參數(shù),改寫(xiě)請(qǐng)求參數(shù)idNo數(shù)值 MultiValueMap<String, String> queryParams = request.getQueryParams(); String idNo = queryParams.getFirst("idNo") ; // 對(duì)idNo參數(shù)進(jìn)行解密操作(只是演示) idNo = idNo + "-new" ; // 這里為了演示簡(jiǎn)單,不考慮多個(gè)參數(shù)的情況 String query = "idNo=" + idNo ; System.out.println(uri) ; URI newUri = UriComponentsBuilder.fromUri(uri).replaceQuery(query).build(true).toUri() ; System.out.println(newUri) ; Builder builder = request.mutate().uri(newUri) ; return chain.filter(exchange.mutate().request(builder.build()).build()) ; }; } public static class Config { }}
使用
spring: cloud: gateway: routes: - id: demo-service-01 uri: http://localhost:8088 predicates: - name: Path args: a: /api-x/** filters: - name: Custom
測(cè)試
圖片
Spring Cloud Gateway 的自定義謂詞工廠和網(wǎng)關(guān)過(guò)濾器工廠為開(kāi)發(fā)者提供了靈活性和擴(kuò)展性,使得開(kāi)發(fā)者可以根據(jù)業(yè)務(wù)需求自定義路由條件和請(qǐng)求處理邏輯。通過(guò)實(shí)現(xiàn)這些自定義組件,你可以輕松地構(gòu)建出滿足特定業(yè)務(wù)需求的 API 網(wǎng)關(guān)。
以上是本篇文章全部?jī)?nèi)容,希望對(duì)你有幫助。
本文鏈接:http://www.www897cc.com/showinfo-26-81064-0.html實(shí)戰(zhàn)Spring Cloud Gateway自定義謂詞及網(wǎng)關(guān)過(guò)濾器
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com
上一篇: 使用Kafka構(gòu)建實(shí)時(shí)音樂(lè)排行榜系統(tǒng),你學(xué)會(huì)了嗎?