网站首页 > 博客文章 正文
对应《GRPC-C++源码分析(三)--main函数主要流程》中1.6节
这一节可能才是最核心的部分,包括大家理解的怎样注册listen和accept描述符,怎样处理读写事件,怎样处理业务逻辑等等。
由于这部分涉及的方面太多了,笔者也只是梳理出了核心的部分供参考,欢迎有精力的小伙伴继续补充。
server->Start(cqs_data, cqs_.size());
在Server::Start的实现中,主要分两部分
//第一部分
grpc_server_start(server_);
- 建立epoll,listen描述符注册
//第二部分
for (auto it = sync_req_mgrs_.begin(); it != sync_req_mgrs_.end(); it++) {
(*it)->Start();
}
- accept描述符注册,读写事件响应,处理注册的service业务逻辑
下面对这两部分分别进行解释
1 grpc_server_start
在grpc_server_start函数中也分两部分说明:
//第一部分
for (i = 0; i < server->cq_count; i++) {
if (grpc_cq_can_listen(server->cqs[i])) {
server->pollsets[server->pollset_count++] =
grpc_cq_pollset(server->cqs[i]);
}
}
- 重点理解server->pollsets[server->pollset_count++]=grpc_cq_pollset(server->cqs[i]);看下图
- 一句话,把cqs中的grpc_pollset指针放到grpc_server的指针数组pollsets中
//第二部分
GRPC_CLOSURE_SCHED(
GRPC_CLOSURE_CREATE(
start_listeners, server,
grpc_core::Executor::Scheduler(grpc_core::ExecutorJobType::SHORT)),
GRPC_ERROR_NONE);
- 这块代码对应了《GRPC-C++源码分析(一)--网络模型》中将start_listeners放入default-excutor线程中执行
- 跟踪下grpc_core::Executor::Scheduler可以清晰看到最终调用的是grpc_closure_list_append方法
- 《GRPC-C++源码分析(七)--bind&listen》中的server_start_listener在这里被调用了
- 下面继续看server_start_listener方法
1.1 server_start_listener
这个函数完成了epoll的创建,listen描述符的注册
1.1-1
- server_start_listener最终调用的是tcp_server_start
- 分段解释下tcp_server_start
//tcp_server_posix.cc
static void tcp_server_start(grpc_tcp_server* s, grpc_pollset** pollsets,
size_t pollset_count,
grpc_tcp_server_cb on_accept_cb,
void* on_accept_cb_arg) {
size_t i;
grpc_tcp_listener* sp;
GPR_ASSERT(on_accept_cb);
gpr_mu_lock(&s->mu);
GPR_ASSERT(!s->on_accept_cb);
GPR_ASSERT(s->active_ports == 0);
s->on_accept_cb = on_accept_cb;
s->on_accept_cb_arg = on_accept_cb_arg;
s->pollsets = pollsets;
s->pollset_count = pollset_count;
sp = s->head;
1.1-2
- 上图没有复杂东西,画出来帮助理解赋值关系而已
- 注意右边的active_pollable,后面继续调用的grpc_pollset_add_fd方法,把创建epoll的描述符epfd放到了这里
for (i = 0; i < pollset_count; i++) {
grpc_pollset_add_fd(pollsets[i], sp->emfd);
}
1.1-3
- epoll的创建,描述符的注册见上图的蓝色框
- epoll的描述符epfd保存在了1.1-2图里的pollable里
GRPC_CLOSURE_INIT(&sp->read_closure, on_read, sp,
grpc_schedule_on_exec_ctx);
grpc_fd_notify_on_read(sp->emfd, &sp->read_closure);
- GRPC_CLOSURE_INIT简单的理解为将on_read方法绑定在sp->read_closure中即可
- grpc_fd_notify_on_read的实现见1.1-4
1.1-4
- grpc_fd_notify_on_read设置完的东西,在1.1-4图中粉色虚线框里的fd_become_readable方法中使用
- 大体意思是将on_read方法绑定在sp->read_closure,然后将sp->read_closure再绑定在sp->emfd->read_closure里。这些绑定会在后面的fd_become_readable中用到
猜你喜欢
- 2024-10-16 Spring Boot集成grpc快速入门demo
- 2024-10-16 如何在 Go 中使用 gRPC?(golang grpc etcd)
- 2024-10-16 gRPC 1.34.0 发布,高性能 RPC 框架
- 2024-10-16 gRPC入坑记(grpc教程 go)
- 2024-10-16 凌鲨(linksaas)的客户端架构(凌肖 鲨鱼)
- 2024-10-16 Python gRPC 入门(grpc python asyncio)
- 2024-10-16 纯干货:微服务开发手册之GRPC(微服务开发入门)
- 2024-10-16 golang中gRPC与gRPC-Gateway的结合使用
- 2024-10-16 gRPC学习记录(一) 概念性知识(grpc特点)
- 2024-10-16 GRPC-C++源码分析(六)--Server-Register
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)