javascript
gateway中的局部过滤器_Spring Cloud Gateway中的过滤器工厂:重试过滤器
Spring Cloud Gateway基于Spring Boot 2,是Spring Cloud的全新項(xiàng)目,該項(xiàng)目提供了一個(gè)構(gòu)建在Spring 生態(tài)之上的API網(wǎng)關(guān)。本文基于的Spring Cloud版本為Finchley M9,Spring Cloud Gateway對(duì)應(yīng)的版本為2.0.0.RC1。
Spring Cloud Gateway入門一文介紹了全新的Spring Cloud Gateway的一些基礎(chǔ)應(yīng)用。本文將會(huì)介紹Spring Cloud Gateway重試過(guò)濾器。
過(guò)濾器
GatewayFilter網(wǎng)關(guān)過(guò)濾器用于攔截和鏈?zhǔn)教幚韜eb請(qǐng)求,可以實(shí)現(xiàn)橫切的、與應(yīng)用無(wú)關(guān)的需求,比如安全、訪問(wèn)超時(shí)的設(shè)定等等。
public interface GatewayFilter {
Mono filter(ServerWebExchange exchange, GatewayFilterChain chain);
}
接口中定義了唯一的方法#filter,處理web請(qǐng)求,并且可以通過(guò)給定的過(guò)濾器鏈傳遞到下一個(gè)過(guò)濾器。該接口有多個(gè)實(shí)現(xiàn)類,下面看一下該接口的類圖。
從類圖可以看到,GatewayFilter有兩個(gè)實(shí)現(xiàn)類,但是在源碼中尋找該接口的用法會(huì)發(fā)現(xiàn),在GatewayFilterFactory實(shí)現(xiàn)類中有內(nèi)部匿名類,實(shí)際是返回了一個(gè) GatewayFilter 內(nèi)部實(shí)現(xiàn)類。
Spring Cloud Gateway提供了很多種類的過(guò)濾器工廠,網(wǎng)關(guān)過(guò)濾器有近二十個(gè)實(shí)現(xiàn)類,總得說(shuō)來(lái)可以分為七類:Header、Parameter、Path、Status、Redirect跳轉(zhuǎn)、Hystrix熔斷和RateLimiter限流等。
重試過(guò)濾器
請(qǐng)求的重試
當(dāng)轉(zhuǎn)發(fā)到代理服務(wù)時(shí),遇到指定的服務(wù)端Error,如httpStatus為500時(shí),我們可以設(shè)定重試幾次。除了對(duì)指定的異常重試之外,還可以指定請(qǐng)求的方法,GET或POST。
實(shí)驗(yàn)場(chǎng)景涉及到:網(wǎng)關(guān)服務(wù)和用戶服務(wù)。客戶端請(qǐng)求經(jīng)過(guò)網(wǎng)關(guān),請(qǐng)求用戶服務(wù)的API接口,遇到指定的異常時(shí),進(jìn)行重試。
項(xiàng)目準(zhǔn)備
示例啟動(dòng)兩個(gè)服務(wù):Gateway-Server和user-Server。模擬的場(chǎng)景是,客戶端請(qǐng)求后端服務(wù),網(wǎng)關(guān)提供后端服務(wù)的統(tǒng)一入口。后端的服務(wù)都注冊(cè)到服務(wù)發(fā)現(xiàn)Consul(搭建zk,Eureka都可以,筆者比較習(xí)慣使用consul)。網(wǎng)關(guān)通過(guò)負(fù)載均衡轉(zhuǎn)發(fā)到具體的后端服務(wù)。
用戶服務(wù)
用戶服務(wù)注冊(cè)到Consul上,并提供一個(gè)接口/test。
網(wǎng)關(guān)服務(wù)
引入網(wǎng)關(guān)的依賴,并進(jìn)行相應(yīng)配置。上一章已經(jīng)講過(guò),這里不重復(fù)列出代碼,具體見(jiàn)源碼。
服務(wù)改造
網(wǎng)關(guān)服務(wù)
網(wǎng)關(guān)服務(wù)中,新增一個(gè)路由的定義retry_java,請(qǐng)求的判定是路徑以/test為前綴的請(qǐng)求,并將請(qǐng)求轉(zhuǎn)發(fā)到user服務(wù)。當(dāng)遇到內(nèi)部服務(wù)錯(cuò)誤(狀態(tài)碼為500)時(shí),設(shè)定重試的次數(shù)為2。當(dāng)然該路由也可以通過(guò)網(wǎng)關(guān)服務(wù)的配置文件,效果是一樣的。
@Bean
public RouteLocator retryRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("retry_java", r -> r.path("/test/**")
.filters(f -> f.stripPrefix(1)
.retry(config -> config.setRetries(2).setStatuses(HttpStatus.INTERNAL_SERVER_ERROR)))
.uri("lb://user"))
.build();
}
用戶服務(wù)
用戶服務(wù)增加一個(gè)API接口,請(qǐng)求中傳入?yún)?shù)key和count。
ConcurrentHashMap map = new ConcurrentHashMap<>();
@GetMapping("/exception")
public String testException(@RequestParam("key") String key, @RequestParam(name = "count", defaultValue = "3") int count) {
AtomicInteger num = map.computeIfAbsent(key, s -> new AtomicInteger());
int i = num.incrementAndGet();
log.warn("Retry count: "+i);
if (i < count) {
throw new RuntimeException("temporarily broken");
}
return String.valueOf(i);
}
這里主要是為了能配置網(wǎng)關(guān)請(qǐng)求次數(shù)的演示,count是指定的重試次數(shù),默認(rèn)為3,第一次和第二次都會(huì)拋出運(yùn)行時(shí)異常(狀態(tài)碼為500),變量 i 是key對(duì)應(yīng)的值,初始為0,每重試一次,i 會(huì)遞增,直到 i 大于等于count的值。
測(cè)試結(jié)果
根據(jù)上面的實(shí)現(xiàn),我們?cè)L問(wèn)的地址為http://localhost:9090/test/exception?key=abc&count=2。
按照用戶服務(wù)實(shí)現(xiàn)的邏輯,用戶服務(wù)將會(huì)重試一次即可成功。用戶服務(wù)的控制臺(tái)日志信息如下:
Retry count: 1
java.lang.IllegalArgumentException: temporarily broken] with root cause
...
Retry count: 2
控制臺(tái)的信息和最后的響應(yīng)結(jié)果可以看出,請(qǐng)求的重試執(zhí)行成功。
小結(jié)
本文在Spring Cloud Gateway入門的基礎(chǔ)上,介紹了Spring Cloud Gateway的過(guò)濾器相關(guān)概念,并具體介紹了其中的一個(gè)過(guò)濾器工廠:RetryGatewayFilterFactory。當(dāng)轉(zhuǎn)發(fā)到代理服務(wù)時(shí),遇到指定的服務(wù)端Error,如httpStatus為500時(shí),我們可以設(shè)定重試幾次,應(yīng)用重試過(guò)濾器。Spring Cloud Gateway提供了很多過(guò)濾器工廠的實(shí)現(xiàn),后面文章將會(huì)介紹其中比較重要的過(guò)濾器,敬請(qǐng)關(guān)注。
源碼地址
訂閱最新文章,歡迎關(guān)注我的公眾號(hào)
參考
Spring Cloud Gateway官方文檔
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的gateway中的局部过滤器_Spring Cloud Gateway中的过滤器工厂:重试过滤器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python动态绘图并保留之前绘图_[转
- 下一篇: mysql 5.7 启动脚本_MySQL