blog

Spring Cloud Gateway

流程图

gateway流程图

如果Gateway Handler Mapping发现请求匹配到了Route,会将请求发送到Gateway Web Handler。它会将请求发送到指定的过滤器链。所有的pre过滤器逻辑先执行,然后会生成代理请求,之后post过滤器逻辑执行

名词解释

配置路由断言和网关过滤器

配置断言和过滤器有两种方式,shortcut和fully expanded argument

shortcut配置

过滤器名称+等号(=)+以逗号分隔的参数

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - Cookie=mycookie,mycookievalue

fully expanded argument配置

包含name键和args键,arg键是用来配置predicate或过滤器的键值对

spring:
  cloud:
    gateway:
      routes:
      - id: after_route
        uri: https://example.org
        predicates:
        - name: Cookie
          args:
            name: mycookie
            regexp: mycookievalue

路由断言工厂(Route Predicate Factory)

Spring Cloud Gateway包含多个内建的路由断言工厂。多个路由断言工厂可以通过and联合在一起

Route Predicate Factory 参数个数 参数含义 作用 示例
After 1 datetime(javaZonedDateTime类型) 匹配在指定时间后发生的请求 After=2017-01-20T17:42:47.789-07:00[America/Denver]
Before 1 datetime(javaZonedDateTime类型) 匹配在指定时间前发生的请求 Before=2017-01-20T17:42:47.789-07:00[America/Denver]
Between 2 datetime1 datetime2 匹配在两个时间段内发生的请求 Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver]
Cookie 2 nameregexp(java正则表达式) 匹配cookies中包含给定的名称,且值需要与正则表达式匹配 Cookie=chocolate, ch.p(匹配请求包含名为chocolate的cookie,且值与ch.p表达式匹配)
Header 2 nameregexp(java正则表达式) 匹配header中包含给定的名称,且值需要与正则表达式匹配 Header=X-Request-Id, \d+(匹配请求头包含名称X-Request-Id,且值匹配\d+正则表达式)
Host 1 一组host名称的模式。模式为Ant类型模式,以.分隔 匹配HostHeader的值是否与给定的正则表达式匹配 Host=.somehost.org,.anotherhost.org(匹配包含Host请求头值为正则表达式的请求)
Method 1 ,分隔的HTTP方法名 匹配指定的请求方法 Method=GET,POST(匹配请求方法为GET或POST)
Path 2 SpringPathMatcher列表,以及一个可选的matchOptionalTrailingSeparator标志 匹配请求路径 Path=/foo/{segment},/bar/{segment}(如果请求路径为/foo/1/foo/bar/bar/baz则匹配)
Query 2 必须的param参数以及可选的regexp(java正则表达式) 匹配请求参数 Query=foo, ba.(匹配请求参数包含foo,且值匹配ba.正则表达式)
RemoteAddr 1 sources列表,值为IPv4或IPv6字符串,如192.168.0.1/16 匹配请求的远程地址 RemoteAddr=192.168.1.1/24
Weight 2 groupweight(整数) 每个分组会计算权重 Weight=group1, 8(80%的请求会转发到指定的uri)

网关过滤工厂(Gateway Filter Factory)

过滤器可以修改收到的HTTP请求和发出的HTTP响应

网关过滤工厂 参数个数 参数含义 作用 示例
AddRequestHeader 2 namevalue 添加指定name的header到请求中 AddRequestHeader=X-Request-Foo, Bar(向请求中添加X-Request-FooHeader,值为Bar
AddRequestParameter 2 namevalue 添加指定name的参数到请求中 AddRequestParameter=foo, bar(向请求参数中添加foo=bar
AddResponseHeader 2 namevalue 添加指定name的header到响应中 AddResponseHeader=X-Response-Foo, Bar(向响应中添加X-Response-FooHeader,值为Bar
DedupeResponseHeader 2 name(包含header名称的list,空格分隔)、strategy(可选,可选的值为RETAIN_FIRST(默认)、RETAIN_LASTRETAIN_UNIQUE 去掉重复的响应头 DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin(去掉响应头中Access-Control-Allow-CredentialsAccess-Control-Allow-Origin中重复的值,防止响应和网关重复增加)
Hystrix 1 namefallbackUri(当调用fallback时的操作) 向网关中增加断路器 Hystrix=myCommandName(将剩余的过滤器包装在HystrixCommand中,command name为myCommandName
PrefixPath 1 prefix 增加指定路径 PrefixPath=/mypath(如果请求调用/hello,则被发送到/mypath/hello
PreserveHostHeader 0   设置请求属性,路由过滤器通过它来判断是否需要发送原始host的header,而不是http客户端确定的host的header PreserveHostHeader
RequestRateLimiter n 可选的keyResolver(实现了KeyResolver接口的bean)、速率限制器特定的参数    
RedirectTo 2 statusurl 转发状态码为status,header中Location值为url RedirectTo=302, https://acme.org(发送状态码为302且 header中增加Location:https://acme.org执行重定向)
RemoveHopByHopHeadersFilter 0   移除转发的请求头  
RemoveRequestHeader 1 name 移除请求中指定的header RemoveRequestHeader=X-Request-Foo(发送前移除X-Request-Fooheader)
RemoveResponseHeader 1 name 移除响应中指定的header RemoveResponseHeader=X-Response-Foo(在返回网关客户端前移除X-Response-Fooheader)
RewritePath 2 regexpreplacement 使用正则表达式重写请求路径 RewritePath=/foo/(?<segment>.*), /$\{segment}(对于请求路径/foo/bar,会在下一步请求前将请求路径设置为/bar。需要注意的是:由于在yaml中,$需要使用$\替换)
RewriteResponseHeader 3 nameregexpreplacement 使用正则表达式重写响应header的值 RewriteResponseHeader=X-Response-Foo, , password=[^&]+, password=***(在完成请求后,对于header值/42?user=ford&password=omg!what&flag=true,会重写为/42?user=ford&password=***&flag=true
SaveSession 0   在转发调用前会强制执行WebSession::save操作 SaveSession
SecureHeaders 0   会增加一组header值  
SetPath 1 template 使用模板简单地设置请求路径 SetPath=/{segment}(对于请求路径/foo/bar,在执行后续请求时设置路径为/bar
SetResponseHeader 2 namevalue 替换指定的header的值为value SetResponseHeader=X-Response-Foo, Bar(如果响应包含headerX-Response-Foo:1234,则会替换为X-Response-Foo:Bar
SetStatus 1 status(必须是HttpStatus的有效值,可以为404或枚举值NOT_FOUND 设置响应状态 SetStatus=401(对任何情况,http响应状态都设置为401
StripPrefix 1 parts path中指定的部分数会在请求下发前被去除 StripPrefix=2(如果请求为/name/bar/foo,则请求路径会转换为/foo
Retry 4 retries(重试次数)、statuses(需要重试的http状态码,参考org.springframework.http.HttpStatus值)、methods(需要重试的http方法,参考org.springframework.http.HttpMethod)、series(需要重试的状态码序列,参考org.springframework.http.HttpStatus.Series 对指定的状态码等进行重试,并指定重试次数  

除了上边这些特定作用的过滤工厂外,也可以增加默认的过滤工厂。可以通过spring.cloud.gateway.default-filters来设置

spring:
  cloud:
    gateway:
      default-filters:
      - AddResponseHeader=X-Response-Default-Foo, Default-Bar
      - PrefixPath=/httpbin

全局过滤器