Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。
路由Route:这是网关的基本构建块。它由一个ID,一个目标URL,一组断言,一组过滤器定义。如果断言为真,则路由匹配。
Predicate断言:输入类型是一个ServerWebExchange. 我们可以使用它来断言来自HTTP请求的任何内容
过滤器Fileter,Gateway中的Filter分为两种类型的Filter(全局过滤和普通过滤),分别是GatewayFilter和GlobalFilter。过滤器Filter将会对请求和响应进行修改处理。
1、路由:
spring: cloud: gateway: routes: - id: after_route #路由的ID,没有固定规则但要求唯一,简易配合服务名 uri: https://example.org ##(匹配后提供服务的路由地址 开发中多用 lb://服务名称,就是application-name) predicates: ##断言,路径相匹配的进行路由 -xxxx filters: #动态过滤器,此路由需要以下过滤器 -xxx
我本地gateway 的例子
spring:
cloud:
gateway:
routes:
# 认证中心
- id: city-open-auth
uri: lb://city-open-auth
predicates:
- Path=/auth/**
filters:
# 验证码处理
- CacheRequestFilter
- ValidateCodeFilter
- StripPrefix=1
# 系统模块
- id: city-open-system
uri: lb://city-open-system
predicates:
- Path=/system/**
filters:
- StripPrefix=1
2、 断言
大概有11个规则匹配
1、匹配在指定日期时间之后发生的请求 |
predicates: - After=2017-01-20T17:42:47.789-07:00[America/Denver] |
2、匹配发生在指定 之前的请求datetime |
predicates: - Before=2017-01-20T17:42:47.789-07:00[America/Denver] |
3、匹配发生在 之后datetime1 和之前的请求datetime2 |
- Between=2017-01-20T17:42:47.789-07:00[America/Denver], 2017-01-21T17:42:47.789-07:00[America/Denver] |
4、匹配具有给定名称且其值与正则表达式匹配的 cookie |
predicates: - Cookie=chocolate, ch.p |
5、接收 2 个参数,一个 header 中属性名称和一个正则表达式,这个属性值和正则表达式匹配则执行。 |
predicates: - Header=X-Request-Id, \d+ |
6、Host Route Predicate 接收一组参数,一组匹配的域名列表,这个模板是一个 ant 分隔的模板,用. 号作为分隔符。它通过参数中的主机地址作为匹配规则 |
predicates: - Host=**.somehost.org,**.anotherhost.org |
7、需要 可以通过是 POST、GET、PUT、DELETE 等不同的请求方式来进行路由。 |
predicates: - Method=GET,POST |
8、接收2个匹配路径的参数来判断是否走路由。 |
predicates: - Path=/red/{segment},/blue/{segment} |
9、支持传入两个参数,一个是属性名一个为属性值,属性值可以是正则表达式 |
predicates: - Query=smile |
10、如果请求包含red 其值与正则gree. 表达式匹配的查询参数,则前面的路由匹配,因此green 和greet 将匹配 |
predicates: - Query=red, gree. |
11、Predicate 也支持通过设置某个 ip 区间号段的请求才会路由,RemoteAddr Route Predicate 接受 cidr 符号 (IPv4 或 IPv6) 字符串的列表(最小大小为 1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子网掩码)。 |
predicates: - RemoteAddr=192.168.1.1/24 |
12、该 该路由会将约 80% 的流量转发到weighthigh.org,将约 20% 的流量转发到weightlow.org |
13、组合使用 |
spring: cloud: gateway: routes: - id: host_foo_path_headers_to_httpbin uri: http://ityouknow.com predicates: - Host=**.foo.org - Path=/headers - Method=GET - Header=X-Request-Id, \d+ - Query=foo, ba. - Query=baz - Cookie=chocolate, ch.p - After=2018-01-20T06:06:06+08:00[Asia/Shanghai] |
3、过滤
路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是特定的路由。Spring Cloud Gateway 包含许多内置的 GatewayFilter 工厂
具体的过滤请异步官网看下
主要说下自定义过滤
第一种:GatewayFilter factory (配置yml,毕竟约定大于配置)
需求一般在配置文件中配置,GatewayFilter,可以实现工厂,自定义过滤器工厂需要继承extend AbstractGatewayFilterFactory,
此类需要@Componment,在配置文件application.yml的gateway:routes:filter: 配置
配置文件内容在上面的路由介绍过了
第二种:GatewayFilter(application.yml中无法配置使用)
需要实现implements GatewayFilter,Ordered
Order越大 优先级越低
order越小 优先级越高
定义好MyFilter,其需要跟Router绑定使用,不能用application.yml文件配置
第三种:自定义GlobalFilter全局过滤
需要继承 实现GlobalFilter,ordered 加上@Componment
4、过滤器中的一个常见的知识点:
比如 配置文件中
spring: cloud: gateway: routes: -id: #唯一值 uri: lb://微服务名(好多种,具体地址也可以http://xxxx) predicaties: 断言:相对于正则匹配 请求 -path = /auth/** #path是断言的其中一种方式,匹配成功后会把路径加到uri后面,请求后端服务 filters: -CacheRequesFilter #自定义的过滤器 -Striprefix = 1 Striprefix 参数表示在将请求发送到下游之前从请求中剥离的路径个数
Gateway的路由方式和Nginx代理非常类似