在微服务架构中,随着服务数量的增加,如何高效地管理和路由客户端请求成为了一个棘手的问题
你是否遇到过这样的场景:
前端需要调用多个后端服务,但每个服务的地址、协议、路径各不相同,导致客户端代码复杂且难以维护? 这时,API 网关应运而生,而 Spring Cloud Gateway 作为 Spring 生态中的佼佼者,提供了强大的路由转发功能,能够轻松解决这些问题。
所以本章我们来了解并学习 Spring Cloud Gateway的一些知识,首先要明白我们在上边提到的API网关是什么?
API网关就是一个位于前端客户端和后端服务之间的中间层,负责接收客户端的所有API请求,让外部看起来是一个统一的接口,并根据不同的规则将这些请求路由到合适的后端微服务,还可以对请求和响应进行一系列处理与转换
当后端微服务完成请求处理并生成响应结果后,这个结果并不会直接返回给前端应用,而是会再次经过网关。网关会对响应结果进行必要的处理和优化,比如统一格式、添加额外的元数据等,之后再将处理好的响应结果交付给前端应用。通过这种方式,能够简化前端代码的编写,同时也提升了整个系统的可维护性和灵活性。
Gateway API网关的组成
【网关 = 路由转发+过滤器】
路由转发:是指API网关根据预先定义的规则,将客户端的请求转发到后端特定的微服务实例
这里我举一个简单的路由配置例子
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes()
.route("user_service_route", r -> r
.path("/user/**") // 路径匹配
.filters(f -> f
.addRequestHeader("X-Request-User", "Value") // 添加请求头
)
.uri("http://user-service") // 目标服务地址
)
.build();
}
}
以上代码例子有三个关键组件
Route:是路由的唯一标识符,这里设置为user_service_route
URL:是路由的目标地址,表示请求将被转发到该地址
Filters过滤器:过滤器则是用于对请求进行处理和转换,可以修改请求,响应以及执行其他自定义逻辑,提供了多个内置的过滤器,如请求转发,请求重试,请求限流,同时也可自定义过滤器
Spring Cloud Gateway的具体工作流程
1.-- 客户端的所有请求都会先到达发起Spring Cloud Gateway
2.-- 在Gateway内部会先将请求交给Handler Mapping进行处理 ,Handler Mapping会根据配置的路由规则确定请求是否匹配
3. -- 如果匹配成功,请求就会被传递给FilteringWebHandler(过滤处理器)
4.-- 一旦条件满足,请求就会进入到(Filter Chain)过滤器链中,并依次执行前置过滤器逻辑(可修改请求,添加请求头,记录日志等)
5.-- 请求经过前置过滤器处理后,请求会被转发到具体的后端服务,后端服务处理完请求后,返回响应给Gateway,响应会经过后置过滤器(Post-Filters)的处理,然后返回给客户端
【 理解两个重要概念】
Gateway Handler(网关处理器):
1.它是Spring Cloud Gateway的核心组件,负责将请求转发到匹配的路由上
2.根据路由配置和断言条件进行路由匹配,选择合适的路由进行请求转发
3.然后网关处理器依次应用配置的过滤器链,对请求进行处理和转换
Gateway Filter Chain(网关过滤器链):
它是由一系列过滤器组成,按照配置的顺序依次执行,每个过滤器可以在请求前,请求后或者发生异常的时候进行处理