引言
书接上篇 微服务守护神-Sentinel-其他 ,讲完微服务守护神-Sentinel之后,接下来就是微服务门神-网关组件:Gateway
问题引入
小伙伴们都知道在微服务架构中,一个系统会被拆分为很多个微服务,每一个微服务都能对外提供接口,用户访问就如下图啦。
仔细观察,你就会发现这种设计,就会存在着诸多的问题:
-
客户端多次请求不同的微服务,增加客户端代码或配置编写的复杂性
-
认证复杂,每个服务都需要独立认证。
-
微服务做集群的情况下,客户端并没有负责均衡的功能
此时怎么办?怎么优雅解决掉这些问题呢?答案很简单,引入API网关。
API网关
所谓的API网关,就是指微系统的统一入口,它封装了应用程序的内部结构,为客户端提供统一服务,一些与业务本身功能无关的公共逻辑可以在这里实现,诸如认证、鉴权、监控、路由转发等等。
用上API网关后,上面的用户访问图变成这样了:
此时肯定有小伙伴会问:网关是如何知道微服务的地址?网关如何进行负载均衡?网关又怎么关联到具体的微服务?答案其实很简单,网关也可以作为一个微服务,启动时将自己的信息注册到注册中心并且拉取其他微服务的信息,拦截所有请求再通过事先配置好的路由规则找到真实的服务地址,再基于Ribbon负载均衡调用。
最终总结:1>请求分发 2>负载均衡 3>过滤拦截 4>网络隔离
常见网关
-
Nginx+lua
使用nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可用,lua是一种脚本语言,可以来编写一些简单的逻辑, nginx支持lua脚本
-
Kong
基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流、鉴权等等)可以开箱即用。 问题:只支持Http协议;二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。
-
Zuul
Netflix开源的网关,功能丰富,使用JAVA开发,易于二次开发 问题:缺乏管控,无法动态配置;依赖组件较多;处理Http请求依赖的是Web容器,性能不如Nginx,Spring Cloud Gateway
-
Gateway
Spring公司为了替换Zuul而开发的网关服务
注意:SpringCloud alibaba技术栈中并没有提供自己的网关,我们可以采用Spring Cloud Gateway来做网关
Gateway
Spring Cloud Gateway是Spring公司基于Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。它的目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控和限流。
优点:
-
性能强劲:是第一代网关Zuul的1.6倍
-
功能强大:内置了很多实用的功能,例如转发、监控、限流等
-
设计优雅,容易扩展
缺点:
-
其实现依赖Netty与WebFlux,不是传统的Servlet编程模型,学习成本高
-
不能将其部署在Tomcat、Jetty等Servlet容器里,只能打成jar包执行
-
需要Spring Boot 2.0及以上的版本,才支持
好,到这就可以来,大体了解Gateway网关就可以啦,下一篇,我们来看下Gateway怎么玩~一起期待。
看文字不过瘾可以切换视频版:SpringCloud Alibaba 极简入门