springCloud Gateway详解

springCloud Gateway

  • 网关核心功能是路由转发,因此不要有耗时操作在网关上处理,让请求快速转发到后端服务上。

  • 网关还能做统一的熔断、限流、认证、日志监控等

springCloud Gateway 核心

  • Route(路由): 路由是网关的基本构件,它由ID、目标URI、谓词集合和过滤器集合定义。如果聚合谓词为真,则匹配路由
  • Predicate(谓语、断言): 参照Java8的新特性Predicate,这允许开发人员匹配HTTP请求中的任何内容,比如头或参数。
  • Filter(过滤器): 可以在发送下游请求之前或之后修改请求和响应。

Predicate

145

时间相关

After Route Predicate : 	在指定时间之后的请求会匹配该路由。
Before Route Predicate: 	在指定时间之前的请求会匹配该路由。
Between Route Predicate:	在指定时间区间内的请求会匹配该路由。

例如:

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: ${service-url.user-service}
          predicates:
            - After=2019-09-24T16:30:00+08:00[Asia/Shanghai]
spring:
  cloud:
    gateway:
      routes:
        - id: before_route
          uri: ${service-url.user-service}
          predicates:
            - Between=2019-09-24T16:30:00+08:00[Asia/Shanghai], 2019-09-25T16:30:00+08:00[Asia/Shanghai]

Cookie Route Predicate : 带有指定Cookie的请求会匹配该路由。

例如:

spring:
  cloud:
    gateway:
      routes:
      - id: cookie_route
        uri: http://www.google.com
        predicates:
        - Cookie=cookiename, cookievalue
        
路由匹配请求存在cookie名为cookiename,cookie内容匹配cookievalue的,将请求转发到google。
例如发送 curl http://www.google.com --cookie "cookiename=cookievalue"就可以匹配该路由

Header相关

Header Route Predicate :  带有指定请求头的请求会匹配该路由。
Host Route Predicate   :  带有指定Host的请求会匹配该路由。

例如:

spring:
  cloud:
    gateway:
      routes:
      - id: header_route
        uri: http://www.google.com
        predicates:
        - Header=X-Request-Id, \d+
        
使用curl工具发送带有请求头为X-Request-Id:123的请求可以匹配该路由。
curl http://www.google.com -H "X-Request-Id:123" 
spring:
  cloud:
    gateway:
      routes:
        - id: host_route
          uri: http://www.google.com
          predicates:
            - Host=**.xzhongwei.com

使用curl工具发送带有请求头为Host:.xzhongwei.com的请求可以匹配该路由。
curl http://www.google.com -H "Host:www.xzhongwei.com" 

请求相关

Method Route Predicate : 发送指定方法的请求会匹配该路由。
Path Route Predicate   : 发送指定路径的请求会匹配该路由。
Query Route Predicate  : 带指定查询参数的请求可以匹配该路由。
RemoteAddr Route Predicate: 从指定远程地址发起的请求可以匹配该路由。
Weight Route Predicate : 使用权重来路由相应请求。

例如:

spring:
  cloud:
    gateway:
      routes:
      - id: method_route
        uri: ${service-url.user-service}
        predicates:
        - Method=GET

GET请求可以匹配该路由。
spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: ${service-url.user-service}/user/{id}
          predicates:
            - Path=/user/{id}
            
/user/{id}路径请求可以匹配该路由。例如http://localhost:9201/user/1
spring:
  cloud:
    gateway:
      routes:
      - id: query_route
        uri: ${service-url.user-service}/user/getByUsername
        predicates:
        - Query=username

发送带查询参数的请求可以匹配该路由。http://localhost:9201/user/getByUsername?username=xzw
spring:
  cloud:
    gateway:
      routes:
      - id: remoteaddr_route
        uri: ${service-url.user-service}
        predicates:
        - RemoteAddr=192.168.1.1/24
        
从192.168.1.1/24发起请求可以匹配该路由。
spring:
  cloud:
    gateway:
      routes:
      - id: weight_high
        uri: http://localhost:8201
        predicates:
        - Weight=group1, 8
      - id: weight_low
        uri: http://localhost:8202
        predicates:
        - Weight=group1, 2

使用权重来路由相应请求,以上表示有80%的请求会被路由到localhost:8201,20%会被路由到localhost:8202。

filter

  • 过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。过滤器可以限定作用在某些特定请求路径上。 Spring Cloud Gateway包含许多内置的GatewayFilter工厂。
  • GatewayFilter工厂同redicate工厂类似,都是在配置文件application.yml中配置,遵循了约定大于配置的思想。只需要在配置文件配置GatewayFilter Factory的名称,而不需要写全部的类名,比如AddRequestHeaderGatewayFilterFactory只需要在配置文件中写AddRequestHeader,而不是全部类名。
  • GlobalFilter 全局过滤器
  • GatewayFilter 将应用到单个路由或者一个分组的路由上。

GlobalFilter

146

GatewayFilter

147

spring:
  cloud:
    gateway:
      routes:
      - id: rewritepath_route
        uri: https://www.xzhongwei.com
        predicates:
        - Path=/foo/**
        filters:
        - RewritePath=/foo/(?<segment>.*), /$\{segment}

所有的/foo/**开始的路径都会命中配置的router,并执行过滤器的逻辑,在本案例中配置了RewritePath过滤器工厂,此工厂将/foo/(?.*)重写为{segment},然后转发到https://www.xzhongwei.com。

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×