在如今的SpringCloud生态中,SpringCloud Gateway是一个至关重要的组件。Spring Cloud Gateway 是一个在 Spring 生态系统中建立的 API 网关,它为微服务架构中的服务提供了一个简单有效的方式来路由请求、转发和过滤等功能。
网关的作用就是提供统一接入,意味着所有的流量都需要先经过网关,然后再由网关转发出去。所以,一般来说我们用Gateway构建的网关应用中不太有业务逻辑,主要的功能就是做流量的转发。
有了网关之后,我们就可以基于网关做很多事情,如:
路由转发:Spring Cloud Gateway 允许我们定义路由规则,将进入的请求根据不同的路径或条件转发到不同的下游服务。这对于微服务架构中服务的管理和维护非常重要。
基于这个原理,我们就可以根据用户的不同请求,把用户路由到对应的服务中,比如用户要访问订单服务,则把他的请求直接路由给订单服务的集群,用户要访问商品服务,则把他的请求直接路由给商品服务的集群。
spring:
cloud:
gateway:
routes:
- id: order-service
uri: lb://order-service
predicates:
- Path=/order/**
- id: item-service
uri: lb://item-service
predicates:
- Path=/item/**
负载均衡:因为网关可以做路由转发,所以借助他也能实现非常方便的负载均衡。一般都是集成LoadBalancer实现。
比如一个请求要访问商品模块,而商品模块是集群提供的,具体要路由给那台机器呢?这个就可以给予网关来实现负载均衡了。
统一授权:在Gateway中,我们可以继承 OAuth2、JWT 等安全协议的集成,来进行统一的登录、授权。
我们可以通过配置实现,如果用户访问任意一个页面,我们都先校验用户是否登录,如果没登录,路由到登录页面进行登录。如果登录了,则把请求路由给对应的服务进行处理。
流量过滤:就像统一授权一样,我们也可以基于Spring Cloud Gateway实现统一的过滤,比如一些黑名单的过滤,一些恶意请求的过滤等等。
限流降级:我们还可以在Gateway中集成Sentinel等组件,来实现统一的限流。这样我们就可以在网关层面实现一个统一的流量管控,避免下游服务因为流程扛不住而被打挂。
跨域支持:在微服务架构中,服务通常分布在不同的域中。Spring Cloud Gateway 提供跨域请求支持,使得不同域的服务可以安全、有效地相互通信。
总之,Gateway就是一个流量的统一入口,所以他可以做很多通用的事情,比如路由转发、负载均衡、统一授权等,还可以做流量的过滤、限流降级等保护服务的机制。
但是,SpringCloud Gateway搭建起来的网关服务也并不是全无缺点,作为网关,Spring Cloud Gateway 会处理所有进入的请求。因此,它可能成为系统的瓶颈。合理分配资源,监控性能指标,如响应时间、吞吐量和系统负载,是非常重要的。
在实现原理上,Spring Cloud Gateway 基于 Spring 5 引入的 WebFlux 框架,它使用了响应式编程模型,主要通过 Project Reactor 提供的 Mono 和 Flux API 来处理异步和非阻塞操作。这意味着 Spring Cloud Gateway 可以有效地处理大量并发连接,同时保持较低的资源使用率。
WebFlux 是 Spring Framework 5.0 中引入的一个新的响应式编程框架,专门用于构建异步、非阻塞的 Web 应用程序。WebFlux 是 Spring 对响应式编程范式的一个实现,它在 Spring 的生态系统中与传统的 Spring MVC 并行存在。
WebFlux 基于响应式编程原则构建,这种编程范式专注于数据流和数据变化的传播。这意味着它可以更加有效地处理异步数据流,比如来自 Web 请求的数据流。
在传统的 Spring MVC 或 Servlet 应用中,HTTP 请求处理通常是阻塞的。相比之下,WebFlux 使用非阻塞 I/O,这允许服务器在等待响应时释放线程来处理其他任务,从而提高了应用程序的吞吐量和伸缩性。
WebFlux 不仅支持传统的 Servlet 容器(如 Tomcat、Jetty),还支持非阻塞服务器,如 Netty 和 Undertow,这些服务器更适合处理非阻塞操作。
WebFlux 特别适合处理长时间运行的异步任务、大量并发请求,以及需要高吞吐量的场景。它在处理事件驱动的微服务、实时数据流等场景中表现出色。