elasticsearch

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中分析地是一致的。

上一篇下一篇

猜你喜欢

热点阅读