API网关的作用
-
如果服务将所有API接口对外直接暴露给用户端,用户可能越权访问不属于它应该访问的功能(如管理员的高级功能)。
-
后台服务可能采用不同的通信方式,如服务A采用restful通信,服务B采用RPC通信。
-
不同的接入方式让用户端接入困难,尤其是App端接入RPC过程更为复杂。
-
在服务访问前很难做到统一的前置处理,如服务访问前需要对用户进行鉴权。这就必须将鉴权代码分散到每个服务模块中,随着服务数量增加代码将难以维护。
为了解决以上的问题,API网关应运而生,加入网关后应用架构变为下图所示。
当引入API网关后,在用户端与微服务之间建立了一道屏障,通过API网关对微服务提供了统一的访问入口,所有用户端的请求被API网关拦截,并在此基础上可以实现额外的功能:
-
1、针对所有请求进行统一鉴权、熔断、限流、日志等前置处理,让微服务专注自己的业务。
-
2、统一调用风格,通常API网关对外提供restful风格URL接口。用户传入请求后,由 API 网关负责转换为后端服务需要的 RESTful、RPC、WebService 等方式,这样便大幅度简化用户的接入难度。
-
3、更好的安全性,在通过API网关鉴权后,可以控制不同角色用户访问后端微服务的权利,实现服务更细粒度的权限控制。
-
4、API网关是用户端访问API的唯一入口,微服务架构通过引入微服务网关,将用户端与微服务的具体实现进行了解耦。
API网关相关产品
OpenResty
OpenResty是一个强大的Web应用服务器,web开发人员可以使用Lua脚本语言调用Nginx支持的各种以C以及Lua模块。
在性能方面,OpenResty可以快速构造出足以胜任10K以上并发连接响应的超高性能Web应用系统。
在国内,360、阿里云、腾讯网、去哪儿、酷狗音乐、新浪等都是OpenResty的深度用户。
但OpenResty是一款独立的产品,与主流的注册中心,存在一定的兼容问题,需要架构师独立实现其服务注册、发现功能。
Spring Cloud Zuul
Zuul是Netflix开源的微服务网关,主要职责是对用户请求进行路由转发与过滤。早期Spring Cloud与Netflix合作,使用Zuul作为微服务架构网关首选产品。
Zuul是基于J2EE Servlet实现路由转发,网络通信采用同步方式。
zuul 是netflix开源的一个API Gateway 服务器,本质上是一个web servlet应用。
Zuul可以通过加载动态过滤机制,从而实现以下各项功能:
- 1、验证与安全保障:识别面向各类资源的验证要求并拒绝那些与要求不符的请求。
- 2、审查与监控:在边缘位置追踪有意义数据及统计结果,从而为我们带来准确的生产状态结论。
- 3、动态路由:以动态方式根据需要将请求路由至不同后端集群处。
- 4、压力测试:逐渐增加指向集群的负载流量,从而计算性能水平。
- 5、负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求。
- 6、静态响应处理:在边缘位置直接建立部分响应,从而避免其流入内部集群。
- 7、多区域弹性:跨越AWS区域进行请求路由,旨在实现ELB使用多样化并保证边缘位置与使用者尽可能接近。
Zuul的核心是一系列的filters,其作用可以类比Servlet框架的Filter,或者AOP。工作原理如下图所示:
Zuul可以对Groovy过滤器进行动态的加载,编译,运行。
Zuul2.x设计更为先进,基于Netty 非阻塞和支持长连接, 但是 SpringCloud 目前没有整合。 Zuul2.x 的性能较 Zuul1.x 有较大的提升。
Zuul2.x引入了Netty和RxJava,正如之前的 ZuulFilter 分为了 Pre、Post、Route、Error,Zuul2的Filter分为三种类型:
- Inbound Filters:在路由之前执行。
- Endpoint Filters:路由操作。
- Outbound Filters:得到相应数据之后执行。
Spring Cloud GateWay
Spring 自己开发的新一代API网关产品,基于NIO异步处理,摒弃了Zuul基于Servlet同步通信的设计。
Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全,监控/指标,和限流。
关键特征:
- 1、基于JDK8+开发。
- 2、Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。
- 3、支持动态路由,能够匹配任何请求属性上的路由。
- 4、支持基于HTTP请求的路由匹配(Path、Method、Header、Host等)。
- 5、过滤器可以修改HTTP请求和HTTP响应。
在性能方面,根据官方提供的基准测试, Spring Cloud Gateway 的 RPS(每秒请求数)是Zuul 的 1.6 倍。
Spring Cloud Gateway十分优秀,Spring Cloud Alibaba也默认选用该组件作为网关产品。
相关概念:
- Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
- Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
- Filter(过滤器):这是org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。
工作流程:
客户端向 Spring Cloud Gateway 发出请求。如果 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。 过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
Spring Cloud Gateway 的特征:
- 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
- 动态路由
- Predicates 和 Filters 作用于特定路由
- 集成 Hystrix 断路器
- 集成 Spring Cloud DiscoveryClient
- 易于编写的 Predicates 和 Filters
- 限流
- 路径重写
参考: http://www.ityouknow.com/springcloud/2018/12/12/spring-cloud-gateway-start.html
http://www.likecs.com/show-50293.html
https://zhuanlan.zhihu.com/p/299608850?utm_source=wechat_session
https://juejin.cn/post/6844903965352525838
https://blog.csdn.net/weixin_38361347/article/details/114108368