文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringCloudGatewayHttpWebHandlerAdapter链路调用请求流程介绍

2022-11-13 18:41

关注

前言

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

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

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

通过这些类的名字,我们可以发现,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方法

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

到此这篇关于SpringCloud Gateway HttpWebHandlerAdapter链路调用请求流程介绍的文章就介绍到这了,更多相关SpringCloud HttpWebHandlerAdapter内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯