一、API网关起到的作用
API网关(API Gateway)不是一个开源组件,而是一种架构模式,它是将一些服务共有的功能整合在一起,独立部署为单独的一层,用来解决一些服务治理的问题。你可以把它看作系统的边界,它可以对出入系统的流量做统一的管控
1.入口网关
部署在负载均衡服务器和应用服务器之间
- 它提供客户端一个统一的接入地址,API网关可以将用户的请求动态路由到不同的业务服务上,并且做一些必要的协议转换工作。在你的系统中,你部署的微服务对外暴露的协议可能不同: 有些提供的是HTTP服务;有些已经完成RPC改造,对外暴露RPC服务。API网关可以对客户端屏蔽这些服务的部署地址以及协议的细节,给客户端的调用带来很大的便捷。
- 在API网关中,我们可以植入一些服务治理的策略,比如服务的熔断、降级、流量控制和分流等等
- 客户端的认证和授权的实现,也可以放在API网关中。不同类型的客户端使用的认证方式是不同的,这些认证方式在API网关上可以得到统一处理,应用服务不需要了解认证的细节。
- API网关还可以做一些与黑白名单相关的事情,比如针对设备ID、用户IP、用户ID等维度的黑白名单。
- API网关中也可以做一些日志记录的事情,比如记录HTTP请求的访问日志。
2.出口网关
系统开发中,会依赖很多外部的第三方系统,比如第三方账户登录、使用第三方工具支付等等。我们可以在应用服务器和第三方系统之间,部署出口网关,在出口网关中,对调用外部的API做统一的认证、授权、审计以及访问控制。
二、API网关要如何实现
API网关中执行的动作有些是可以预先定义好的,比如黑白名单的设置,接口动态路由;有些则是需要业务方依据自身业务来定义,API网关的设计要注意扩展性, 也就是你可以随时在网关的执行链路上增加一些逻辑,也可以随时下掉一些逻辑(也就是所谓的热插拔)
Zuul就是采用责任链模式, Zuul1中将filter定义为三类:pre routing filter(路由前过滤器)、routing filter(路由过滤器)和after routing filter(路由后过滤器)。每一个filter定义了执行的顺序,在filter注册时,会按照顺序插入到filter chain(过滤器链)中。这样Zuul在接收到请求时,就会按照顺序依次执行插入到filter chain中的filter了。
- Kong是在Nginx中运行的Lua程序。得益于Nginx的性能优势,Kong相比于其它的开源API网关来说,性能方面是最好的。由于大中型公司对于Nginx运维能力都比较强,所以选择Kong作为API网关,无论是在性能还是在运维的把控力上,都是比较好的选择;
- Zuul是Spring Cloud全家桶中的成员,如果你已经使用了Spring Cloud中的其他组件,那么也可以考虑使用Zuul和它们无缝集成。不过,Zuul1因为采用同步阻塞模型,所以在性能上并不是很高效,而Zuul2推出时间不长,难免会有坑。但是Zuul的代码简单易懂,可以很好地把控,并且你的系统的量级很可能达不到Netfix这样的级别,所以对于Java技术栈的团队,使用Zuul也是一个不错的选择;
- Tyk是一种Go语言实现的轻量级API网关,有着丰富的插件资源,对于Go语言栈的团队来说,也是一种不错的选择
在引入了API网关之后,我们的系统架构就变成了下面这样