回顾API网关:Spring Cloud Gateway

一 概述

在单体应用程序架构下,客户端(Web或移动端)通过向服务端发起一次网络调用获取数据。负载均衡将请求路由给N个相同的应用程序实例中的一个。然后应用程序会查询各种数据库处理业务逻辑,并将响应返回给客户端。

微服务架构下,单体应用被切割成多个微服务,如果将所有的微服务直接对外暴露,就会出现安全方面的各种问题。

二 客户端直接向每个发服务发送请求的主要问题

  • 客户端需求和每个微服务暴露的细粒度API不匹配。
  • 部分服务使用的协议不是Web友好协议。可能使用Thrift二进制RPC,也可能使用AMQP消息传递协议。
  • 微服务难以重构。如果合并两个服务,或者将一个服务拆分成两个或者更多服务,这类重构非常困难。

对于这些问题,一个常用的解决方案就是使用API网关。API网关自身也是一个服务,并且是后端服务的唯一入口。从面向对象设计的角度看,它与外观模式类似。API网关封装了系统内部架构,为每个客户端提供了一个定制的API。除此之外,它还可以负责身份验证,监控,负载均衡,限流,降级与应用检测等功能。

三 Spring Cloud Gateway

Spring Cloud Gateway基于Spring Boot 2,是Spring Cloud的全新项目,该项目提供了一个构建在Spring生态上的API网关,包括Spring 5,Spring Boot 2和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的途径来转发请求,并为它们提供横切关注点,如:安全性,检控/指标和弹性。

Spring Cloud Gateway的特征:

  • 基于Java8编码;
  • 支持Spring Framework5;
  • 支持Spring Boot 2;
  • 支持动态路由;
  • 支持内置到Spring Handler 映射中的路由匹配;
  • 支持基于HTTP请求到路由匹配(Path,Method,Header,Host等);
  • 过滤器作用域匹配的路由;
  • 过滤器可以修改下游HTTP请求和HTTP响应(增加/修改头部,增加/修改请求参数,改写请求路径等);
  • 通过API或配置驱动;
  • 支持Spring Cloud DiscoveryClient配置路由,与服务发现于注册配合使用。

在Finchley正式版本之前,Spring Cloud推荐的网关是Netflix提供的Zuul(Zuul 1.x,是一个基于阻塞I/O的API Gateway)。于Zuul相比,Spring Cloud Gateway建立在Spring Framework5,Project Reactor和 Spring Boot 2之上,使用非阻塞API。Spring Cloud Gateway还支持Websocket,并且与Spring紧密集成。

Zuul 1.x基于Servlet2.5,使用阻塞架构,它不支持任何长连接,如WebSocket。Zuul的设计模式类似于Nginx,每次的I/O操作都是从工作线程中选择一个执行,请求线程被阻塞直到工作线程完成,但是差别是Nginx是由C++实现,Zuul用Java实现,而JVM本身会有第一次加载较慢的情况,使得Zuul的性能较差。

Zuul 2.x基于Netty,非阻塞,支持长连接。在性能方面比Zuul 1.x有较大的提升。

根据官方提供的基准(benchmark)测试,Spring Cloud Gateway的RPS(每秒请求数)是Zuul的1.6倍。所以Spring Cloud Gateway在提供的功能和实际性能方面,表现都比较好。

你可能感兴趣的:(SpringCloud,SpringCloud,Gateway,Zuul,Nginx,Servlet)