久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区

服務網關:SpringCloud Gateway核心技術
來源:冰河技術    時間:2022-05-17 09:01:04
本章總覽本章概述

SpringCloud Gateway能夠實現多種網關功能,比如路由轉發、斷言、過濾器、熔斷、限流、降級、自定義謂詞配置、自定義過濾器等等多種功能。今天,我們就一起來聊聊SpringCloud Gateway中的斷言、過濾器與熔斷機制。

網關斷言

斷言的英文是Predicate,也可以翻譯成謂詞。主要的作用就是進行條件判斷,可以在網關中實現多種條件判斷,只有所有的判斷結果都通過時,也就是所有的條件判斷都返回true,才會真正的執行路由功能。

SpringCloud Gateway內置斷言

SpringCloud Gateway包括許多內置的斷言工廠,所有這些斷言都與HTTP請求的不同屬性匹配。

基于日期時間類型的斷言

基于日期時間類型的斷言根據時間做判斷,主要有三個:

AfterRoutePredicateFactory:接收一個日期時間參數,判斷當前請求的日期時間是否晚于指定的日期時間。BeforeRoutePredicateFactory:接收一個日期時間參數,判斷當前請求的日期時間是否早于指定的日期時間。BetweenRoutePredicateFactory:接收兩個日期時間參數,判斷當前請求的日期時間是否在指定的時間時間段內。使用示例

- After=2022-05-10T23:59:59.256+08:00[Asia/Shanghai]基于遠程地址的斷言

RemoteAddrRoutePredicateFactory:接收一個IP地址段,判斷發出請求的客戶端的IP地址是否在指定的IP地址段內。

使用示例

- RemoteAddr=192.168.0.1/24基于Cookie的斷言

CookieRoutePredicateFactory:接收兩個參數, Cookie的名稱和一個正則表達式。判斷請求的Cookie是否具有給定名稱且值與正則表達式匹配。

使用示例

- Cookie=name, binghe.基于Header的斷言

HeaderRoutePredicateFactory:接收兩個參數,請求Header的名稱和正則表達式。判斷請求Header中是否具有給定的名稱且值與正則表達式匹配。

使用示例

- Header=X-Request-Id, \d+基于Host的斷言

HostRoutePredicateFactory:接收一個參數,這個參數通常是主機名或者域名的模式,例如**.binghe.com這種格式。判斷發出請求的主機是否滿足匹配規則。

使用示例

- Host=**.binghe.com基于Method請求方法的斷言

MethodRoutePredicateFactory:接收一個參數,判斷請求的類型是否跟指定的類型匹配,通常指的是請求方式。例如,POST、GET、PUT等請求方式。

使用示例

- Method=GET基于Path請求路徑的斷言

PathRoutePredicateFactory:接收一個參數,判斷請求的鏈接地址是否滿足路徑規則,通常指的是請求的URI部分。

使用示例

- Path=/binghe/{segment}基于Query請求參數的斷言

QueryRoutePredicateFactory :接收兩個參數,請求參數和正則表達式, 判斷請求的參數是否具有給定的名稱并且參數值是否與正則表達式匹配。

使用示例

- Query=name, binghe.基于路由權重的斷言

WeightRoutePredicateFactory:接收一個[組名,權重]格式的數組,然后對于同一個組內的路由按照權重轉發。

使用示例

- id: weight1 uri: http://localhost:8080 predicates: - Path=/api/** - Weight=group1,2 filters: - StripPrefix=1- id: weight2 uri: http://localhost:8081 predicates: - Path=/api/** - Weight=group1,8 filters: - StripPrefix=1演示內置斷言

在演示的示例中,我們基于Path請求路徑的斷言判斷請求路徑是否符合規則,基于遠程地址的斷言判斷請求主機地址是否在地址段中,并且限制請求的方式為GET方式。整個演示的過程以訪問用戶微服務的接口為例。

(1)由于在開發項目時,所有的服務都是在我本地啟動的,首先查看下我本機的IP地址,如下所示。

可以看到,我本機的IP地址為192.168.0.27,屬于192.168.0.1/24網段。

(2)在服務網關模塊shop-gateway中,將application.yml文件備份成application-sentinel.yml文件,并將application.yml文件中的內容修改成application-simple.yml文件中的內容。接下來,在application.yml文件中的spring.cloud.gateway.routes節點下的- id: user-gateway下面進行斷言配置,配置后的結果如下所示。

spring: cloud: gateway: routes: - id: user-gateway uri: http://localhost:8060 order: 1 predicates: - Path=/server-user/** - RemoteAddr=192.168.0.1/24 - Method=GET filters: - StripPrefix=1

注意:完整的配置參見案例完整源代碼。

(3)配置完成后啟動用戶微服務和網關服務,通過網關服務訪問用戶微服務,在瀏覽器中輸入http://localhost:10001/server-user/user/get/1001,如下所示。

可以看到通過http://localhost:10001/server-user/user/get/1001鏈接不能正確訪問到用戶信息。

接下來,在瀏覽器中輸入http://192.168.0.27:10001/server-user/user/get/1001,能夠正確獲取到用戶的信息。

(4)停止網關微服務,將基于遠程地址的斷言配置成- RemoteAddr=192.168.1.1/24,也就是將基于遠程地址的斷言配置成與我本機IP地址不在同一個網段,這樣就能演示請求主機地址不在地址段中的情況,修改后的基于遠程地址的斷言配置如下所示。

- RemoteAddr=192.168.1.1/24

(5)重啟網關服務,再次在瀏覽器中輸入http://localhost:10001/server-user/user/get/1001,如下所示。

可以看到通過http://localhost:10001/server-user/user/get/1001鏈接不能正確訪問到用戶信息。

接下來,在瀏覽器中輸入http://192.168.0.27:10001/server-user/user/get/1001,也不能正確獲取到用戶的信息了。

自定義斷言

SpringCloud Gateway支持自定義斷言功能,我們可以在具體業務中,基于SpringCloud Gateway自定義特定的斷言功能。

自定義斷言概述

SpringCloud Gateway雖然提供了多種內置的斷言功能,但是在某些場景下無法滿足業務的需要,此時,我們就可以基于SpringCloud Gateway自定義斷言功能,以此來滿足我們的業務場景。

實現自定義斷言

這里,我們基于SpringCloud Gateway實現斷言功能,實現后的效果是在服務網關的application.yml文件中的spring.cloud.gateway.routes節點下的- id: user-gateway下面進行如下配置。

spring: cloud: gateway: routes: - id: user-gateway uri: http://localhost:8060 order: 1 predicates: - Path=/server-user/** - Name=binghe filters: - StripPrefix=1

通過服務網關訪問用戶微服務時,只有在訪問的鏈接后面添加?name=binghe參數時才能正確訪問用戶微服務。

(1)在網關服務shop-gateway中新建io.binghe.shop.predicate包,在包下新建NameRoutePredicateConfig類,主要定義一個Spring類型的name成員變量,用來接收配置文件中的參數,源碼如下所示。

/** * @author binghe * @version 1.0.0 * @description 接收配置文件中的參數 */@Datapublic class NameRoutePredicateConfig implements Serializable { private static final long serialVersionUID = -3289515863427972825L; private String name;}

(2)實現自定義斷言時,需要新建類繼承org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory類,在io.binghe.shop.predicate包下新建NameRoutePredicateFactory類,繼承org.springframework.cloud.gateway.handler.predicate.AbstractRoutePredicateFactory類,并覆寫相關的方法,源碼如下所示。

/** * @author binghe * @version 1.0.0 * @description 自定義斷言功能 */@Componentpublic class NameRoutePredicateFactory extends AbstractRoutePredicateFactory { public NameRoutePredicateFactory() { super(NameRoutePredicateConfig.class); } @Override public Predicate apply(NameRoutePredicateConfig config) { return (serverWebExchange)->{ String name = serverWebExchange.getRequest().getQueryParams().getFirst("name"); if (StringUtils.isEmpty(name)){ name = ""; } return name.equals(config.getName()); }; } @Override public List shortcutFieldOrder() { return Arrays.asList("name"); }}

(3)在服務網關的application.yml文件中的spring.cloud.gateway.routes節點下的- id: user-gateway下面進行如下配置。

spring: cloud: gateway: routes: - id: user-gateway uri: http://localhost:8060 order: 1 predicates: - Path=/server-user/** - Name=binghe filters: - StripPrefix=1

(4)分別啟動用戶微服務與網關服務,在瀏覽器中輸入http://localhost:10001/server-user/user/get/1001,如下所示。

可以看到,在瀏覽器中輸入http://localhost:10001/server-user/user/get/1001,無法獲取到用戶信息。

(5)在瀏覽器中輸入http://localhost:10001/server-user/user/get/1001?name=binghe,如下所示。

可以看到,在訪問鏈接后添加?name=binghe參數后,能夠正確獲取到用戶信息。

至此,我們實現了自定義斷言功能。

網關過濾器

過濾器可以在請求過程中,修改請求的參數和響應的結果等信息。在生命周期的角度總體上可以分為前置過濾器(Pre)和后置過濾器(Post)。在實現的過濾范圍角度可以分為局部過濾器(GatewayFilter)和全局過濾器(GlobalFilter)。局部過濾器作用的范圍是某一個路由,全局過濾器作用的范圍是全部路由。

Pre前置過濾器:在請求被網關路由之前調用,可以利用這種過濾器實現認證、鑒權、路由等功能,也可以記錄訪問時間等信息。Post后置過濾器:在請求被網關路由到微服務之后執行。可以利用這種過濾器修改HTTP的響應Header信息,修改返回的結果數據(例如對于一些敏感的數據,可以在此過濾器中統一處理后返回),收集一些統計信息等。局部過濾器(GatewayFilter):也可以稱為網關過濾器,這種過濾器主要是作用于單一路由或者某個路由分組。全局過濾器(GlobalFilter):這種過濾器主要作用于所有的路由。局部過濾器

局部過濾器又稱為網關過濾器,這種過濾器主要是作用于單一路由或者某個路由分組。

局部過濾器概述

在SpringCloud Gateway中內置了很多不同類型的局部過濾器,主要如下所示。

演示內部過濾器

演示內部過濾器時,我們為原始請求添加一個名稱為IP的Header,值為localhost,并添加一個名稱為name的參數,參數值為binghe。同時修改響應的結果狀態,將結果狀態修改為1001。

(1)在服務網關的application.yml文件中的spring.cloud.gateway.routes節點下的- id: user-gateway下面進行如下配置。

spring: cloud: gateway: routes: - id: user-gateway uri: http://localhost:8060 order: 1 predicates: - Path=/server-user/** filters: - StripPrefix=1 - AddRequestHeader=IP,localhost - AddRequestParameter=name,binghe - SetStatus=1001

(2)在用戶微服務的io.binghe.shop.user.controller.UserController類中新增apiFilter1()方法,如下所示。

@GetMapping(value = "/api/filter1")public String apiFilter1(HttpServletRequest request, HttpServletResponse response){ log.info("訪問了apiFilter1接口"); String ip = request.getHeader("IP"); String name = request.getParameter("name"); log.info("ip = " + ip + ", name = " + name); return "apiFilter1";}

可以看到,在新增加的apiFilter1()方法中,獲取到新增加的Header與參數,并將獲取出來的參數與Header打印出來。并且方法返回的是字符串apiFilter1。

(3)分別啟動用戶微服務與網關服務,在瀏覽器中輸入http://localhost:10001/server-user/user/api/filter1,如下所示。

此時,查看瀏覽器中的響應狀態碼,如下所示。

可以看到,此時的狀態碼已經被修改為1001。

接下來,查看下用戶微服務的控制臺輸出的信息,發現在輸出的信息中存在如下數據。

訪問了apiFilter1接口ip = localhost, name = binghe

說明使用SpringCloud Gateway的內置過濾器成功為原始請求添加了一個名稱為IP的Header,值為localhost,并添加了一個名稱為name的參數,參數值為binghe。同時修改了響應的結果狀態,將結果狀態修改為1001,符合預期效果。

自定義局部過濾器

這里,我們基于SpringCloud Gateway自定義局部過濾器實現是否開啟灰度發布的功能,整個實現過程如下所示。

(1)在服務網關的application.yml文件中的spring.cloud.gateway.routes節點下的- id: user-gateway下面進行如下配置。

spring: cloud: gateway: routes: - id: user-gateway uri: http://localhost:8060 order: 1 predicates: - Path=/server-user/** filters: - StripPrefix=1 - Grayscale=true

(2)在網關服務模塊shop-gateway中新建io.binghe.shop.filter包,在包下新建GrayscaleGatewayFilterConfig類,用于接收配置中的參數,如下所示。

/** * @author binghe * @version 1.0.0 * @description 接收配置參數 */@Datapublic class GrayscaleGatewayFilterConfig implements Serializable { private static final long serialVersionUID = 983019309000445082L; private boolean grayscale;}

(3)在io.binghe.shop.filter包下GrayscaleGatewayFilterFactory類,繼承org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory類,主要是實現自定義過濾器,模擬實現灰度發布。代碼如下所示。

/** * @author binghe * @version 1.0.0 * @description 自定義過濾器模擬實現灰度發布 */@Componentpublic class GrayscaleGatewayFilterFactory extends AbstractGatewayFilterFactory { public GrayscaleGatewayFilterFactory(){ super(GrayscaleGatewayFilterConfig.class); } @Override public GatewayFilter apply(GrayscaleGatewayFilterConfig config) { return (exchange, chain) -> { if (config.isGrayscale()){ System.out.println("開啟了灰度發布功能..."); }else{ System.out.println("關閉了灰度發布功能..."); } return chain.filter(exchange); }; } @Override public List shortcutFieldOrder() { return Arrays.asList("grayscale"); }}

(4)分別啟動用戶微服務和服務網關,在瀏覽器中輸入http://localhost:10001/server-user/user/get/1001,如下所示。

可以看到,通過服務網關正確訪問到了用戶微服務,并正確獲取到了用戶信息。

接下來,查看下服務網關的終端,發現已經成功輸出了如下信息。

開啟了灰度發布功能...

說明正確實現了自定義的局部過濾器。

全局過濾器

全局過濾器是一系列特殊的過濾器,會根據條件應用到所有路由中。

全局過濾器概述

在SpringCloud Gateway中內置了多種不同的全局過濾器,如下所示。

演示全局過濾器

(1)在服務網關模塊shop-gateway模塊下的io.binghe.shop.config包下新建GatewayFilterConfig類,并在類中配置幾個全局過濾器,如下所示。

/** * @author binghe * @version 1.0.0 * @description 網關過濾器配置 */@Configuration@Slf4jpublic class GatewayFilterConfig { @Bean @Order(-1) public GlobalFilter globalFilter() { return (exchange, chain) -> { log.info("執行前置過濾器邏輯"); return chain.filter(exchange).then(Mono.fromRunnable(() -> { log.info("執行后置過濾器邏輯"); })); }; }}

注意:@Order注解中的數字越小,執行的優先級越高。

(2)啟動用戶微服務與服務網關,在瀏覽器中訪問http://localhost:10001/server-user/user/get/1001,如下所示。

在服務網關終端輸出如下信息。

執行前置過濾器邏輯執行后置過濾器邏輯

說明我們演示的全局過濾器生效了。

自定義全局過濾器

SpringCloud Gateway內置了很多全局過濾器,一般情況下能夠滿足實際開發需要,但是對于某些特殊的業務場景,還是需要我們自己實現自定義全局過濾器。

這里,我們就模擬實現一個獲取客戶端訪問信息,并統計訪問接口時長的全局過濾器。

(1)在網關服務模塊shop-order的io.binghe.shop.filter包下,新建GlobalGatewayLogFilter類,實現org.springframework.cloud.gateway.filter.GlobalFilter接口和org.springframework.core.Ordered接口,代碼如下所示。

/** * @author binghe * @version 1.0.0 * @description 自定義全局過濾器,模擬實現獲取客戶端信息并統計接口訪問時長 */@Slf4j@Componentpublic class GlobalGatewayLogFilter implements GlobalFilter, Ordered { /** * 開始訪問時間 */ private static final String BEGIN_VISIT_TIME = "begin_visit_time"; @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { //先記錄下訪問接口的開始時間 exchange.getAttributes().put(BEGIN_VISIT_TIME, System.currentTimeMillis()); return chain.filter(exchange).then(Mono.fromRunnable(()->{ Long beginVisitTime = exchange.getAttribute(BEGIN_VISIT_TIME); if (beginVisitTime != null){ log.info("訪問接口主機: " + exchange.getRequest().getURI().getHost()); log.info("訪問接口端口: " + exchange.getRequest().getURI().getPort()); log.info("訪問接口URL: " + exchange.getRequest().getURI().getPath()); log.info("訪問接口URL參數: " + exchange.getRequest().getURI().getRawQuery()); log.info("訪問接口時長: " + (System.currentTimeMillis() - beginVisitTime) + "ms"); } })); } @Override public int getOrder() { return 0; }}

上述代碼的實現邏輯還是比較簡單的,這里就不再贅述了。

(2)啟動用戶微服務與網關服務,在瀏覽器中輸入http://localhost:10001/server-user/user/api/filter1?name=binghe,如下所示。

接下來,查看服務網關的終端日志,可以發現已經輸出了如下信息。

訪問接口主機: localhost訪問接口端口: 10001訪問接口URL: /server-user/user/api/filter1訪問接口URL參數: name=binghe訪問接口時長: 126ms

說明我們自定義的全局過濾器生效了。

關鍵詞: 網關服務 日期時間 正則表達式

上一篇:

下一篇:

X 關閉

X 關閉

久久国产精品一区二区三区四区,久色婷婷小香蕉久久,国产日韩欧美在线播放不卡,另类av一区二区
欧美日韩中文在线| 在线免费日韩片| 久久亚洲国产精品一区二区| 亚洲第一区在线| 亚洲欧美日韩一区二区三区在线观看| 在线不卡免费欧美| 欧美精品一区二区三区在线看午夜| 亚洲天堂成人在线视频| 欧美香蕉大胸在线视频观看| 欧美岛国在线观看| 国产一区av在线| 中日韩美女免费视频网站在线观看| 欧美成人性网| 国产精品综合久久久| 欧美韩日一区| 伊人久久大香线蕉综合热线| 国产日韩欧美夫妻视频在线观看| 亚洲一区在线视频| 国产麻豆精品theporn| 亚洲午夜久久久久久久久电影院| 最近中文字幕mv在线一区二区三区四区| 国产有码在线一区二区视频| 欧美视频网站| 一本久道久久久| 国产综合自拍| 国产自产2019最新不卡| 欧美体内she精视频| 黑人巨大精品欧美一区二区| 亚洲一区三区在线观看| 国产女优一区| 国产视频精品va久久久久久| 国产欧美一区二区精品仙草咪| 免费观看不卡av| 国产视频观看一区| 国产欧美日韩一级| 亚洲综合视频1区| 国产亚洲一区二区三区在线观看| 欧美日本二区| 欧美福利视频在线| 亚洲乱亚洲高清| 国产精品久久久久久久久免费| 亚洲高清色综合| 久久国产精品黑丝| 欧美影片第一页| 午夜精品久久久久久久久久久久| 国产精品盗摄久久久| 韩国女主播一区二区三区| 亚洲深夜av| 欧美紧缚bdsm在线视频| 久久福利电影| 亚洲欧洲中文日韩久久av乱码| 亚洲一区精品电影| 久久久国产亚洲精品| 欧美另类变人与禽xxxxx| 亚洲欧美日韩爽爽影院| 久久综合综合久久综合| 亚洲午夜小视频| 中日韩视频在线观看| 亚洲一区二区三区精品在线| 亚洲天堂av在线免费| 黄色成人av网站| 悠悠资源网久久精品| 亚洲精品国产精品久久清纯直播| 亚洲国产欧美精品| 亚洲视频久久| 国产综合色产在线精品| 亚洲肉体裸体xxxx137| 黑人中文字幕一区二区三区| 国产欧美一区二区三区在线看蜜臀| 国产伦精品一区二区| 国产精品一区免费观看| 蜜桃av噜噜一区二区三区| 久久精品99国产精品酒店日本| 国产精品成av人在线视午夜片| 欧美mv日韩mv国产网站app| 国产欧美一区二区三区国产幕精品| 欧美国产精品日韩| 91久久国产综合久久蜜月精品| 欧美另类综合| 国产日韩欧美高清| 国产婷婷一区二区| 久久久精品999| 国产综合婷婷| 免费成人高清视频| 国产精品久久久久免费a∨| 欧美伊人精品成人久久综合97| 亚洲国产欧洲综合997久久| 欧美色图五月天| 亚洲欧美国产三级| 午夜在线观看欧美| 欧美视频在线观看免费网址| 国产精品一区毛片| 国产精品久久久久久久久久尿| 久久精品视频一| 久久久噜噜噜久久久| 亚洲激情在线激情| 国产精品v亚洲精品v日韩精品| 欧美日韩在线一区二区| 午夜精品久久久久久久99黑人| 欧美日韩你懂的| 在线精品一区| 国产欧美日韩亚洲精品| 黄色亚洲大片免费在线观看| 亚洲免费小视频| 久久精品99久久香蕉国产色戒| 国产人久久人人人人爽| 久久人人九九| 免费看成人av| 国产亚洲精品一区二区| 欧美激情久久久久| 亚洲美女在线国产| 亚洲香蕉视频| 亚洲国产欧美另类丝袜| 亚洲欧美在线高清| 一卡二卡3卡四卡高清精品视频| 国产一区视频观看| 一本一本久久a久久精品牛牛影视| 欧美日韩美女一区二区| 国产精品免费一区二区三区在线观看| 性欧美xxxx视频在线观看| 久久精品中文字幕免费mv| 欧美xart系列高清| 欧美精品v日韩精品v韩国精品v| 亚洲毛片在线观看.| 国产精品一卡| 欧美午夜在线观看| 在线视频亚洲欧美| 久久不见久久见免费视频1| 亚洲欧美国产日韩中文字幕| 国产精品久久久久9999高清| 亚洲一区二区三区四区中文| 久久久噜噜噜久久中文字幕色伊伊| 欧美特黄一级| 久久激情视频久久| 校园春色国产精品| 中文亚洲视频在线| 国产精品va在线播放| 欧美国产欧美亚州国产日韩mv天天看完整| 欧美日韩国产在线观看| 亚洲精品综合精品自拍| 欧美激情影音先锋| 亚洲国产天堂久久综合| 亚洲黄色在线看| 亚洲精品中文字幕女同| 欧美黄色一区| 欧美岛国在线观看| 亚洲欧美日韩综合一区| 销魂美女一区二区三区视频在线| 国产精品亚洲综合| 国产精品视频免费观看| 亚洲一区精品电影| 久久精品72免费观看| 欧美激情a∨在线视频播放| 日韩视频在线你懂得| 欧美电影美腿模特1979在线看| 国产亚洲成精品久久| 国产精品国内视频| 欧美日韩在线视频首页| 欧美jizz19性欧美| 亚洲国产精品成人va在线观看| 黑人巨大精品欧美一区二区| 亚洲精品乱码| 欧美在线观看一二区| 亚洲一区二区三区精品在线| 裸体歌舞表演一区二区| 国产一区二区三区高清| 亚洲电影免费在线| 老牛嫩草一区二区三区日本| 欧美日产一区二区三区在线观看| 亚洲欧美日韩精品久久久| 国产亚洲午夜高清国产拍精品| 蜜桃久久av一区| 亚洲网站在线看| 西西裸体人体做爰大胆久久久| 欧美人与禽猛交乱配视频| 国模一区二区三区| 国产欧美一区二区在线观看| 老牛国产精品一区的观看方式| 亚洲电影有码| 久久国产精品久久国产精品| 亚洲国产小视频在线观看| 亚洲天堂免费在线观看视频| 国产亚洲福利社区一区| 亚洲成色999久久网站| 美女露胸一区二区三区| 欧美一区三区二区在线观看| 欧美激情中文字幕在线| 先锋影院在线亚洲| 欧美日韩成人一区| 久久精品中文字幕一区| 亚洲视频国产视频| 欧美日本在线视频| 一区二区三区高清视频在线观看| 久久精品亚洲乱码伦伦中文| 欧美精品成人一区二区在线观看| 国产精品日日摸夜夜添夜夜av| 日韩视频在线一区| 极品尤物一区二区三区| 香蕉久久精品日日躁夜夜躁| 麻豆freexxxx性91精品|