HTTP 1/2支持

Tars使用nghttp2库支持了http2协议,对协议库做了RPC封装,使得对业务开发几乎透明,用起来非常方便。由于复用了 Tars rpc,因此也拥有了同步和异步以及超时的特性,并能够利用tars stat上报调用质量。

本文简单介绍一下使用http2的方法和步骤,包括同步调用和异步调用。但要注意的是,如果使用的是http1,则只能同步请求。因为http1没有类似 请求id的字段,无法将异步响应和请求对应上。

http rpc的使用

只需要按照下面几个步骤设置:

编译tars框架,支持nghttp2

tars框架默认不开启http2,首先改动cpp/build/CMakeLists.txt,将TARS_HTTP2定义改为1:

  1. set(TARS_HTTP2 1)

现在重新编译安装tars框架。 修改业务makefile,添加一行定义:

  1. TARS_HTTP2 = 1

注意这一行一定要放在include /usr/local/tars/cpp/makefile/makefile.tars上面

获取客户端代理,设置http2编解码函数

  1. CommunicatorPtr& comm = Application::getCommunicator();
  2. YourPrx prx = comm->stringToProxy<YourPrx>("test.server.yourobj");
  3. // set protocol
  4. ProxyProtocol proto;
  5. proto.requestFunc = tars::http2Request;
  6. proto.responseExFunc = tars::http2Response;
  7. prox->tars_set_protocol(proto);

发起同步调用

  1. map<string, string> headers;
  2. headers[":authority"] = "domain.com";
  3. headers[":scheme"] = "http";
  4. map<string, string> rspHeaders;
  5. string rspBody;
  6. prx->http_call("GET", "/", headers, "", rspHeaders, rspBody);

发起异步调用

  1. // 编写callback
  2. class MyHttpCb : public HttpCallback
  3. {
  4. public:
  5. int onHttpResponse(const map<string, string>& reqHeaders,
  6. const map<string, string>& rspHeaders,
  7. const vector<char>& rspBody)
  8. {
  9. // your process
  10. return 0;
  11. }
  12. int onHttpResponseException(const map<string, string>& reqHeaders, int eCode)
  13. {
  14. // process exception
  15. return 0;
  16. }
  17. };
  18. // 发起调用
  19. headers[":path"] = "/";
  20. headers[":method"] = "GET";
  21. prx->http_call_async(headers, "", new MyHttpCb());