SpringCloud Gateway HttpWebHandlerAdapter链路调用请求流程介绍

作者:Polarisy丶 时间:2023-04-29 00:12:18 

前言

上一节我们说到从HttpWebHandlerAdapter的handle方法说起到DispatcherHandler的调用流程

那么HttpWebHandlerAdapter的handle方法是从哪里来调用的呢?

我们可以找下看哪些类使用了HttpHandler

SpringCloud Gateway HttpWebHandlerAdapter链路调用请求流程介绍

通过这些类的名字,我们可以发现,HttpHandler 往下就是具体的 Web 容器了,也就是说有具体的 Web 容器来接受请求,然后通过调用 HttpWebHandlerAdapter#handler 来进行后续的处理。这样我们也就明白了 为什么 HttpHandler 的具体实现是一个适配器,因为它要适配不同的底层容器,Spring webFLux 不仅仅可以使用 NettyReactiveWebServer 作为底层Web 容器,也可以使用 tomcat、jetty等 servlet 的容器。

web容器

通过上面分析点进去可以看到

NettyReactiveWebServerFactory.java
@Override
public WebServer getWebServer(HttpHandler httpHandler) {
HttpServer httpServer = createHttpServer();
ReactorHttpHandlerAdapter handlerAdapter = new ReactorHttpHandlerAdapter(httpHandler);
NettyWebServer webServer = createNettyWebServer(httpServer, handlerAdapter, this.lifecycleTimeout,
getShutdown());
webServer.setRouteProviders(this.routeProviders);
return webServer;
}

通过方法名就可以发现这就是得到一个web服务

往上面一直追踪可以找到入口是AbstractApplicationContext#onRefresh方法中,也就是在AbstractApplicationContext#refresh中调用的。熟悉Spring的同学可以看到这就是Spring容器启动的核心方法。

接着上面的代码,可以看到第二行,实例化了ReactorHttpHandlerAdapter对象

点进去可以看到核心的apply方法

@Override
public Mono<Void> apply(HttpServerRequest reactorRequest, HttpServerResponse reactorResponse) {
NettyDataBufferFactory bufferFactory = new NettyDataBufferFactory(reactorResponse.alloc());
try {
ReactorServerHttpRequest request = new ReactorServerHttpRequest(reactorRequest, bufferFactory);
ServerHttpResponse response = new ReactorServerHttpResponse(reactorResponse, bufferFactory);
if (request.getMethod() == HttpMethod.HEAD) {
response = new HttpHeadResponseDecorator(response);
}
            //调用handle方法
return this.httpHandler.handle(request, response)
.doOnError(ex -> logger.trace(request.getLogPrefix() + "Failed to complete: " + ex.getMessage()))
.doOnSuccess(aVoid -> logger.trace(request.getLogPrefix() + "Handling completed"));
}
catch (URISyntaxException ex) {
if (logger.isDebugEnabled()) {
logger.debug("Failed to get request URI: " + ex.getMessage());
}
reactorResponse.status(HttpResponseStatus.BAD_REQUEST);
return Mono.empty();
}
}

可以看到在这里调用开始httpHandler#handle方法,

WebServerManager.java #WebServerManager
this.handler = new DelayedInitializationHttpHandler(handlerSupplier, lazyInit);
this.webServer = factory.getWebServer(this.handler);

此时的httpHandler是DelayedInitializationHttpHandle对象,调用其handle方法

SpringCloud Gateway HttpWebHandlerAdapter链路调用请求流程介绍

可以看到最后实际调用的是HttpWebHandlerAdapter的handle方法

来源:https://blog.csdn.net/Apandam/article/details/127409087

标签:SpringCloud,Gateway,HttpWebHandlerAdapter
0
投稿

猜你喜欢

  • Java看完秒懂版熔断和降级的关系

    2023-11-06 01:12:13
  • Unity3D实现渐变颜色效果

    2022-09-03 08:14:32
  • C# DataTable中Compute方法用法集锦(数值/字符串/运算符/表等操作)

    2023-03-01 23:28:38
  • Android开发应用中Broadcast Receiver组件详解

    2023-04-25 09:35:35
  • Android CalendarView,DatePicker,TimePicker,以及NumberPicker的使用

    2022-09-08 18:56:36
  • Java concurrency集合之ArrayBlockingQueue_动力节点Java学院整理

    2023-07-01 22:19:29
  • C#实现FTP上传文件的方法

    2021-11-13 10:46:56
  • SpringMVC源码解读之HandlerMapping

    2023-07-23 22:18:05
  • java前后端加密解密crypto-js的实现

    2023-11-29 12:09:31
  • C++实现LeetCode(205.同构字符串)

    2023-06-21 04:06:54
  • Android 根据手势顶部View自动展示与隐藏效果

    2022-01-11 07:30:20
  • Java基础之二叉搜索树的基本操作

    2023-07-08 10:07:07
  • Android开发实现控件双击事件的监听接口封装类

    2023-02-15 00:56:18
  • C#6 null 条件运算符

    2022-03-04 19:42:14
  • Java 判断字符为中文实例代码(超管用)

    2021-08-24 13:18:31
  • C#支付宝新版支付请求接口调用

    2023-02-23 15:50:45
  • 浅谈java异常处理之空指针异常

    2022-07-31 03:12:27
  • Android Walker登录记住密码页面功能实现

    2023-12-16 05:45:03
  • Android ListView用EditText实现搜索功能效果

    2021-05-29 09:05:25
  • 1秒钟实现Springboot 替换/写入 word文档里面的文字、图片功能

    2022-05-08 18:35:48
  • asp之家 软件编程 m.aspxhome.com