GRPC-C++源碼分析(六)--Server-Register

1 server

對應《GRPC-C++源碼分析(二)--main函數主要流程》中的

1.2節 創建Server

<code>  std::unique_ptr<server> server(new Server(
max_receive_message_size_, &args, sync_server_cqs,
sync_server_settings_.min_pollers, sync_server_settings_.max_pollers,
sync_server_settings_.cq_timeout_msec, resource_quota_,
std::move(interceptor_creators_)));/<server>/<code>
  • sync_server_cqs作為參數傳到了Server構造函數中,賦給了sync_server_cqs_

在Server的構造函數中填充了sync_req_mgrs_

<code>    for (const auto& it : *sync_server_cqs_) {
sync_req_mgrs_.emplace_back(new SyncRequestThreadManager(
this, it.get(), global_callbacks_, server_rq, min_pollers,
max_pollers, sync_cq_timeout_msec));
}/<code>
  • 注意sync_server_cqs_作為參數傳到了SyncRequestThreadManager構造函數中,賦給了server_cq_,這個server_cq_會在後面用到

在Server的構造函數中生成了grpc_server* server_;

<code>server_ = grpc_server_create(&channel_args, nullptr);/<code>
  • 這裡的server_會在稍後的grpc_server_register_completion_queue方法中用到

2 Register

對應於《GRPC-C++源碼分析(三)--main函數主要流程》中1.3節和1.4節

2.1 grpc_server_register_completion_queue

<code>  for (auto it = sync_server_cqs->begin(); it != sync_server_cqs->end(); ++it) {
grpc_server_register_completion_queue(server->server_, (*it)->cq(),
nullptr);
has_frequently_polled_cqs = true;
}/<code>


GRPC-C++源碼分析(六)--Server-Register

  • 將sync_server_cqs中每個ServerCompletionQueue類中的cq_指針放到Server中的grpc_completion_queue** cqs指針數組中

2.2 RegisterService

<code>  for (auto service = services_.begin(); service != services_.end();
service++) {
if (!server->RegisterService((*service)->host.get(), (*service)->service)) {
return nullptr;
}
}/<code>
  • 註冊service得從/grpc/examples/cpp/helloworld/greeter_server.cc說起


GRPC-C++源碼分析(六)--Server-Register

  • 這塊邏輯關注的是methods_裡的東西來自什麼地方
  • 在greeter_server.cc文件中聲明GreeterServiceImpl service時,便調用了其父類Greeter::Service的構造方法,利用AddMethod方法將具體的method放到了methods_中
  • 在Server調用RegisterService時,會把這些method放到sync_req_mgrs_裡的每一個SyncRequestThreadManager中,目前先了解到這裡就可以,後面看到具體使用的地方我們再繼續


分享到:


相關文章: