首先需要按照grpc官网上说的办法从github上下载源码,编译,然后跑一跑对应的测试代码。我分析的代码版本为v1.20.0。

在cpp的helloworld例子中,client端,第一个函数是创建channel。

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

我们从这里开始分析,CreateChannel这个函数的具体实现在src/cpp/client/create_channel.cc(这个文件里指定了namespace grpc),CreateChannel再调用CreateCustomChannel,这里会根据creds的类型来创建Channel。

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) = ;

以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这个文件中。

gRPC源码分析(c++)的更多相关文章

  1. gRPC源码分析0-导读

    gRPC是Google开源的新一代RPC框架,官网是http://www.grpc.io.正式发布于2016年8月,技术栈非常的新,基于HTTP/2,netty4.1,proto3.虽然目前在工程化方 ...

  2. grpc源码分析之域名解析

    环境: win7_x64,VS2015.grpc_1.3.1 场景: 在客户端中使用grpc连接服务器,在多次输入非法的地址后,再次输入正确的地址连出现连接超时的现象.侯捷先生说过“源码面前,了无秘密 ...

  3. Go合集,gRPC源码分析,算法合集

    年初时,朋友圈见到的最多的就是新的一年新的FlAG,年末时朋友圈最多的也是xxxx就要过去了,你的FLAG实现了吗? 这个公众号2016就已经创建了,但截至今年之前从来没发表过文章,现在想想以前很忙, ...

  4. gRPC源码分析2-Server的建立

    gRPC中,Server.Client共享的Class不是很多,所以我们可以单独的分别讲解Server和Client的源码. 通过第一篇,我们知道对于gRPC来说,建立Server是非常简单的,还记得 ...

  5. gRPC源码分析1-SSL/TLS

    引子 前几天看到微信后台团队分享了TLS相关文章,正好gRPC里TLS数据加密是很重要的一块,于是整理出了这篇文章. 在gRPC里,如果仅仅是用来做后端微服务,可以考虑不加密.本文太长,先给个大纲. ...

  6. frakti && RunPodSandbox 源码分析

    listen = flag.String("listen", "/var/run/frakti.sock", "...") hyperEnd ...

  7. [Abp 源码分析]十二、多租户体系与权限验证

    0.简介 承接上篇文章我们会在这篇文章详细解说一下 Abp 是如何结合 IPermissionChecker 与 IFeatureChecker 来实现一个完整的多租户系统的权限校验的. 1.多租户的 ...

  8. Envoy 源码分析--程序启动过程

    目录 Envoy 源码分析--程序启动过程 初始化 main 入口 MainCommon 初始化 服务 InstanceImpl 初始化 启动 main 启动入口 服务启动流程 LDS 服务启动流程 ...

  9. Envoy 源码分析--LDS

    Envoy 源码分析--LDS LDS 是 Envoy 用来自动获取 listener 的 API. Envoy 通过 API 可以增加.修改或删除 listener. 先来总结下 listener ...

随机推荐

  1. pwnable.tw dubblesort 分析

    本系列为用于记录那些比较有意思的题目. 题目为一个排序算法,就如题目名称那样,dubblesort,32位程序. 利用思路为栈溢出,先是栈溢出泄露出栈上libc的相关数据从而获取libc地址,再是栈溢 ...

  2. [Javascript] js的类和对象

    类 graph LR 类-->构造函数 类-->prototype对象 类-->instanceof运算符 类-->constructor属性 类-->isPrototy ...

  3. SVN安装和使用(简单版)

    为什么使用SVN? 通常软件的开发需要团队协作开发,每个人负责一个方面,都做完后需要把每个人的代码整合在一起,而每个人的代码方面不同或版本不同就会拖延开发进度对开发项目造成麻烦,如果一个人需要另一个人 ...

  4. [转]How to Download and Setup Blue Prism

    本文转自:https://www.hopetutors.com/blog/uncategorized/how-to-download-and-setup-blue-prism/ The Downloa ...

  5. FTP方式部署Azure Web App

    创建部署凭据 在仪表盘中创建或重置部署凭据,在凭据中设置用户名和密码. 通过FTP方式打开Web根目录 在本地资源管理器中打开FTP地址(例如:ftp://cnws-prod-sha-001.ftp. ...

  6. Java 在PDF中添加水印——文本/图片水印

    水印是一种十分常用的防伪手段,常用于各种文档.资料等.常见的水印,包括文字类型的水印.图片或logo类型的水印.以下Java示例,将分别使用insertTextWatermark(PdfPageBas ...

  7. int-Integer-String之间的转换方式

    1.int和Integer之间的转换:   1) int----->Integer ①自动装箱 ②Integer的构造方法 ③调用Integer的静态方法:static Integer valu ...

  8. 处理范例代码Webapi中的Mongodb的Bson中ObjectId反序列化异常

    微软代码范例中的一个Bug 处理Mongodb的Bson中ObjectId反序列化异常 https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/f ...

  9. Python数据挖掘

    Python之所以如此流行,原因在于它的数据分析和挖掘方面表现出的高性能,而我们前面介绍的Python大都集中在各个子功能(如科学计算.矢量计算.可视化等),其目的在于引出最终的数据分析和数据挖掘功能 ...

  10. socket通信如何处理每次包长度不定问题

    说起来,这是一个漫长的问题: 客户端和服务器通信的结构是:包头+数据长度+数据 客户端请求服务器发送200包数据.包头=request:长度=4(一个int),数据=200: 服务器在收到客户端的请求 ...