http模块
2016-10-12 本文已影响144人
愚公300代
HttpServer:完成netty服务的启动,包括指定netty服务的启动者NettyHttpServerTransport,请求的实际分发者Dispatcher,请求实际的处理者RestController
elasticsearch使用Guice依赖注入地方式将实际工作的类注入到接口。HttpServerTransport的实际实现者是NettyHttpServerTransport这个类,NettyHttpServerTransport类伴随着HttpServer的启动完成了netty服务器地初始化,最重要地是
serverBootstrap.setPipelineFactory(configureServerChannelPipelineFactory());
HttpChannelPipelineFactory中pipeline的设置表明了请求最终地处理者是HttpRequestHandler类(此出不了解地请学习下netty地基本原理)
protected final HttpRequestHandler requestHandler;
....
pipeline.addLast("handler", requestHandler);
从HttpRequestHandler中可以看出,实际地分发还是NettyHttpServerTransport的dispatchRequest函数
@Override
public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
HttpRequest request;
OrderedUpstreamMessageEvent oue = null;
if (this.httpPipeliningEnabled && e instanceof OrderedUpstreamMessageEvent) {
oue = (OrderedUpstreamMessageEvent) e;
request = (HttpRequest) oue.getMessage();
} else {
request = (HttpRequest) e.getMessage();
}
//这段代码说明了实际的请求被转化成了NettyHttpRequest,实际的channel被转化成了NettyHttpChannel,RestControll实际使用的channel就是此时赋予的,并且被传递到RestHandler的handleRequest方法
// the netty HTTP handling always copy over the buffer to its own buffer, either in NioWorker internally
// when reading, or using a cumalation buffer
NettyHttpRequest httpRequest = new NettyHttpRequest(request, e.getChannel());
if (oue != null) {
serverTransport.dispatchRequest(httpRequest, new NettyHttpChannel(serverTransport, httpRequest, corsPattern, oue, detailedErrorsEnabled));
} else {
serverTransport.dispatchRequest(httpRequest, new NettyHttpChannel(serverTransport, httpRequest, corsPattern, detailedErrorsEnabled));
}
super.messageReceived(ctx, e);
}
httpServerAdapter.dispatchRequest(request, channel);
在HttpServer中这个httpServerAdapter实际上是Dispatcher,最终调用的是HttpServer的internalDispatchRequest方法,完成请求的实际处理者是RestController的任务,接下来就可以看到RestController借助于PathTrie完成对不同类型请求和其处理者之间的映射关系,以完成相应请求地处理。
NettyHttpRequest继承HttpRequest完成基本地参数解析。
由于请求分发是channel地传递,这和Rest模块Response中分析地是一致的。