背景
在微服务架构中,通常一个系统会被拆分为多个微服务,面对这么多微服务客户端应该如何去调用呢?如果没有其他更优方法,我们只能记录每个微服务对应的地址,分别去调用,但是这样会有很多的问题和潜在因素。
客户端多次请求不同的微服务,会增加客户端代码和配置的复杂性,维护成本比价高。
认证复杂,每个微服务可能存在不同的认证方式,客户端去调用,要去适配不同的认证,
存在跨域的请求,调用链有一定的相对复杂性(防火墙/浏览器不友好的协议)。
难以重构,随着项目的迭代,可能需要重新划分微服务
为了解决上面的问题,微服务引入了网关的概念,网关为微服务架构的系统提供简单、有效且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。
网关在微服务中的位置:
网关对比
Zuul1.0:Netflix开源的网关,使用Java开发,基于Servlet架构构建,便于二次开发。因为基于Servlet内部延迟严重,并发场景不友好,一个线程只能处理一次连接请求。
Zuul2.0:采用Netty实现异步非阻塞编程模型,一个CPU一个线程,能够处理所有的请求和响应,请求响应的生命周期通过事件和回调进行处理,减少线程数量,开销较小GateWay:是SpringCloud的一个全新的API网关项目,替换Zuul开发的网关服务,基于Spring5.0+SpringBoot2.0+WebFlux(基于性能的Reactor模式响应式通信框架Netty,异步阻塞模型)等技术开发,性能高于Zuul
Nginx+lua:性能要比上面的强很多,使用Nginx的反向代码和负载均衡实现对API服务器的负载均衡以及高可用,lua作为一款脚本语言,可以编写一些简单的逻辑,但是无法嵌入到微服务架构中Kong:基于OpenResty(Nginx+Lua模块)编写的高可用、易扩展的,性能高效且稳定,支持多个可用插件(限流、鉴权)等,开箱即可用,只支持HTTP协议,且二次开发扩展难,缺乏更易用的管理和配置方式GateWay
官方文档: