SpringCloudGateway提供了两种网关路由的底层实现,一种是基于SpringWebflux的异步实现,另一种是基于SpringMVC对应的同步实现。

传统同步实现:响应式异步实现:

1、spring-cloud-starter-gateway:

        这个模块是SpringCloudGateway的核心模块,提供了基于Spring WebFlux的非阻塞网关,是一种异步实现,默认使用 Reactor Netty 作为底层的 HTTP 容器,支持响应式的非阻塞 I/O 模型。在异步、非阻塞的网关中,请求不再通过线程池的方式处理,而是采用事件驱动的方式。这种模型能够更高效地利用系统资源,适应高并发的场景,并提供更好的性能和扩展性。Spring Cloud Gateway 的异步模型使其能够同时处理大量的并发请求,而不会阻塞线程。这对于需要处理实时性要求较高的应用场景非常有益。异步的响应式编程模型还使得网关能够更好地适应微服务架构中的多个服务间的非阻塞通信。它使用函数式编程风格进行配置,充分利用了Spring5的响应式编程特性。

       配置路由和过滤器时采用的时可以通过函数式的方式,使用Java8的Lambda表达式进行声明。这使得配置更加简洁、灵活,适用于构建高性能、高并发的微服务网关。

特点和优势:

函数式配置: 使用函数式编程风格进行网关的路由和过滤器配置,通过 Java 8 Lambda 表达式进行声明。响应式编程: 基于Spring WebFlux 框架,充分利用了 Spring 5 的响应式编程特性,适用于处理高并发和异步场景。灵活性和可扩展性: 更灵活的路由和过滤器配置,异步模型使其能够同时处理大量的并发请求,而不会阻塞线程,适用于构建高性能、高并发的微服务网关。更现代的编程风格: 函数式编程的风格更符合现代的编程趋势,更易于理解和维护。 @Bean

public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {

return builder.routes()

.route("user-service", r -> r

.path("/users/**")

.uri("lb://user-service")

)

.build();

}

2、spring-cloud-starter-gateway-mvc: 

这个模块也是 Spring Cloud Gateway 的一部分,但与 spring-cloud-starter-gateway 不同,它采用的是传统的 Spring MVC 风格的配置,使用阻塞 I/O 模型,属于同步式网关。默认使用 Tomcat 或其他传统的 Servlet 容器作为底层的 HTTP 容器。使用 spring-cloud-gateway-mvc 模块的网关,请求处理是基于传统的阻塞 I/O 模型,它使用 Servlet 容器(如 Tomcat 或 Jetty)来处理请求。这与响应式编程模型有所不同,不是采用非阻塞的方式,而是每个请求都会占用一个线程,直到请求处理完成。虽然 spring-cloud-gateway-mvc 提供了与传统 Spring MVC 相似的编程模型,但在处理大量并发请求时,可能会受到线程阻塞的限制,因此在一些高并发和实时性要求较高的场景下,响应式网关(如 Spring Cloud Gateway 的默认实现)可能更为适用。这个模块提供了更传统的配置方式,适应于那些已经熟悉 Spring MVC 风格的开发人员。它依然可以用于构建 API 网关,但相比于函数式风格的 spring-cloud-starter-gateway,配置可能会更加熟悉和直观。 特点和优势:

传统的 Spring MVC 风格: 使用传统的 Spring MVC 风格进行网关的路由和过滤器配置。熟悉的配置方式: 对于熟悉 Spring MVC 的开发者来说,配置方式更加熟悉,迁移成本较低。与传统 Spring MVC 项目更为相似: 如果项目中已经使用了 Spring MVC,采用这个模块可以更好地与现有代码兼容。 @Controller

public class GatewayController {

@RequestMapping("/users/**")

public String forward() {

return "forward:/user-service";

}

}

精彩文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。