欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Spring Cloud Gateway

程序员文章站 2022-06-03 20:52:58
...
  1. Spring Cloud Gateway 核心概念

    路由(route):路由网关的基本构建块。它由一个 ID、一个目的 URI、一组谓词和一组过滤器定义。如果聚合谓词为真,则路由匹配。

    断言(predicate): java 8中的断言函数。Spring Cloud Gateway 中的断言函数输入类型是 Spring 5.0 框架中的 ServerWebExchange。Spring Cloud Gateway 中的断言函数允许开发者去定义匹配来自于 http request 中的任何信息,比如请求头和参数等

    过滤器(filter):一个标准的Spring webFilter。Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter.网关 Filter实例是由Spring 框架中的网关Filter的特殊工厂构造。request在转发到目前服务之前,response在返回到调用端之前都可以被修改或者自定义。

  2. Spring Cloud Gateway 的十大路由断言工厂

    uri 可以lb://开头(lb代表从注册中心获取服务),后面接的就是你需要转发到的服务名称

    1. After 路由断言工厂
      After Route Predicate Factory 中会取一个 UTC 时间格式的时间参数,当请求进来的时间在配置的 UTC 时间之后,则会匹配成功。
      spring:
      	cloud:
      		gateway:
      			routes:
      			- id: after_route
      				uri: http://baidu.com
      				predicates:
      				-  After=2019-05-02T22:30:15.854+8:00[Asia/Shanghai]
      
      # 其中 - After 的时间可以用以下代码生成
      # String time = ZonedDateTime.now().format(DateTimeFormatter.ISO_ZONED_DATE_TIME);
      
    2. Before 路由断言工厂
      Before Route Predicate Factory 中会取一个 UTC 时间格式的时间参数,当请求进来的时间在配置的 UTC 时间之前,则会匹配成功。
      spring:
         cloud:
         	gateway:
         		routes:
         		 - id: before_route
         			uri: http://baidu.com
         			predicates:
         			-  Before=2019-05-02T22:30:15.854+8:00[Asia/Shanghai]
      
    3. Between 路由断言工厂
      Between Route Predicate Factory 中会取一个 UTC 时间格式的时间参数,当请求进来的时间在配置的 UTC 时间之间,则会匹配成功。
      spring:
         cloud:
         	gateway:
         		routes:
         		- id: between_route
         			uri: http://baidu.com
         			predicates:
         			-  Between=  2019-05-02T22:30:15.854+8:00[Asia/Shanghai],  2019-05-03T22:30:15.854+8:00[Asia/Shanghai]
      
      # 或者
         			predicates:
         			-  name: Between
         				args:
         					datetimee1: 2019-05-02T22:30:15.854+8:00[Asia/Shanghai]
         					datetimee2: 2019-05-03T22:30:15.854+8:00[Asia/Shanghai]
      
    4. Cookie 路由断言工厂
      Cookie Route Predicate Factory 中会取两个参数——cookie名称对应的 key 和 value。当请求中携带的cookie 和 Cookied 断言工厂中配置的 cookie 一致,则路由匹配成功。
      spring:
         cloud:
         	gateway:
         		routes:
         		- id: cookie_route
         			uri: http://baidu.com
         			predicates:
         			-  Cookie=chocolate, ch.p
      
      # 当设置 Cookie 为 chocolate=ch.p,可以成功将请求转发。
      
    5. Header 路由断言工厂
      Header Route Predicate Factory 根据配置的 header 信息进行断言匹配路由,匹配成功进行转发。
      spring:
         cloud:
         	gateway:
         		routes:
         		- id: header_route
         			uri: http://baidu.com
         			predicates:
         			-  Header=X-Request-Id, xujin
      
      # 当设置 Cookie 为 chocolate=ch.p,可以成功将请求转发。
      # 或者匹配正则表达式 - Header=X-Request-Id, \d+
      
    6. Host 路由断言工厂
      Host Route Predicate Factory 根据配置的 Host,对请求中的 Host 进行断言处理,断言成功进行转发。
      spring:
         cloud:
         	gateway:
         		routes:
         		- id: host_route
         			uri: http://baidu.com
         			predicates:
         			-  Host=**.baidu.com:Gateway 的端口
      
      # 并设置 hosts 设置本地的二级域名 vip.baidu.com 来解析到本地 ip 127.0.0.1
      
    7. Method 路由断言工厂
      Method Route Predicate Factory 接受一个参数:HTTP方法来匹配。
      spring:
         cloud:
         	gateway:
         		routes:
         		- id: method_route
         			uri: http://baidu.com
         			predicates:
         			-  Method=GET
      
    8. Path 路由断言工厂
      Path Route Predicate Factory 接受一个参数:采用Spring PathMatcher 模式。
      spring:
         cloud:
         	gateway:
         		routes:
         		- id: method_route
         			uri: http://baidu.com
         			predicates:
         			- Path=/foo/{segment}
      # 这个路径将匹配,例如:/foo/1或/foo/bar。
      # 或者可以使用/foo/**,匹配已foo为前缀的路径
      
    9. Query 路由断言工厂
      Query Route Predicate Factory 接受两个参数:一个必需的参数(param)和一个可选的表达式(regexp)。
      spring:
         cloud:
         	gateway:
         		routes:
         		- id: query_route
         			uri: http://baidu.com
         			predicates:
         			-  Query=foo, baz
      # 匹配 foo=baz
      # 或者 - Query=foo 匹配如果请求包含一个 foo 查询参数。
      
    10. RemoteAddr 路由断言工厂
      RemoteAddr Route Predicate Factory 配置一个 IPv4 或 IPv6 网段的字符串或者 IP,当请求 IP 地址在网段之内或者和配置的 IP 相同,则表示匹配成功进行转发。例如 192.168.0.1/16 是一个网段,其中 192.168.0.1 是 IP 地址,16 是子网掩码(可匹配 192.168.0.10),也可以直接配置一个 IP。
      spring:
         cloud:
         	gateway:
         		routes:
         		- id: method_route
         			uri: http://baidu.com
         			predicates:
         			- RemoteAddr=127.0.0.1
      
  3. Filter 过滤器