在微服务架构的系列文章中,前面已经经过文章《架构设计之「服务注册 」》介绍过了服务注册的原理和应用,今天这篇文章咱们来聊一聊「 API网关 」。后端
「 API网关 」是任何微服务架构的重要组成部分。有了它咱们能够在一个独立的模块上方便的处理一些非业务逻辑,可让微服务自己专一在自身特定的功能上,使得每一个微服务的开发更容易和更快速。安全
后面还会有文章继续介绍 配置中心、服务框架、服务监控、服务追踪、服务治理等。仍是那句话,只有将这些基础设施弄清楚了,微服务实践的道路才能走的稳、走的远。微信
为何作微服务的须要「 API网关 」呢?「 API网关 」到底有些啥功能呢?咱们之前项目结构比较简单的时候有用到过「 API网关 」概念的模块吗?架构
其实在咱们的项目曾经仍是单体应用的时候,虽然没有「 API网关 」的概念,可是通常在项目中都会用到filter/过滤器之类的东西,filter的做用就是把项目中的一些非业务逻辑的功能抽离出来独立处理,避免与业务逻辑混在一块儿增长代码复杂度。好比 鉴权认证功能、Session处理、安全检查、日志处理等等。负载均衡
如今咱们采用微服务架构了,在一个项目中微服务节点不少,若是让每个节点都去处理上面这些 “鉴权认证功能、Session处理、安全检查、日志处理等” 会多出不少冗余的代码,也会给增长业务代码的复杂度,所以咱们就须要有一个「 API网关 」把这些公共的功能独立出来成为一个服务来统一的处理这些事情。框架
咱们看一下下面这个微服务架构示意图:微服务
「 API网关 」就像是微服务的大门守卫同样,是连通外部客户端与内部微服务之间的一个桥梁。post
其主要功能有:性能
路由转发大数据
以前说了「API网关」是内部微服务的对外惟一入口,因此外面所有的请求都会先发到这个「API网关」上,而后由「API网关」来根据不一样的请求去路由到不一样的微服务节点上。例如能够 根据路径 来转发、也能够 根据参数 来转发。
而且因为内部微服务实例也会随着业务调整不停的变动,增长或者删除节点,「API网关」能够与「服务注册」模块进行协同工做,保证将外部请求转发到最合适的微服务实例上面去。
负载均衡
既然「API网关」是内部微服务的单一入口,因此「API网关」在收到外部请求以后,还能够根据内部微服务每一个实例的负荷状况进行动态的负载均衡调节。一旦内部的某个微服务实例负载很高,甚至是不能及时响应,则「API网关」就经过负载均衡策略减小或中止向这个实例转发请求。当全部的内部微服务实例都处理不过来的时候,「API网关」还能够采用限流或熔断的形式阻止外部请求,以保障整个系统的可用性。
安全认证
「API网关」就像是微服务的大门守卫,每个请求进来以后,都必须先在「API网关」上进行身份验证,身份验证经过后才转发给后面的服务,转发的时候通常也会带上身份信息。
同时「API网关」也须要对每个请求进行安全性检查,例如参数的安全性、传输的安全性等等。
日志记录
既然全部的请求都须要走「API网关」,那么咱们就能够在「API网关」上统一集中的记录下这些行为日志。这些日志既能够做为咱们后续事件查询使用,也能够做为系统的性能监控使用。
数据转换
由于「API网关」对外是面向多种不一样的客户端,不一样的客户端所传输的数据类型多是不同的。所以「API网关」还须要具有数据转换的功能,将不一样客户端传输进来的数据转换成同一种类型再转发给内部微服务上,这样,兼容了这些请求的多样性,保证了微服务的灵活性。
上面聊完了「为何须要API网关」,咱们再来看一下在实际项目中应该如何去应用。虽然咱们能够本身去开发一套「API网关」,可是若是没有特殊需求,仍是不建议重复造轮子了,市面上有不少成熟的方案能够直接使用,下面简单介绍一下 Zuul、Tyk、Kong三个比较热门的开源组件。
Zuul
Zuul 是由 Netflix 所开源的组件,基于JAVA技术栈开发的。
Zuul网关的使用热度很是高,而且也集成到了 Spring Cloud 全家桶中了,使用起来很是方便。
上图能够看到Zuul的一个简化结构,过滤器filter是整个Zuul的核心,分为前置过滤器(pre filter)、路由过滤器(routing filter)、后置过滤器(post filter)以及 错误过滤器(error filter)。
一个请求过来,会先执行全部的 pre filter,而后再经过 routing filter 将请求转发给后端服务,后端服务进行结果响应以后,再执行 post filter,最后再响应给客户端。在不一样的filter里面能够执行不一样的逻辑,好比安全检查、日志记录等等。
Tyk
Tyk是一个基于GO编写的,轻量级、快速可伸缩的开源的API网关。
能够经过下图简单了解一下Tyk的流程原理。
Kong
Kong是基于OpenResty技术栈的开源网关服务,所以其也是基于Nginx实现的。
Kong能够作到高性能、插件自定义、集群以及易于使用的Restful API管理。
以上,就是对微服务架构中「 服务网关」的一些思考。
码字不易啊,喜欢的话不妨转发朋友吧。😊
本文原创发布于微信公众号「 不止思考 」,欢迎关注。涉及 思惟认知、我的成长、架构、大数据、Web技术 等。