gRPC源碼分析(c++)

首先須要按照grpc官網上說的辦法從github上下載源碼,編譯,而後跑一跑對應的測試代碼。我分析的代碼版本爲v1.20.0。c++

在cpp的helloworld例子中,client端,第一個函數是建立channel。git

GreeterClient greeter(grpc::CreateChannel("localhost:50051", grpc::InsecureChannelCredentials()));

咱們從這裏開始分析,CreateChannel這個函數的具體實如今src/cpp/client/create_channel.cc(這個文件裏指定了namespace grpc),CreateChannel再調用CreateCustomChannel,這裏會根據creds的類型來建立Channel。github

std::shared_ptr<Channel> CreateCustomChannel( const grpc::string& target, const std::shared_ptr<ChannelCredentials>& creds, const ChannelArguments& args) { GrpcLibraryCodegen init_lib; // We need to call init in case of a bad creds.
  return creds ? creds->CreateChannel(target, args) : CreateChannelInternal( "", grpc_lame_client_channel_create( nullptr, GRPC_STATUS_INVALID_ARGUMENT, "Invalid credentials."), std::vector<std::unique_ptr< experimental::ClientInterceptorFactoryInterface>>()); }
creds的類型爲ChannelCredentials,那咱們來具體看看ChannelCredentials這個類是如何實現的,ChannelCredentials這個類的定義在include/grpcpp/security/credentials.h文件中,這裏定義了虛函數CreateChannel。
virtual std::shared_ptr<Channel> CreateChannel( const grpc::string& target, const ChannelArguments& args) = 0;

以ChannelCredentials類爲父類的子類有,InsecureChannelCredentialsImpl,CronetChannelCredentialsImpl,SecureChannelCredentials,具體是哪一個類,咱們須要再看下CreateChannel的第二個參數,函數

grpc::InsecureChannelCredentials()
InsecureChannelCredentials這個函數的定義和實如今src/cpp/client/insecure_credentials.cc文件中,函數中建立了一個指向ChannelCredentials類的InsecureChannelCredentialsImpl對象,再看InsecureChannelCredentialsImpl類實現的CreateChannel。也就是根據c++的多態用法,在上面提到的CreateCustomChannel函數中,調用的CreateChannel,就是調用InsecureChannelCredentialsImpl這個類的CreateChannel。

咱們再來看一下CreateChannel的調用關係,CreateChannel->CreateChannelWithInterceptors->CreateChannelInternal,CreateChannelInternal其實就是建立了一個Channel對象,建立對象的參數中,有host信息,指向grpc_channel的指針,還有一個是ClientInterceptorFactoryInterface類指針的vector。這裏我先重點關注下第二個參數,看其是如何生成的。在CreateChannelWithInterceptors函數中,使用grpc_insecure_channel_create這個函數來生成grpc_channel,下面來具體分下這個函數。
grpc_insecure_channel_create 這個函數是grpc core中提供的so接口,實如今ext/transport/chttp2/client/insecure/channel_create.cc這個文件中。
相關文章
相關標籤/搜索