API网关
◎ API网关的意义
◎ API网关的职责
◎ API网关的缺点
◎ 使用API网关认证身份
◎ API网关技术实战
网关的英文是Gateway,翻译为门、方法、通道、途径。API网关就是接口的通道或接口的大门。要想访问API,就必须通过API网关,为什么要有API网关,这样做有什么作用?带着这些问题,我们来学习本章的内容。
API网关的意义
API网关并没有引申含义,通俗来讲,它就是应用系统所有接口的唯一关卡,就像一道门,想要调用到接口,就必须从这扇门进入。为什么要有这样一道门?在微服务中,服务端被拆分成一组职责单一的微小服务,这样做的好处不再赘述。但我们的服务由少变多,必然会增加系统的复杂度。原先客户端只需关心与一个单体的服务交互即可,现在需要去了解每个服务的具体信息,包括认证规则、主机地址、集群方式等。即便拥有再完善的服务注册与发现机制,客户端也需要对后端服务的各个职责划分,才能知道哪个API应该调用哪个服务。在大型项目中,客户端往往需要花费巨大的工作量来集成这些后端。设想一下,在一个没有API网关的系统中,前后端调用关系如图5.1所示。
图5.1 没有API网关的系统中前后端的调用关系
复杂的调用关系让客户端难以维护,光看就觉得很乱。假设我们要开发移动端的代码,调用后端的服务,就需要维护与各个服务的调用关系。服务的个数一旦增加,如系统中有几十个,甚至上百个服务,关系维护起来将花费相当多的时间。最主要的是,前端根本不想关心这些问题,对于前端开发来讲,只想调用可用的接口,这本身是后端服务的架构逻辑,前端会因为这种架构模式变得异常复杂,而且这个复杂度会在每个客户端中重复出现。同时,认证规则无法复用,图5.1所示为一个商场系统,一般情况下,系统会根据不同的终端设计不同的用户认证规则,如PC端可以通过用户名密码的方式进行用户认证,移动端可以使用手机号加短信验证码的方式进行用户认证,第三方可以通过证书密钥等方式进行用户认证,那么这些认证方式通常都由后端服务来实现。如果客户端直接调用用户敏感的接口,这些接口所在的服务必须拥有认证的能力才行。换句话说,这些后端服务都需要实现多套用户认证的逻辑,并且还需要根据不同终端的请求使用不同的认证方式。为了使微服务更加通用,后端服务的代码中就必然会被耦合上一些客户端的判断逻辑,因而显得不够单纯,再者每个服务都存在着大量重复的认证逻辑,一旦有些客户端的认证方式发生变化,就需要去维护每个服务中的认证代码,如图5.2所示。
图5.2 服务端重复实现认证逻辑
前端收到后端架构的“污染”,职责增加,开发难度增大。当然,可能有不少系统都与图5.1所示的系统类似或更加简单,服务也就几个甚至更少,系统本身就只有一个客户端,或者根本没有做前后端分离,这样的系统调用链就很简单,客户端维护服务信息也很容易。即使这样仍然需要API网关,首先在生产环境中,服务都是多实例部署,以增加系统的可用度,一旦服务部署了多个实例,就需要有负载均衡的策略。在微服务架构中,一般都采用客户端负载均衡的方式。也就是说,需要前端来负责负载均衡,有了负载均衡,还需要考虑服务熔断、降级、恢复等情况,这些服务治理职责都将交由前端来承担,如图5.3所示。
图5.3 前端承担大量的服务治理职责
虽然如今前端的能力越来越强,一些框架也能够处理复杂的服务治理逻辑,但前端更应该关注用户的交互、数据的渲染等表现层的逻辑,而不应被后端的架构所影响,从而做很多不擅长或不应该负责的工作。API网关的出现就很好地解决了这些问题。首先,前端不再面对复杂的调用关系,只需请求API网关即可;其次,系统本身不需要重复地关心客户端的认证方式,可以将认证逻辑放到API网关来做;最后,服务管理的职责也和前端解耦,可以在API网关集成Spring CloudNetflix Hystrix等组件,就能轻松拥有相关的服务治理能力,API网关架构图如图5.4所示。
图5.4 API网关架构图
API网关起到了很好的前后端隔离作用,既保护后端服务不会掺杂前端的判断逻辑,也隔离前端与微服务治理相关的职责,通过统一的网关,对所有的请求进行转发、过滤和治理,早期我们在单体式架构中常用的Nginx也是一种API网关模式的实现。