三皇五帝时期,中原洪水泛滥,大禹率领民众,对洪水进行疏导,使每个水系都有各自的流向,最终完成了治水大业。
我在玩《穹之扉》水坝机关这里的时候,搞了好久才完成,每个机关控制各自水道的流向,最终只要每条水道流通就能完成了。
言归正传,在一个错综复杂的大型微服务系统里,各个服务间的 API 调用将是一个巨大的考验,每个调用者都得在记录每个微服务的地址再分别去调用,还有服务认证问题、跨域问题等等。
如果有一个类似于疏通水系的中间件,每个客户端调用都从它这里走,而它能够统一指挥调度请求的流向,那 API 请求的问题将会变得清晰、简单、高效!
网关就为此而生了。
网关还可以隐藏服务名称、限流以及许多其他有用的事情。
Spring Cloud Gateway
是网关的一种,它可精确控制 API 层,集成 Spring Cloud 服务发现和客户端负载均衡解决方案,以简化配置和维护。
Spring Cloud Gateway
不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如: 安全 , 监控 和 限流 。
Route
Route是网关的基础元素,表示一个具体的路由信息。当请求到达网关时,由 Gateway Handler Mapping 通过 断言
进行路由匹配,就是 Mapping , 当断言为真时,匹配的路由。
路由有以下几个部分组成:
id uri order predicate filter
前面说过,断言 predicate
是 Route 的组成部分之一。
Predicate 是 Java 8 中提供的一个函数:
Predicate 函数式接口的主要作用就是提供一个 test(T t)
方法,接受一个参数返回一个布尔类型,Predicate 在进行一些判断的时候非常常用。
在 Gateway 中,输入类型是 ServerWebExchange
,它可以让开发人员匹配来自 HTTP 的请求,比如 请求头
或者 请求参数
。简而言之,它就是匹配条件。
Filter
Filter
是 Gateway 中的过滤器,可以在请求发出的前后做一些业务上的处理。
将以上三个核心点连起来看,当用户发出请求到达 Gateway , Gateway 会通过一些匹配条件,定位到真正的服务节点,并在这个转发过程前后,进行一些及细化控制。其中 Predicate
就是我们匹配的条件,而 Filter
可以理解为一个拦截器,有了这两个点,再加上目标 uri
,就可以实现一个具体的路由了。
来看一下, Spring Cloud Gateway 的工作原理图:
客户端向 Spring Cloud Gateway 发出请求,如果请求与网关程序定义的路由匹配,则该请求就会被发送到网管 Web 处理程序,此时处理程序运行特定的请求过滤器链。
过滤器之间用虚线分开是因为过滤器可能会在发送代理请求的前后执行逻辑。所有 pre 过滤器的逻辑先执行,然后执行代理请求,代理请求完成后,执行 post 过滤器逻辑。
具体的执行流程:
HttpWebHandlerAdapter
进行提取组装成网关上下文;DispatcherHandler
,它负责将请求分发给 RoutePredicateHandlerMapping
;RoutePredicateHandlerMapping
负责路由查找,并根据路由断言判断路由是否可用;FilteringWebHandler
创建过滤器链并调用;