muduo库实现rpc框架和http框架

发布时间 2023-06-27 14:50:10作者: 好人~

muduo库实现rpc框架

https://github.com/chenshuo/muduo-protorpc/

RpcServer:

  • onConnection:在连接建立以后,会创建一个RpcChannel,RpcChannel中传入当前已经注册的服务。并且将RpcChannel::onMessage()设置为当前连接conn的消息回调函数,但有rpc请求的时候就会调用RpcChannel::onMessage()。
RpcChannelPtr channel(new RpcChannel(conn));
channel->setServices(&services_);
conn->setMessageCallback(
    std::bind(&RpcChannel::onMessage, get_pointer(channel), _1, _2, _3));
conn->setContext(channel);

muduo库实现http框架

参考:muduo库实现http框架

muduo/net/http中定义了http协议解析,muduo/net/inspect定义了url的解析。

http协议解析:

  • HttpContext:parseRequest()中使用状态机解析请求行和头部信息,没有对body进行解析。解析的结果放入HttpRequest对象中。
    【改进:可以只解析json格式的body】

  • HttpRequest:存储http请求的内容,包括方法(get、post...)、协议版本(HTTP/1.0、HTTP/1.1)、url、url中?后面的内容、head信息、接收到http的时间。

  • HttpServer:

    • 主要处理逻辑在onRequest()。onRequest()中,设置长短连接,调用httpCallback_,返回并发送response。【改进:如果response中的body很大就会导致内存爆掉。】
    • httpCallback_用于处理request,返回response。外部定义具体的httpCallback_,并传入HttpServer中。
  • HttpResponse:

    • 在构造函数中定义是否长连接。
    • 存储http response的内容,包括head、状态码、是否是长连接、body

url的解析:

  • 假设url为/proc/opened_files/123/24,则其中proc称为modules_,opened_files称为command,123/24会作为参数传递给当前url对应的回调函数。
    【改进:request中的body可以只有json格式的数据,然后将json格式的数据作为参数传递给url的回调函数】
  • 数据结构:
    std::map<string, Callback> CommandList; 用于存储command对应的回调函数。
    std::map<string, CommandList> modules_;用于存储modules_对应的command列表。
  • onRequest()被设置为HttpServer中的httpCallback_,用于处理request,返回response。
    onRequest()中解析url,查找modules_是否有对应的url,如果有,就调用相应的回调函数。
  • add()将url和回调函数放入modules_中。当请求到来时,解析请求中的url,从modules_取出相应的回调函数。
  • PerformanceInspector类就是将同一个modules_的回调函数放在同一个类中。