认识API网关

为了应对业务的细分以及高并发的挑战,微服务的架构被广泛使用,由于微服务架构中应用会被拆分成多个服务。
为了方便客户端对这些服务的调用于是引入了 API 的概念。今天我们就来看看API 网关的原理以及它是如何应用的。

API 网关的定义

网关一词最早出现在网络设备,比如两个相互独立的局域网之间通过路由器进行通信, 中间的路由被称之为网关。

落实在开发层面来说,就是客户端与微服务系统之间存在的网关。从业务层面来说,当客户端完成某个业务的时候,需要同时调用多个微服务。

从系统层面来说,任何一个应用系统如果需要被其他系统调用,就需要暴露 API,这些 API 代表着的功能点。这个聚合的方式有点像设计模式中的门面模式(Facade),它为外部的调用提供了一个统一的访问入口。

从客户端类型层面来说,为了屏蔽不同客户端调用差异也可以加入 API 网关。由于 API 网关所处的位置是客户端与微服务交界的地方,因此从功能上它还包括:路由,负载均衡,限流,缓存,日志,发布等等。

Spring Cloud Gateway 概念与定义

API 网关的定义中我们提到了为什么要使用 API 网关,是为了解决客户端对多个微服务进行访问的问题。
由于服务的切分导致一个操作需要同时调用多个服务,因此为这些服务的聚合提供一个统一的门面,这个门面就是 API 网关。
针对于 API 网关有很多的实现方式,例如:Zuul,Kong 等等。这里我们以及 Spring Cloud Gateway 为例展开给大家介绍其具体实现。
一般来说,API 网关对内将微服务进行集合,对外暴露的统一 URL 或者接口信息供客户端调用。

那么客户端是如何与微服务进行连接,并且进行沟通的,需要引入下面几个重要概念 。
①路由(Route):任何一个来自于客户端的请求都会经过路由,然后到对应的微服务中。
每个路由会有一个唯一的 ID 和对应的目的 URL。同时包含若干个断言(Predicate)和过滤器(Filter)。
②断言(Predicate):当客户端通过 Http Request 请求进入 Spring Cloud Gateway 的时候,断言会根据配置的路由规则,对 Http Request 请求进行断言匹配。
说白了就是进行一次或者多次 if 判断,如果匹配成功则进行下一步处理,否则断言失败直接返回错误信息。
③过滤器( Filter):简单来说就是对流经的请求进行过滤,或者说对其进行获取以及修改的操作。注意过滤器的功能是双向的,也就是对请求和响应都会进行修改处理 。
一般来说 Spring Cloud Gateway 中的过滤器有两种类型:Gateway Filter、Global Filter

Gateway Filter 用在单个路由和分组路由上。Global Filter 可以作用于所有路由,是一个全局的 Filter。

Spring Cloud Gateway 工作原理
说完了 Spring Cloud Gateway 定义和要素,再来看看其工作原理。总的来说是对客户端请求的处理过程。

认识API网关

图 1:Spring Cloud Gateway 处理请求流程图

如图 1 所示,当客户端向 Spring Cloud Gateway 发起请求,该请求会被 HttpWebHandlerAdapter 获取,并且对请求进行提取,从而组装成网关上下文。将组成的上下文信息传递到 DispatcherHandler 组件。DispatcherHandler 作为请求分发处理器,主要负责将请求分发到对应的处理器进行处理。这里请求的处理器包括 RoutePredicate HandlerMapping (路由断言处理映射器) 。 路由断言处理映射器用于路由的查找,以及找到 路由后返回对应的 FilteringWebHandler。 其负责组装 Filter 链表并执行过滤处理,之后再将请求转交给应用服务,应用服务处理完后,最后返回 Response 给客户端 。其中 FilteringWebHandler 处理请求的时候会交给 Filter 进行过滤的处理。这里需要注意的是由于 Filter 是双向的所以,当客户端请求服务的时候,会通过 Pre Filter 中的 Filter 处理请求。
当服务处理完请求以后返回客户端的时候,会通过 Post Filter 再进行一次处理。

总结

由于微服务的盛行,API 网关悄然兴起。针对 API 网关本身讲述了其存在的原因,它不仅提供了服务的门面,而且可以协调不同的系统之间的通讯以及服务不同的客户端接口。
针对 API 网关的定义和概念的解释,其实现了路由、过滤器、断言,针对不同的客户端请求可以路由到不同的微服务,以及其中几个组件是如何分工合作完成路由工作的。

上一篇:SQL优化器原理 - 查询优化器综述


下一篇:你真的需要用Kubernetes吗?