Spring Cloud gateway 三 自定義過濾器GatewayFilter

以前zuul 網關介紹。他有過濾器週期是四種,也是四種類型的過濾器。而gateway 只有倆種過濾器:「pre」 和 「post」。java

  • PRE: 這種過濾器在請求被路由以前調用。
  • POST:這種過濾器在路由到微服務之後執行。

這倆種過濾器是否是很熟悉。其實和zuul的過濾器很像。react

可是gateway 過濾器又能夠分爲倆種。GatewayFilter 與 GlobalFilter。web

  • GlobalFilter 全局過濾器
  • GatewayFilter 將應用到單個路由或者一個分組的路由上。

還有內置的過濾器斷言機制。在上一篇已經作過介紹。本篇就不在介紹。spring

一樣全局過濾器也在上一篇列舉了全局過濾器的一種寫法,有興趣的同窗能夠回過頭看一下。安全

自定義過濾器

建立ServerGatewayFilter 類curl

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;
    }
}

建立 GatewayRoutesConfigurationide

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 = 20post

日誌打印ui

[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 配置一下元數據。帶着數據請求到下游服務。有興趣的同窗能夠去官網查看官方文檔。

如何喜歡能夠關注分享本公衆號。
file

相關文章
相關標籤/搜索