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或者不正确的状态码。

 

posted @ 2024-08-08 16:16  又混一天  阅读(3)  评论(0编辑  收藏  举报