http模块

作者: 愚公300代 | 来源:发表于2016-10-12 14:14 被阅读144次

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

    相关文章

      网友评论

        本文标题:http模块

        本文链接:https://www.haomeiwen.com/subject/ikqiyttx.html