http请求到达后端的执行过程——网关篇
当后端接收到一次http请求后,最先会由tomcat服务器接受到,首先创建“HttpServletRequest”和“HttpServletResponse”对象,然后tomcat将请求交给servlet容器处理,servlet容器根据请求的url路径和配置确定应该由哪一个Servlet来处理该请求(也就是应该实例哪一个servlet对象),注意:每一次请求都会重新创建一个servlet对象,然后调用servlet对象的service方法,service方法根据具体的请求类型(GET,POST)调用适当的“doget”,“dopost”方法来处理请求。如果说是spring项目,那么当tomcat需要将请求转交给servlet容器的时候,会转而转交给spring的dispatchservlet容器。注意,这是不会在有选择的创建servlet实例对象,因为spring的所有请求都会交给dispatchservlet一个来接管。
gateway的执行流程:
1. 接受请求: 当有一个请求来到spring cloud gateway 时,网关会使用spring handle mapping来匹配请求路径(匹配请求规则: 根据配置文件中的路由规则,网关会检查每一个路由的断言规则(predicates))
2. 执行Pre-Filters:在请求被路由之前,Pre-Filter会被执行。这些过滤器可以访问控制-黑白名单,进行鉴权,日志记录操作。
3. 转发请求:如果匹配成功并且成功执行完了Pre-Filter过滤器后,网管会根据匹配路由的url转发到对应的后端服务。注意:这里的chain.filter(exchange);的执行是一个异步的操作。在执行完前置过滤器后,异步执行chain.filter(exchange);无需等待,便开始执行后置过滤器。我们可以在其后添加chain.filter(exchange).then();来有序的执行后置过滤器。
它的执行流程是:
Client Request -> [Pre-filter 1] -> [Pre-filter 2] -> ... -> [Pre-filter N] -> Route to Service
Service Response -> [Post-filter N] -> ... -> [Post-filter 2] -> [Post-filter 1] -> Client Response
4. 执行Post-Filter: 在后端完成响应服务之后,响应返回给客户端之前,Post-Filter会被执行,这些过滤器可以 修改响应,日志记录
5. 响应返回。
gateway异步操作的影响:
因为chain.filter(exchange)是一个异步操作,他会出发过滤器链的下一个过滤器,并立刻返回Mono<Void>。如果没有.then(),你在chain.filter(exchange)后面的代码都会被立刻执行,而不是等待过滤器链执完成。这会导致你尝试获取响应状态码时,响应还没有执行或者完成。
返回结果可能是null或者不正确的状态码。