zoukankan      html  css  js  c++  java
  • Spring Cloud gateway 三 自定义过滤器GatewayFilter

    之前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 配置一下元数据。带着数据请求到下游服务。有兴趣的同学可以去官网查看官方文档。

    如何喜欢可以关注分享本公众号。
    file

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。转载请附带公众号二维码

  • 相关阅读:
    糗事百科图片爬取
    Linux文件和目录常用命令
    复习
    Win7的快捷键
    开始运行中的快捷键
    TextBox客户端JS赋值 后台获取(转载)
    window.returnValue的用法
    input的readonly属性与TextBox的ReadOnly和Enabled属性区别
    剖析 ADO.NET 批处理更新
    关于C#多线程的WaitHandle
  • 原文地址:https://www.cnblogs.com/cloudxlr/p/11820638.html
Copyright © 2011-2022 走看看