目录
- gateway是什么?
- 特点
- 词汇表
- gateway是如何工作的呢?
- 路由谓词工厂
- GatewayFilter工厂
- -AddRequestHeader
- -AddRequestParameter
- -AddResponseHeader
- -DedupeResponseHeader
- - Hystrix
- - CircuitBreaker
- - RewritePath
- FallbackHeaders
- - MapRequestHeader
- - PrefixPath=/mypath
- - PreserveHostHeader
- - RedirectTo=302, https://acme.org
- - RemoveRequestHeader=X-Request-Foo
- - RemoveResponseHeader=X-Response-Foo
- - RemoveRequestParameter=red
- - RewritePath=/red(?/?.*), $\{segment}
- - RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,
- - RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***
- - SaveSession
- - SetPath=/{segment}
- - SetRequestHeader=foo, bar-{segment}
- - SetResponseHeader=foo, bar-{segment}
- - SetStatus=401
- - StripPrefix=2
- - name: RequestSize
- - name: SetRequestHostHeader
- 个人实践
- 总结
gateway是什么?
该项目提供了一个库,用于在 Spring WebFlux 之上构建 API 网关。Spring Cloud Gateway 旨在提供一种简单而有效的方式来路由到 API,并为它们提供横切关注点,例如:安全性、监控/指标和弹性。
特点
- 基于 Spring Framework 5、Project Reactor 和 Spring Boot 2.0 构建。
- 能够匹配任何请求属性的路由。
- 谓词和过滤器特定于路由。
- 断路器集成。
- Spring Cloud Discovery客户端集成。
- 易于编写谓词和过滤器。
- 请求速率限制。
- 路径重写。
词汇表
Route:网关的基本构建块。它由 ID、目标 URI、谓词集合和过滤器集合定义。如果聚合谓词为真,则匹配路由。
谓词:这是一个Java 8 函数谓词。输入类型是Spring FrameworkServerWebExchange。这使您可以匹配来自 HTTP 请求的任何内容,例如标头或参数。
过滤器GatewayFilter:这些是使用特定工厂构建的实例。在这里,您可以在发送下游请求之前或之后修改请求和响应。
gateway是如何工作的呢?
- Gateway 接收客户端请求。
- 请求与 Predicate 进行匹配,获得到对应的 Route。匹配成功后,才能继续往下执行。
- 请求经过 Filter 过滤器链,执行前置(prev)处理逻辑。例如说,修改请求头信息等。
- 请求被 Proxy Filter 转发至目标 URI,并最终获得响应。一般来说,目标 URI 是被代理的微服务,如果是在 Spring Cloud 架构中。
- 响应经过 Filter 过滤器链,执行后置(post)处理逻辑。
- Gateway 返回响应给客户端。
路由谓词工厂
after_route
before_route
between_route
cookie_route
header_route
host_route
method_route
path_route
spring:
cloud:
gateway:
routes:
- id: path_route
uri: https://example.org
predicates:
- Path=/red/{segment},/blue/{segment}
query_route
remoteaddr_route
weight_high
GatewayFilter工厂
-AddRequestHeader
-AddRequestParameter
-AddResponseHeader
-DedupeResponseHeader
- Hystrix
- CircuitBreaker
- RewritePath
spring:
cloud:
gateway:
routes:
- id: rewritepath_route
uri: https://example.org
predicates:
- Path=/red/**
filters:
- RewritePath=/red(?<segment>/?.*), $\{segment}
对于 的请求路径/red/blue,这会将路径设置为/blue在发出下游请求之前。请注意,由于 YAML 规范,$ 应将其替换为 $\。
FallbackHeaders
- MapRequestHeader
- PrefixPath=/mypath
/mypath这将作为所有匹配请求路径的前缀。因此,/hello将向 发送请求/mypath/hello
- PreserveHostHeader
- RedirectTo=302, https://acme.org
- RemoveRequestHeader=X-Request-Foo
这会在将X-Request-Foo标头发送到下游之前将其删除。
- RemoveResponseHeader=X-Response-Foo
这将X-Response-Foo在返回给网关客户端之前从响应中删除标头。
- RemoveRequestParameter=red
这将在将red参数发送到下游之前将其删除。
- RewritePath=/red(?/?.*), ${segment}
对于 的请求路径/red/blue,这会将路径设置为/blue在发出下游请求之前。请注意,由于 YAML 规范, 应 将 其 替 换 为 。 应将其替换为。 应将其替换为。\
- RewriteLocationResponseHeader=AS_IN_REQUEST, Location, ,
- RewriteResponseHeader=X-Response-Red, , password=[^&]+, password=***
- SaveSession
- SetPath=/{segment}
对于 的请求路径/red/blue,这会将路径设置为/blue在发出下游请求之前。
- SetRequestHeader=foo, bar-{segment}
- SetResponseHeader=foo, bar-{segment}
- SetStatus=401
- StripPrefix=2
spring:
cloud:
gateway:
routes:
- id: nameRoot
uri: https://nameservice
predicates:
- Path=/name/**
filters:
- StripPrefix=2
当通过网关向发出请求时/name/blue/red,向 发出的请求nameservice看起来像nameservice/red。
- name: RequestSize
args:
maxSize: 5000000
- name: SetRequestHostHeader
args:
host: example.org
针对于上面每个谓词及过滤器,大家可以针对官网进行学习了解。
个人实践
application.yml文件
server:
port: 7001
spring:
cloud:
gateway:
routes: # 路由配置项,对应RouteDefinition数组
- id: api_route #路由的编号
uri: lb://apis-service #路由到的目标地址
predicates: #断言,谓词,作为路由的匹配条件,对应RouteDefinition数组
- Path=/**
filters: #过滤器,对请求进行拦截,实现自定义的功能,对应FilterDefinition数组
- StripPrefix=0
- id: oschina #路由的编号
uri: https://www.oschina.net #路由到的目标地址
predicates: #断言,谓词,作为路由的匹配条件,对应RouteDefinition数组
- Path=/oschina
filters: #过滤器,对请求进行拦截,实现自定义的功能,对应FilterDefinition数组
- StripPrefix=1
用配置文件中第二个 -id 进行举例说明,浏览器输入:http://localhost:7001/oschina,直接路由到 :https://www.oschina.net
注:① 如果配置多个 -id,这里有一点需要注意的,他们有一个执行顺序,从上至下执行,如果你的服务有先后顺序一定要注意。
② 配置文件中的路由 uri,可不要写成url。要不然导致项目起不来哦。
在这里插入代码片
总结
所学即所得,大家可以参考 官网 进行学习。
参考:芋道 Spring Cloud 网关 Spring Cloud Gateway 入门