presto(三)——客户端http请求

接上一篇文章 presto——词法解析
process(queryRunner, split.statement(), outputFormat, false);
具体实现:

 private static void process(QueryRunner queryRunner, 
                  String sql, OutputFormat outputFormat, 
                  boolean interactive)
    {
         //我们来关注startQuery方法到底在搞什么鬼
        try (Query query = queryRunner.startQuery(sql)) {
        .......
    }

public Query startQuery(String query)
    {
        return new Query(startInternalQuery(query));
    }

public StatementClient startInternalQuery(String query)
    {
        return new StatementClient(httpClient, 
                      queryResultsCodec, session.get(), query);
    }

1、StatementClient构造方法

public StatementClient(HttpClient httpClient, JsonCodec<QueryResults> queryResultsCodec, ClientSession session, String query)
    {
        requireNonNull(httpClient, "httpClient is null");
        requireNonNull(queryResultsCodec, "queryResultsCodec is null");
        requireNonNull(session, "session is null");
        requireNonNull(query, "query is null");

        //在QueryRunner的create方法,读取命令行的参数实例化httpClient
        //主要包括:代理ip端口、通信算法等信息
        this.httpClient = httpClient;
        this.responseHandler = createFullJsonResponseHandler(queryResultsCodec);
         ....这里省略了几行...

        //session是命令行敲入的协调器的地址和服务器--server参数
        //uri=http://localhost:8080/v1/statement
        //method = POST
        //head={X-Presto-Time-Zone=[Asia/Shanghai], User-Agent=[StatementClient/unknown], X-Presto-Source=[presto-cli], X-Presto-Language=[zh-CN], X-Presto-User=[tinygao], X-Presto-Transaction-Id=[NONE]}
        //body =  query的字节数组
        Request request = buildQueryRequest(session, query);
        //远程调用http://localhost:8080/v1/statement  重点
        JsonResponse<QueryResults> response = httpClient.execute(request, responseHandler);

        if (response.getStatusCode() != HttpStatus.OK.code() || !response.hasValue()) {
            throw requestFailedException("starting query", request, response);
        }
        //处理response数据
        processResponse(response);
    }

2、 远程请求分析

httpClient.execute(request, responseHandler);
请求这个http://localhost:8080/v1/statement

1、这个服务什么时候起来
2、客户端调用之后服务器做了什么事情
3、客户端对返回的结果做了什么

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,427评论 19 139
  • 0 系列目录# WEB请求处理 WEB请求处理一:浏览器请求发起处理 WEB请求处理二:Nginx请求反向代理 本...
    七寸知架构阅读 14,753评论 22 190
  • 本命年来了,还是单身。错过我的人你会后悔吗? 想谈恋爱,想结婚,想挣很多很多的钱,可是一年又一年,觉得只是年龄的增...
    明天快乐阅读 1,631评论 0 0
  • 淋雨之后,那种渗入骨头的冷,是开暖气,盖棉被能缓解的。我知道,自己到了一个极限了。 我再一次感到无尽的绝望和无...
    噗酱阅读 1,950评论 9 1