spring cloud gateway-predicated断言篇

spring cloud gateway介绍

1.简介

SpringCloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,1 它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式;2.向外暴漏一个统一的访问的端口
SpringCloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上最新高性能版本进行集成,仍然还是使用的Zuul 2.0之前的非Reactor模式的老版本。而为了提升网关的性能,SpringCloud Gateway是基于WebFlux框架实现的,而WebFlux框架底层则使用了高性能的Reactor模式通信框架Netty。
Spring Cloud Gateway 的目标,不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
提前声明:Spring Cloud Gateway 底层使用了高性能的通信框架Netty。

2.特征

SpringCloud官方,对SpringCloud Gateway 特征介绍如下:
(1)基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
(2)集成 Hystrix 断路器
(3)集成 Spring Cloud DiscoveryClient
(4)Predicates 和 Filters 作用于特定路由,易于编写的 Predicates 和 Filters
(5)具备一些网关的高级功能:动态路由、限流、路径重写

3.处理流程

客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。

简单讲就是请求过来后,跟据断言匹配到相应路由,在通过filters过滤器链,在将请求转发到相应的服务执行。

predicated使用

Predicate 就是为了实现一组匹配规则,方便让请求过来找到对应的 Route 进行处理,接下来我们接下 Spring Cloud GateWay 内置几种 Predicate 的使用。
内置的断言实现类
下面介绍几个常用的
4.1 Query Route Predicate(通过请求参数匹配)
Query Route Predicate 支持传入两个参数,一个是属性名一个为属性值,属性值可以是正则表达式。

配置
predicates:
-Query=smile

curl localhost:8080?smile=x&id=2
经过测试发现只要请求汇总带有 smile 参数即会匹配路由,不带 smile 参数则不会匹配。

还可以将 Query 的值以键值对的方式进行配置,这样在请求过来时会对属性值和正则进行匹配,匹配上才会走路由。
-Query=keep, pu.
curl localhost:8080?keep=pub
测试可以返回页面代码,将 keep 的属性值改为 pubx 再次访问就会报 404,证明路由需要匹配正则表达式才会进行路由。

4.2 通过请求方式匹配
可以通过是 POST、GET、PUT、DELETE 等不同的请求方式来进行路由。

配置
predicates:

  • Method=GET

4.3 通过请求路径匹配
Path Route Predicate 接收一个匹配路径的参数来判断是否走路由。

配置
predicates:
-Path=/foo/{segment}

如果请求路径符合要求,则此路由将匹配,例如:/foo/1 或者 /foo/bar。
使用 curl 测试,命令行输入:
curl http://localhost:8080/foo/1
curl http://localhost:8080/foo/xx
curl http://localhost:8080/boo/xx
经过测试第一和第二条命令可以正常获取到页面返回值,最后一个命令报404,证明路由是通过指定路由来匹配。

4.4 过请求 ip 地址进行匹配
spring:
cloud:
gateway:
routes:
- id: blog
uri: http://blog.yuqiyu.com
predicates:
- Host=**.yuqiyu.com

4.5 组合使用
predicates:

  • Host=**.foo.org
  • Path=/headers
  • Method=GET
  • Header=X-Request-Id, \d+
  • Query=foo, ba.
  • Query=baz
  • Cookie=chocolate, ch.p
    各种 Predicates 同时存在于同一个路由时,请求必须同时满足所有的条件才被这个路由匹配。

一个请求满足多个路由的断言条件时,请求只会被首个成功匹配的路由转发

自定义predicated

1.继承abstractRoutePredicatedFactory类

@Component
public class UserRoutePredicateFactory extends AbstractRoutePredicateFactory<UserRoutePredicateFactory.Config>{
    
    

    public UserRoutePredicateFactory() {
    
    
        super(Config.class);
    }

//    private static final String KEY_NAME="name2";
//
//    @Override
//    public List<String> shortcutFieldOrder() {
    
    
//        return Arrays.asList(KEY_NAME);
//    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
    
    
        return exchange -> {
    
    
            String username = exchange.getRequest().getQueryParams().getFirst("username");
            List<String> list = exchange.getRequest().getQueryParams().get("username");
            if(!StringUtils.isEmpty(username)&&list.get(0).equals("aaa")){
    
    
                return true;
            }else {
    
    
                return false;
            }
        };
    }

    public static class Config{
    
    
        private String name;

        public String getName() {
    
    
            return name;
        }

        public void setName(String name) {
    
    
            this.name = name;
        }
    }
}

2.配置

  • predicates:
    - Path=/gateway/**
    - Method=GET
    - User=username & password
    filters:
    - StripPrefix=1
    uri: http://localhost:8082

3.8082端口的类

@RestController
public class UserController {
    
    

    @GetMapping("user")
    public String test(@RequestParam("username") String username,@RequestParam("password") String password){
    
    
        return username+password;
    }
}

4.访问
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_42371621/article/details/109206225