Skip to content

liqifyl/grpc-source-analysis

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

37 Commits
 
 

Repository files navigation

grpc

grpc asyc stream

grpc asyc stream在释放时的顺序是stream->ctx->queue->channel->stub

SSL

在使用grpc如果遇到{"tsi_code":10,"tsi_error":"TSI_PROTOCOL_FAILURE"}的错误,请检查客户端或者服务端当前时间

grpc调试

export GRPC_VERBOSITY=DEBUG

grpc_impl::Channel对象创建流程

下面以创建SecureChannel为例:

grpc_impl::CreateCustomChannelImpl->grpc::ChannelCredentials(抽象类)::CreateChannelImpl->grpc::SecureChannelCredentials::CreateChannelImpl->grpc::SecureChannelCredentials::CreateChannelWithInterceptors->grpc_core::grpc_secure_channel_create->grpc_core::CreateChannel->grpc::CreateChannelInternal

  1. grpc_impl::Channel类在src/cpp/client/channel_cc.cc文件中

  2. grpc_impl::CreateCustomChannelImpl方法在src/cpp/client/create_channel.cc文件中

  3. grpc::SecureChannelCredentials类在src/cpp/client/secure_credentials.cc文件中

  4. grpc::SecureChannelCredentials::CreateChannelWithInterceptors中会调用grpc_core::grpc_secure_channel_create方法,grpc_core::grpc_secure_channel_create方法定义在src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc,grpc_core::grpc_secure_channel_create中会调用grpc_core::CreateChannel方法,grpc_core::CreateChannel方法定义在src/core/ext/transport/chttp2/client/secure/secure_channel_create.cc,grpc_core::CreateChannel方法返回grpc_channel结构体对象

grpc_channel创建流程

  • grpc_channel_create->grpc_channel_create_with_builder创建grpc_channel,grpc_channel结构体定义在src/core/lib/surface/channel.h文件中

  • grpc_channel_init_create_stack方法定义在src/core/lib/surface/channel_init.cc中

  • grpc_channel_element和grpc_channel_filter结构体定义在src/core/lib/channel/channel_stack.h文件中

grpc::ChannelCredentials类注意事项

  • static ::grpc::internal::GrpcLibraryInitializer g_gli_initialize全局变量定义在文件src/cpp/client/channel_cc.cc中,grpc::internal::GrpcLibraryInitializer类的构造函数会为grpc::g_glip实例化grpc::internal::GrpcLibrary对象和为g_core_codegen实例化grpc::internal::CoreCodegen对象

  • grpc::internal::GrpcLibraryInitializer和grpc::internal::GrpcLibrary类定义在grpc_library.h文件中;grpc::internal::CoreCodegen类定义在core_codegen.cc

  • grpc::ChannelCredentials类继承自grpc::GrpcLibraryCodegen类,grpc::GrpcLibraryCodegen类构造函数会执行grpc::g_glip::init函数,grpc::g_glip::init函数会调用grpc::grpc_init

grpc_init函数执行流程

src/core/lib/surface/init.cc/grpc_init函数会初始化所以需要的资源,下面分析几个重要函数:

从grpc_init函数主要作用是初始化所有需要的资源和注册相应需要的插件,注册的插件会在创建grpc_channel对象时调用后面会详解介绍;grpc_init函数使用到了全局变量g_initializations,grpc_init每初始化一次g_initializations加1,grpc_shutdown每调用一次g_initializations减1,g_initializations值变为0才会执行释放全局资源,如果存在多个grpc::channel只有所有grpc::channel销毁才会触发销毁全局资源;grpc为了防止内存泄漏导致释放全局资源是一个特别耗时操作,如果在grpc释放全局资源时同时创建channel可能存在阻塞一段时间,阻塞具体原因请查看src/core/lib/iomgr/iomgr.cc中grpc_iomgr_shutdown函数

插件注册流程和如何被执行

grpc_client_channel插件注册

grpc::internal::BlockingUnaryCall创建过程

grpc::internal::BlockingUnaryCall是阻塞类型的call,创建流程如下:

grpc::internal::Call执行流程

grpc args

  1. grpc_arg结构体在grpc/impl/codegen/grpc_types.h文件中

  2. grpc_channel_args结构体在grpc/impl/codegen/grpc_types.h文件中

  3. grpc_channel_credentials结构体在src/core/lib/security/credentials/credentials.h文件中

  4. grpc_channel_credentials_to_arg方法所在文件src/core/lib/security/credentials/credentials.cc

  5. grpc_channel_arg_pointer_create创建指针类型的grpc_arg,grpc_channel_arg_pointer_create函数定义在src/core/lib/channel/channel_args.cc文件中

grpc_core::grpc_secure_channel_create注意事项

  1. 本方法中会创建2个指针类型的grpc_arg参数,一个指针指向Chttp2SecureClientChannelFactory,一个指针指向grpc_channel_credentials

  2. grpc_core::Chttp2SecureClientChannelFactory::CreateSubchannel函数何时被调用

grpc_channel_filter结构体分析

grpc connector 和 grpc subchannel

grpc_connector结构体

  1. grpc_connector结构体在src/core/ext/filters/client_channel/connector.h文件中
  2. grpc_connector结构体中有类型grpc_connector_vtable的字段,grpc_connector_vtable结构体定义在src/core/ext/filters/client_channel/connector.h中

rpc的创建

Releases

No releases published

Packages

No packages published