之前zuul 網關介紹。他有過濾器周期是四種,也是四種類型的過濾器。而gateway 只有倆種過濾器:“pre” 和 “post”。
- PRE: 這種過濾器在請求被路由之前調用。
- POST:這種過濾器在路由到微服務以后執行。
這倆種過濾器是不是很熟悉。其實和zuul的過濾器很像。
但是gateway 過濾器又可以分為倆種。GatewayFilter 與 GlobalFilter。
- GlobalFilter 全局過濾器
- GatewayFilter 將應用到單個路由或者一個分組的路由上。
還有內置的過濾器斷言機制。在上一篇已經做過介紹。本篇就不在介紹。
同樣全局過濾器也在上一篇列舉了全局過濾器的一種寫法,有興趣的同學可以回過頭看一下。
自定義過濾器
創建ServerGatewayFilter 類
package com.xian.cloud.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.core.Ordered;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* <Description>
*
* @author xianliru@100tal.com
* @version 1.0
* @createDate 2019/11/07 17:34
*/
@Slf4j
public class ServerGatewayFilter implements GatewayFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("ServerGatewayFilter filter ");
return chain.filter( exchange );
}
@Override
public int getOrder() {
return 0;
}
}
創建 GatewayRoutesConfiguration
package com.xian.cloud.filter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* <Description>
*
* @author xianliru@100tal.com
* @version 1.0
* @createDate 2019/11/08 09:45
*/
@Configuration
@Slf4j
public class GatewayRoutesConfiguration {
/**
* java 配置 server 服務路由
* @param builder
* @return
*/
@Bean
public RouteLocator routeLocator(RouteLocatorBuilder builder) {
log.info("ServerGatewayFilter filtet........");
return builder.routes()
.route(r ->
r.path("/server/**")
.filters(
f -> f.stripPrefix(1)
.filters(new ServerGatewayFilter())
)
.uri("lb://cloud-discovery-server")
)
.build();
}
}
啟動服務
gateway 服務日志打印
[2019-11-08 11:07:17.357] [] [] [] [] [INFO ] com.xian.cloud.filter.GatewayRoutesConfiguration - ServerGatewayFilter filtet........
命令行 curl http://localhost:9000/server/server/hello?name=tom 返回 hello tom age = 20
日志打印
[2019-11-08 11:08:09.966] [] [] [] [] [INFO ] com.xian.cloud.filter.AuthorizeFilter - AuthorizeFilter token 全局過濾器 token:null,uid:null
[2019-11-08 11:08:09.970] [] [] [] [] [INFO ] com.xian.cloud.filter.ServerGatewayFilter - ServerGatewayFilter filter
我們看到日志已經打印我們想看到的日志。
優先級
java配置方式與yml文件配置。java配置優先級更高。親測
整理 斷言 和 自定義過濾器
- 斷言 其實斷言的作用是不是要將請求路由到服務上,是不是符合條件。就像玩過山車危險游戲一樣,會有年齡,體重、病史的一些限制。
- 過濾器 就還是過山車的案例,你符合了條件。那么好,我要給你帶上安全帶等一些安全保護措施,才能讓你真正的玩耍。道理是相同的。
gateway 的斷言和過濾器提供如此豐富的內置斷言和過濾器。讓我們有非常豐富的組合模式,應對我們實際開發的場景。還可以根據具體的場景做一些特殊處理。
2.2.X版本 gateway 增加了類似於注冊中心的元數據。在gateway 配置一下元數據。帶着數據請求到下游服務。有興趣的同學可以去官網查看官方文檔。
如何喜歡可以關注分享本公眾號。
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。轉載請附帶公眾號二維碼