什么是网关(API Gateway)
在微服务架构里,服务被进一步的细粒化,各个服务都可以被独立的开发,设计,测试,管理。各个独立的单元可能被不同的开发者各种语言进行应用,这就要求必须使用一种语言和平 台无关的服务协议作为各个单元间的通讯方式。
API网关的定义
网关就是保护,增强,控制api服务的访问。api网关是处于应用程序和服务之前的系统。这样REST API服务接口就被网关保护起来,对所有的调用者透明。因此,隐藏在 API 网关后面的业务系统就可以专注于创建和管理服务,而不用去处理这些策略性的基础设施。
API网关的职能
1. 接入请求
作为所有API请求的接口
2.业务聚合
作为所有后台业务的聚合点
3.中介策略
实现安全,验证,路由,过滤,流控等策略
4.统一管理
对所有API服务和策略统一管理
Gateway是什么
Spring Cloud Gateway是Spring官方基于Spring 5.0,Spring Boot 2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式。Spring Cloud Gateway作为Spring Cloud生态系中的网关,目标是替代ZUUL,其不仅提供统一的路由方式,并且基于Filter链的方式提供了网关基本的功能,例如:安全,监控/埋点,和限流等。
(图片来自网络)
最重要的几个概念
路由、断言、过滤器
Route(路由):网关的基本构建模块。它由一个ID,一个URL,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
Predicate(断言):输入一个类型是ServerWebExchange。我们可以用它来匹配HTTP里面的任何内容。
拦截器(filter):Gateway中的Filter分为两种Filter类型,分别是Gateway Filter 和Global Filter。过滤器Filter会将请求和响应进行修改处理。
上述图片中,总结了常用网关的请求方式。那么如何配置:
匹配方式
- 通过时间匹配
spring:
cloud:
gateway:
routes:
- id: time_route
uri: http://ityouknow.com
predicates:
- After=2018-01-20T06:06:06+08:00[Asia/Shanghai]
Spring 是通过 ZonedDateTime 来对时间进行的对比,ZonedDateTime 是 Java 8 中日期时间功能里,用于表示带时区的日期与时间信息的类,ZonedDateTime 支持通过时区来设置时间,中国的时区是:Asia/Shanghai。
After Route Predicate 是指在这个时间之后的请求都转发到目标地址。上面的示例是指,请求时间在 2018 年 1 月 20 日 6 点 6 分 6 秒之后的所有请求都转发到地址http://ityouknow.com。+08:00是指时间和 UTC 时间相差八个小时,时间地区为Asia/Shanghai。
添加完路由规则之后,访问地址http://localhost:8080会自动转发到http://ityouknow.com。
2.通过请求路径匹配
spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://ityouknow.com
predicates:
- Path=/foo/{segment}
如果请求路径符合要求,则此路由将匹配,例如:/foo/1 或者 /foo/bar
3.通过请求 ip 地址进行匹配
Predicate 也支持通过设置某个 ip 区间号段的请求才会路由,RemoteAddr Route Predicate 接受 cidr 符号 (IPv4 或 IPv6) 字符串的列表(最小大小为 1),例如 192.168.0.1/16 (其中 192.168.0.1 是 IP 地址,16 是子网掩码)。
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: http://ityouknow.com
predicates:
- RemoteAddr=192.168.1.1/24
可以将此地址设置为本机的 ip 地址进行测试。
如果请求的远程地址是 192.168.1.10,则此路由将匹配。
当然也可以进行组合使用:
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]
各种 Predicates 同时存在于同一个路由时,请求必须同时满足所有的条件才被这个路由匹配。
转载至:
Gateway网关简介及使用
侵删!