网关基础知识小结
# 网关基础知识小结
# 什么是网关?
网关是一种用于构建微服务架构的重要组件,可以提供路由、转换、过滤、安全性等功能。API 网关可以作为微服务架构中所有请求的入口,它可以将来自客户端的请求路由到正确的服务实例,并将返回的结果转换为客户端所需的格式。简单来说,网关主要做了两件事:请求转发 + 请求过滤。统一去处理某一些事。
# 为什么需要网关?
因为在微服务背景下,一个系统会被拆分为多个服务,但是像安全认证,流量控制,日志,监控等功能是每个服务都需要的,没有网关的话,我们就需要在每个服务中单独实现,这会使得我们需要做很多重复的事情并且没有一个全局的视图来统一管理这些功能。而网关可以帮助微服务架构实现服务之间的解耦、协议转换、安全控制、负载均衡和监控统计等功能,从而提高系统的可用性、性能和安全性。
# 网关能提供哪些功能?
绝大部分网关可以提供下面这些功能:
- 路由转发功能:路由是微服务网关的核心能力。通过路由功能微服务网关可以将请求转发到目标微服务。在微服务架构中,网关可以结合注册中心的动态服务发现,实现对后端服务的发现,调用方只需要知道网关对外暴露的服务API就可以透明地访问后端微服务。
- 负载均衡:根据各个微服务实例的负载情况或者具体的负载均衡策略配置对请求实现动态的负载均衡。
- 安全认证:对用户请求进行身份验证并仅允许可信客户端访问 API,并且还能够使用类似 RBAC 等方式来授权。
- 参数校验:支持参数映射与校验逻辑。
- 日志记录:记录所有请求的行为日志供后续使用。
- 监控告警:从业务指标、机器指标、JVM 指标等方面进行监控并提供配套的告警机制。
- 流量控制:对请求的流量进行控制,也就是限制某一时刻内的请求数。
- 熔断降级:实时监控请求的统计信息,达到配置的失败阈值后,自动熔断,返回默认值。
- 响应缓存:当用户请求获取的是一些静态的或更新不频繁的数据时,一段时间内多次请求获取到的数据很可能是一样的。对于这种情况可以将响应缓存起来。这样用户请求可以直接在网关层得到响应数据,无需再去访问业务服务,减轻业务服务的负担。
- 响应聚合:某些情况下用户请求要获取的响应内容可能会来自于多个业务服务。网关作为业务服务的调用方,可以把多个服务的响应整合起来,再一并返回给用户。
- 灰度发布:将请求动态分流到不同的服务版本(最基本的一种灰度发布)。
- 异常处理:对于业务服务返回的异常响应,可以在网关层在返回给用户之前做转换处理。这样可以把一些业务侧返回的异常细节隐藏,转换成用户友好的错误提示返回。
- API 文档: 如果计划将 API 暴露给组织以外的开发人员,那么必须考虑使用 API 文档,例如 Swagger 或 OpenAPI。
- 协议转换:通过协议转换整合后台基于 REST、AMQP、Dubbo 等不同风格和实现技术的微服务,面向 Web Mobile、开放平台等特定客户端提供统一服务。
下图来源于百亿规模 API 网关服务 Shepherd 的设计与实现 - 美团技术团队 - 2021open in new window (opens new window)这篇文章。
# 常见的网关系统
# 1. Netflix Zuul
Zuul 是 Netflix 开发的一款提供动态路由、监控、弹性、安全的网关服务,基于 Java 技术栈开发,可以和 Eureka、Ribbon、Hystrix 等组件配合使用。
主要是通过过滤器(类似于 AOP)来过滤请求,从而实现网关必备的各种功能。
Zuul 1.x 版本基于同步 IO,性能较差。
Zuul 2.x 版本基于 Netty 实现了异步 IO,大幅提升了性能。
官方文档 Wiki:https://github.com/Netflix/zuul/wiki
# 2. Spring Cloud Gateway
SpringCloud Gateway 属于 Spring Cloud 生态系统中的网关,其诞生的目标是为了替代老牌网关 Zuul。准确点来说,应该是 Zuul 1.x。SpringCloud Gateway 起步要比 Zuul 2.x 更早,不过和 Zuul 2.x 的差别不大,也是通过过滤器来处理请求。但是,目前更加推荐使用 Spring Cloud Gateway 而非 Zuul,因为 Spring Cloud 生态对其支持更加友好。
为了提升网关的性能,SpringCloud Gateway 基于 Spring WebFlux 。Spring WebFlux 使用 Reactor 库来实现响应式编程模型,底层基于 Netty 实现同步非阻塞的 I/O。
总结:取代了Zuul,性能高 可以用java代码来写逻辑 适于学习
官网:https://spring.io/projects/spring-cloud-gateway
官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference//html/
# 3. Kong
Kong 是一款基于 OpenResty(Nginx + Lua 模块)编写的高可用、易扩展的,由 Mashape 公司开源的 API Gateway 项目。
Kong 主要有三个组件:
- Kong Server :基于 Nginx 的服务器,用来接收 API 请求。
- Apache Cassandra/PostgreSQL :用来存储操作数据。
- Kong dashboard:官方推荐 UI 管理工具,也可以使用 restfull 方式管理 admin api。
Kong 采用插件机制进行功能定制,插件集(可以是 0 或 N 个)在 API 请求响应循环的生命周期中被执行。插件使用 Lua 编写,目前已有几个基础功能:HTTP 基本认证、密钥认证、CORS(Cross-Origin Resource Sharing,跨域资源共享)、TCP、UDP、文件日志、API 请求限流、请求转发以及 Nginx 监控。
官网地址:https://konghq.com/products/kong-gateway
# 4. APISIX
APISIX 是一款基于 Nginx 和 etcd 的高性能、云原生、可扩展的网关系统。
etcd 是使用 Go 语言开发的一个开源的、高可用的分布式 key-value 存储系统,使用 Raft 协议做分布式共识。
作为 NGINX 和 Kong 的替代项目,APISIX 目前已经是 Apache 顶级开源项目,并且是最快毕业的国产开源项目。国内目前已经有很多知名企业(比如金山、有赞、爱奇艺、腾讯、贝壳)使用 APISIX 处理核心的业务流量。
根据官网介绍:“APISIX 已经生产可用,功能、性能、架构全面优于 Kong”。
官网地址:https://apisix.apache.org/zh/
# 5. Shenyu
一款基于 WebFlux 的可扩展、高性能、响应式网关,Apache 顶级开源项目。