国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

網(wǎng)關 GateWay 的使用詳解、路由、過濾器、跨域配置!

這篇具有很好參考價值的文章主要介紹了網(wǎng)關 GateWay 的使用詳解、路由、過濾器、跨域配置!。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

一、網(wǎng)關的基本概念

SpringCloudGateway網(wǎng)關是所有微服務的統(tǒng)一入口。

1.1 它的主要作用是:

  • 反向代理(請求的轉(zhuǎn)發(fā))

  • 路由和負載均衡

  • 身份認證和權(quán)限控制

  • 對請求限流

1.2 相比于Zuul的優(yōu)勢:

SpringCloudGateway基于Spring5中提供的WebFlux,是一種響應式編程的實現(xiàn),性能更加優(yōu)越。

Zuul的實現(xiàn)方式比較老式,基于Servlet的實現(xiàn),它是一種阻塞式編程,在高并發(fā)下性能性能不佳。

拓展:

其實Nginx也可以作為網(wǎng)關,但是要使用Nginx自主實現(xiàn)網(wǎng)關的相關功能,還需要借助lua腳本語言,學習成本是比較高的,現(xiàn)在一般也不會使用它來做網(wǎng)關,但是只按性能來講Nginx,性能是最高的。

1.3 SpringCloudGateway架構(gòu)圖:

gateway配置,java,gateway

微服務只接收來自網(wǎng)關的請求,而其它直接訪問微服務本身的請求拒絕。

這樣可以極大保護微服務免受不法侵害。

同時在請求壓力激增時,可以實施服務限流,保護微服務集群。

二、SpringBoot中配置GateWay

2.1 引入GateWay的Maven依賴

<!--網(wǎng)關?起步依賴-->
<dependency>
????<groupId>org.springframework.cloud</groupId>
????<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服務發(fā)現(xiàn)?起步依賴-->
<dependency>
????<groupId>com.alibaba.cloud</groupId>
????<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2.2 配置application.yml文件

server:
??port:?10086???#?網(wǎng)關端口
spring:
??application:
????name:?gateway?#?服務名稱
??cloud:
????nacos:
??????server-addr:?localhost:8848????#?nacos?地址
????gateway:
??????routes:?????????#?網(wǎng)關路由配置
????????-?id:?user-service??????#?路由id,自定義,只要唯一即可
??????????#?uri:?http://127.0.0.1:8081???#?路由的目標地址?(直接寫死地址的方式,不推薦)
??????????uri:?lb://userservice????#?路由的目標地址?lb是負載均衡,后面跟服務名稱(推薦)
??????????predicates:???????#?路由斷言,判斷請求是否符合路由規(guī)則的條件
????????????-?Path=/user/**??????#?按照路徑匹配,以/user/開頭的請求就符合要求
????????-?id:?card-service
??????????uri:?lb://cardservice
??????????predicates:
????????????-?Path=/card/**

gateway配置中的注意點:

1.routes 后面的路由可以配置多個,相當于配置個數(shù)組,一個-開頭的配置就是其中的一個數(shù)組元素。

2.uri為什么選擇以服務名+負載均衡的方式?

主要是寫死地址的話,今后如果userservice的地址變了,那么又要去修改yml配置文件。而lb://userservice可以讓程序員一眼認出這是哪個微服務,以后地址變了也無需修改yml配置文件。

上述配置詳解:

將?/user/**開頭的請求,代理到lb://userservice。

將?/card/**開頭的請求,代理到lb://cardservice。

lb是負載均衡,根據(jù)服務名拉取服務列表,實現(xiàn)負載均衡。

  • http://127.0.0.1:10086/user/99?就算是/user/**開頭的請求,不要把協(xié)議、ip和端口計算在內(nèi)。

  • 有多少個需要配置的路由,都按上面的格式配置即可

三、GateWay路由配置詳解

路由主要有四個配置:

  • 路由id(id)

  • 路由目標(uri)

  • 路由斷言(predicates):判斷路由的規(guī)則,

  • 路由過濾器(filters):對請求或響應做處理

3.1 路由id

當前路由的唯一標識。

3.2 路由目標

路由的目標地址,http代表固定地址,lb代表根據(jù)服務名負載均衡。

一般都不會選擇寫死http固定地址的方式。而是選擇可維護性更強的lb根據(jù)服務名負載均衡的方式。

具體優(yōu)勢如上所言。

3.3 路由斷言

路由斷言主要用來判斷路由的規(guī)則。

配置文件中寫的斷言規(guī)則只是字符串,這些字符串會被Predicate Factory讀取并處理。

例如Path=/user/**是按照路徑匹配,這個規(guī)則是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory類來處理。

像這樣的斷言工廠在SpringCloudGateway還有十幾個:

gateway配置,java,gateway

實際使用時,根絕業(yè)務要求選擇使用即可。

不過一般來講,最常用的是使用Path這種斷言工廠,僅用它就能滿足常見的需求了。

關于Path斷言工廠的補充:

  • Path=/card/**代表 以/card/路徑開頭的多級路徑請求,這么寫多級路徑請求和一級路徑請求都生效。

  • Path=/card/*代表 以/card/路徑開頭的一級路徑請求,這么寫多級路徑請求將不會生效。

斷言工廠官方文檔:

  • https://docs.spring.io/spring-cloud-gateway/docs/3.1.4-SNAPSHOT/reference/html/#gateway-request-predicates-factories

今后如果有復雜的斷言工廠配置,可以參照官網(wǎng)文檔上的例子去實現(xiàn)。

3.4 路由過濾器(filters)

路由過濾器對請求或響應做處理。

gateway配置,java,gateway

客戶端請求先找到路由,路由匹配時經(jīng)過過濾器層層篩選,最終訪問到微服務。

當然微服務的請求反悔時,也會經(jīng)過過濾器的篩選,只不過我們一般只對請求過濾,而不會對響應過濾。

SpringCloudGateWay目前已經(jīng)提供了34種不同的過濾器工廠。

常用的幾個有:

gateway配置,java,gateway

3.4.1 請求頭過濾器配置示例(局部過濾器)
spring:
??cloud:
????gateway:
??????routes:
??????-?id:?user-service?
????????uri:?lb://userservice?
????????predicates:?
????????-?Path=/user/**?
????????filters:?????????#?過濾器配置
????????-?AddRequestHeader=token,?test?#?添加請求頭

上述過濾器的含義:

給所有進入userservice的請求添加一個請求頭。

請求頭的key為token,value為test。

由于當前前過濾器寫在微服務的userservice路由下,因此僅僅對訪問微服務userservice的請求有效。

3.4.2 默認過濾器配置示例(全局過濾器)
spring:
??cloud:
????gateway:
??????routes:
????????-?id:?user-service?
??????????uri:?lb://userservice?
??????????predicates:?
??????????-?Path=/user/**
??????default-filters:??????#?默認過濾器配置
????????-?AddRequestHeader=token,?test??#?添加請求頭

default-filters的配置和routes平級。

只要配置在default-filters下面的過濾器,會對routes配置的所有路由都生效。

過濾器工廠官方文檔:

  • https://docs.spring.io/spring-cloud-gateway/docs/3.1.4-SNAPSHOT/reference/html/#gateway-request-predicates-factories

今后如果有復雜的斷言工廠配置,可以參照官網(wǎng)文檔上的例子去實現(xiàn)。

四、自定義全局路由過濾器

有時候SpringCloudGateWay提供的過濾器工廠不能滿足自己的要求。

可能有時候需要在過濾時做一些其它的邏輯操作。

那么這時候可以選擇使用java代碼自定義全局過濾器。

代碼示例:

@Component
public?class?GateWayFilter?implements?GlobalFilter,?Ordered?{

????@Override
????public?Mono<Void>?filter(ServerWebExchange?exchange,?GatewayFilterChain?chain)?{

????????//?1.獲取請求參數(shù)?
????????//1.這里的request并不是servlet中的request??
????????//2.返回值是一個多鍵的map集合、也就是說這個map集合的鍵可以重復
????????MultiValueMap<String,?String>?params?=?exchange.getRequest().getQueryParams();
????????//?2.獲取userName參數(shù)
????????String?userName?=?params.getFirst("userName");
????????//?3.校驗
????????if?("root".equals(userName))?{
????????????//?放行
????????????return?chain.filter(exchange);
????????}
????????//?4.攔截
????????//?4.1.禁止訪問,設置狀態(tài)碼
????????exchange.getResponse().setStatusCode(500);
????????//?4.2.結(jié)束處理
????????return?exchange.getResponse().setComplete();
????}

????@Override
????public?int?getOrder()?{
????????return?-1;
????}
}

當有多個過濾器時,Order的值決定了過濾器的執(zhí)行順序。

數(shù)值越大優(yōu)先級越低, 負的越多, 優(yōu)先級越高。

設置Order的值有兩種方式:

1. 實現(xiàn)Ordered接口,并且重寫getOrder方法

@Component
public?class?GateWayFilter?implements?GlobalFilter,?Ordered?{

????@Override
????public?Mono<Void>?filter(ServerWebExchange?exchange,?GatewayFilterChain?chain)?{

????}

????@Override
????public?int?getOrder()?{
????????return?-1;
????}
}

2. 使用@Order注解

@Order(-1)
@Component
public?class?GateWayFilter?implements?GlobalFilter,?Ordered?{
????@Override
????public?Mono<Void>?filter(ServerWebExchange?exchange,?GatewayFilterChain?chain)?{

????}
}

五、過濾路由過濾器的執(zhí)行順序

5.1 過濾器的種類

SpringCloudGateWay中,有三種過濾器:

  • 默認過濾器default-filters

  • 只對具體某個路由生效的局部過濾器filters

  • 使用java代碼編寫的全局過濾器GlobalFilter

5.2 過濾器的執(zhí)行順序

gateway配置,java,gateway

由上圖知過濾器的執(zhí)行順序為:默認過濾器 → 當前路由過濾器 → 全局過濾器。

六、網(wǎng)關的跨域問題

6.1 跨域的概念和原理

跨域:請求位置和被請求位置不同源就會發(fā)生跨域。

這里的不同源包括兩個點:

  • 域名不同:www.baidu.com 和 www.taobao.com。(IP不同也是相同道理)

  • 端口不同:127.0.0.1:8080和127.0.0.1:8081。

而瀏覽器又會禁止請求的發(fā)起者與服務端發(fā)生跨域AJAX請求。

如果發(fā)生了跨域請求,服務器端是能夠正常響應的,但是響應的結(jié)果會被瀏覽器攔截。

6.2 跨域常見解決方案

使用CORS方式。

CORS是一個W3C標準,全稱是"跨域資源共享"(Cross-origin resource sharing)。

它允許瀏覽器向跨源服務器,發(fā)出XMLHttpRequest請求,從而克服了AJAX只能同源使用的限制。

6.3 gateway中如何解決跨域問題

方式一:配置application.yml文件:

spring:
??cloud:
????gateway:
??????globalcors:?#?全局的跨域配置
????????add-to-simple-url-handler-mapping:?true?#?解決options請求被攔截問題
???????????????#?options請求?就是一種詢問服務器是否瀏覽器可以跨域的請求
???????????????#?如果每次跨域都有詢問服務器是否瀏覽器可以跨域?qū)π阅芤彩菗p耗
???????????????#?可以配置本次跨域檢測的有效期maxAge
???????????????#?在maxAge設置的時間范圍內(nèi),不去詢問,統(tǒng)統(tǒng)允許跨域
????????corsConfigurations:
??????????'[/**]':
????????????allowedOrigins:???#?允許哪些網(wǎng)站的跨域請求?
??????????????-?"http://localhost:8090"
????????????allowedMethods:???#?允許的跨域ajax的請求方式
??????????????-?"GET"
??????????????-?"POST"
??????????????-?"DELETE"
??????????????-?"PUT"
??????????????-?"OPTIONS"
????????????allowedHeaders:?"*"??#?允許在請求中攜帶的頭信息
????????????allowCredentials:?true?#?允許在請求中攜帶cookie
????????????maxAge:?360000????#?本次跨域檢測的有效期(單位毫秒)
??????????????????#?有效期內(nèi),跨域請求不會一直發(fā)option請求去增大服務器壓力

方式二:使用編碼方式定義配置類:文章來源地址http://www.zghlxwxcb.cn/news/detail-730917.html

import?org.springframework.context.annotation.Bean;
import?org.springframework.context.annotation.Configuration;
import?org.springframework.http.HttpHeaders;
import?org.springframework.http.HttpMethod;
import?org.springframework.http.HttpStatus;
import?org.springframework.http.server.reactive.ServerHttpRequest;
import?org.springframework.http.server.reactive.ServerHttpResponse;
import?org.springframework.web.cors.reactive.CorsUtils;
import?org.springframework.web.server.ServerWebExchange;
import?org.springframework.web.server.WebFilter;
import?org.springframework.web.server.WebFilterChain;
import?reactor.core.publisher.Mono;

@Configuration
public?class?CorsConfig?{
????private?static?final?String?MAX_AGE?=?"18000L";

????@Bean
????public?WebFilter?corsFilter()?{
????????return?(ServerWebExchange?ctx,?WebFilterChain?chain)?->?{
????????????ServerHttpRequest?request?=?ctx.getRequest();
????????????//?使用SpringMvc自帶的跨域檢測工具類判斷當前請求是否跨域
????????????if?(!CorsUtils.isCorsRequest(request))?{
????????????????return?chain.filter(ctx);
????????????}
????????????HttpHeaders?requestHeaders?=?request.getHeaders();??????????????????????????????????//?獲取請求頭
????????????ServerHttpResponse?response?=?ctx.getResponse();????????????????????????????????????//?獲取響應對象
????????????HttpMethod?requestMethod?=?requestHeaders.getAccessControlRequestMethod();??????????//?獲取請求方式對象
????????????HttpHeaders?headers?=?response.getHeaders();????????????????????????????????????????//?獲取響應頭
????????????headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN,?requestHeaders.getOrigin());???//?把請求頭中的請求源(協(xié)議+ip+端口)添加到響應頭中(相當于yml中的allowedOrigins)
????????????headers.addAll(HttpHeaders.ACCESS_CONTROL_ALLOW_HEADERS,?requestHeaders.getAccessControlRequestHeaders());
????????????if?(requestMethod?!=?null)?{
????????????????headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_METHODS,?requestMethod.name());????//?允許被響應的方法(GET/POST等,相當于yml中的allowedMethods)
????????????}
????????????headers.add(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS,?"true");??????????//?允許在請求中攜帶cookie(相當于yml中的allowCredentials)
????????????headers.add(HttpHeaders.ACCESS_CONTROL_EXPOSE_HEADERS,?"*");????????????????//?允許在請求中攜帶的頭信息(相當于yml中的allowedHeaders)
????????????headers.add(HttpHeaders.ACCESS_CONTROL_MAX_AGE,?MAX_AGE);???????????????????????????//?本次跨域檢測的有效期(單位毫秒,相當于yml中的maxAge)
????????????if?(request.getMethod()?==?HttpMethod.OPTIONS)?{????????????????????????????????????//?直接給option請求反回結(jié)果
????????????????response.setStatusCode(HttpStatus.OK);
????????????????return?Mono.empty();
????????????}
????????????return?chain.filter(ctx);???????????????????????????????????????????????????????????//?不是option請求則放行
????????};
????}

}

到了這里,關于網(wǎng)關 GateWay 的使用詳解、路由、過濾器、跨域配置!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權(quán),不承擔相關法律責任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 178 服務網(wǎng)關GateWay---局部過濾器(GatewayFilter)

    178 服務網(wǎng)關GateWay---局部過濾器(GatewayFilter)

    在微服務架構(gòu)下,后端微服務可能都需要做一些重復相同的事情,如:認證鑒權(quán)、限流、黑白名單、日志收集等。對于這些需求當有了網(wǎng)關之后,就可以統(tǒng)一的在網(wǎng)關中實現(xiàn)即可,避免代碼冗余。 ? 要實現(xiàn)這些功能,則需要通過網(wǎng)關的過濾器進行實現(xiàn)。網(wǎng)關的過濾器類型分

    2024年02月21日
    瀏覽(29)
  • JAVA開發(fā)(通過網(wǎng)關gateway過濾器進行返回結(jié)果加密)

    JAVA開發(fā)(通過網(wǎng)關gateway過濾器進行返回結(jié)果加密)

    在對C的網(wǎng)站或者APP后端接口中,參數(shù)的傳輸往往需要加密傳輸。這時我們 可以通過springcloud的網(wǎng)關過濾器進行統(tǒng)一的控制。 網(wǎng)關過濾器的執(zhí)行順序: 請求進入網(wǎng)關會碰到三類過濾器:當前路由過濾器、DefaultFilter、GlobalFilter。 請求路由后,會將當前路由過濾器和DefaultFilter、

    2023年04月17日
    瀏覽(21)
  • 【Spring Cloud】深入探索統(tǒng)一網(wǎng)關 Gateway 的搭建,斷言工廠,過濾器工廠,全局過濾器以及跨域問題

    【Spring Cloud】深入探索統(tǒng)一網(wǎng)關 Gateway 的搭建,斷言工廠,過濾器工廠,全局過濾器以及跨域問題

    在微服務架構(gòu)中,網(wǎng)關是至關重要的組件,具有多重職責,為整個系統(tǒng)提供了一系列關鍵功能。從下面的微服務結(jié)構(gòu)圖中,我們可以明確網(wǎng)關的幾項主要作用: 微服務結(jié)構(gòu)圖: 請求過濾與安全: 用戶的所有請求首先經(jīng)過網(wǎng)關,這使得網(wǎng)關成為系統(tǒng)的第一道防線。通過對傳入

    2024年02月07日
    瀏覽(23)
  • GateWay網(wǎng)關自定義過濾器實現(xiàn)token校驗完成統(tǒng)一鑒權(quán)

    GateWay網(wǎng)關自定義過濾器實現(xiàn)token校驗完成統(tǒng)一鑒權(quán)

    gateWay---API網(wǎng)關,也可以稱為業(yè)務網(wǎng)關,主要服務于微服務的; (1)? 三大組件 路由(Route) ????????構(gòu)建網(wǎng)關的基本模塊,由id(唯一標示)、目標URI、一組斷言、一組過濾器組成,如果斷言為true,則匹配該路由 ? 斷言(Predicate) ? ? ? ? ?可以使用它匹配來自HTTP請求的任何

    2024年02月08日
    瀏覽(22)
  • SpringCloud GateWay 在全局過濾器中注入OpenFeign網(wǎng)關后無法啟動

    SpringCloud GateWay 在全局過濾器中注入OpenFeign網(wǎng)關后無法啟動

    目錄 一、問題 二、原因 1、修改配置 2、添加@Lazy注解在client上面 ?3、啟動成功 當在gateway的全局過濾器GlobalFilter中注入OpenFeign接口的時候會一直卡在路由中,但是不會進一步,導致啟動未成功也未報錯失敗 在gateway網(wǎng)關中不能使用openfeign同步調(diào)用 三、解決方法 在注入的Aut

    2024年01月19日
    瀏覽(20)
  • 微服務Gateway網(wǎng)關(自動定位/自定義過濾器/解決跨域)+nginx反向代理gateway集群

    微服務Gateway網(wǎng)關(自動定位/自定義過濾器/解決跨域)+nginx反向代理gateway集群

    目錄 Gateway網(wǎng)關 1.0.為什么需要網(wǎng)關? 1.1.如何使用gateway網(wǎng)關 1.2.網(wǎng)關從注冊中心拉取服務 1.3.gateway自動定位 1.4.gateway常見的斷言 1.5.gateway內(nèi)置的過濾器 1.6.自定義過濾器-全局過濾器 1.7.解決跨域問題 2.nginx反向代理gateway集群 2.1.配置文件 繼? nacos注冊中心+Ribbon負載均衡+完成

    2024年02月06日
    瀏覽(42)
  • Spring-Cloud-Gateway如何自定義路由過濾器?

    遇到這么一個面試題:自定義網(wǎng)關過濾器實現(xiàn)把url中的請求參數(shù)放到http的header中傳遞給微服務。 我們知道網(wǎng)關的一個重要的作用就是路由轉(zhuǎn)發(fā),路由表的配置大概是這個樣子: 其中的filters就是配置的路由過濾器,Spring已經(jīng)內(nèi)置了31個路由的過濾器,這些過濾器都是 org.spring

    2024年02月16日
    瀏覽(23)
  • gateway之過濾器(Filter)詳解

    gateway之過濾器(Filter)詳解

    在Spring Cloud中,過濾器(Filter)是一種關鍵的組件,用于在微服務架構(gòu)中處理和轉(zhuǎn)換傳入請求以及傳出響應。過濾器位于服務網(wǎng)關或代理中,并通過攔截請求和響應流量來提供各種功能。 過濾器在請求的不同生命周期階段執(zhí)行特定的操作,例如鑒權(quán)、認證、請求轉(zhuǎn)發(fā)、限流、

    2024年02月05日
    瀏覽(20)
  • 【微服務筆記17】微服務組件之Gateway實現(xiàn)動態(tài)路由、配置路由規(guī)則、路由過濾器

    【微服務筆記17】微服務組件之Gateway實現(xiàn)動態(tài)路由、配置路由規(guī)則、路由過濾器

    這篇文章,主要介紹微服務組件之Gateway實現(xiàn)動態(tài)路由、配置路由映射規(guī)則、路由過濾器。 目錄 一、動態(tài)路由配置 1.1、動態(tài)URI路由配置 (1)引入eureka客戶端依賴 (2)添加路由配置 1.2、服務名稱轉(zhuǎn)發(fā)配置 二、斷言配置規(guī)則 2.1、路由斷言工廠類 2.2、Path路徑匹配 2.3、Query請求

    2023年04月23日
    瀏覽(26)
  • 【微服務技術(shù)二】Feign、Gateway(路由、過濾器、跨域)的初步認知

    【微服務技術(shù)二】Feign、Gateway(路由、過濾器、跨域)的初步認知

    之前遠程調(diào)用使用RestTemplate,代碼如下: 使用RestTemplate的缺陷: 代碼可讀性差,編程體驗不統(tǒng)一(莫名的url路徑) 參數(shù)復雜時的URL難以維護 Feign是一個聲明式的http客戶端,官方網(wǎng)址: https://github.com/OpenFeign/feign Feign替代RestTemplate 使用Feign的步驟: 1、引入依賴: 2、在消費者

    2024年02月12日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包