![](https://img.shields.io/github/v/release/Gooddbird/tinyrpc?color=2&label=tinyrpc&logoColor=2&style=plastic) ![GitHub repo size](https://img.shields.io/github/repo-size/Gooddbird/tinyrpc?style=plastic) ![GitHub issues](https://img.shields.io/github/issues/Gooddbird/tinyrpc?style=plastic) ![GitHub pull requests](https://img.shields.io/github/issues-pr/Gooddbird/tinyrpc?style=plastic) ![GitHub forks](https://img.shields.io/github/forks/Gooddbird/tinyrpc?style=plastic) ![GitHub Repo stars](https://img.shields.io/github/stars/Gooddbird/tinyrpc?style=plastic) ![GitHub contributors](https://img.shields.io/github/contributors/Gooddbird/tinyrpc?style=plastic) ![GitHub last commit](https://img.shields.io/github/last-commit/Gooddbird/tinyrpc)
作者:**ikerli** **2022-05-13**
**使用 TinyRPC, 轻松地构建高性能分布式 RPC 服务!**
<!-- TOC -->
- [1. 概述](#1-概述)
- [1.1. TinyRPC 特点](#11-tinyrpc-特点)
- [1.2. TinyRPC 支持的协议报文](#12-tinyrpc-支持的协议报文)
- [1.3. TinyRPC 的 RPC 调用](#13-tinyrpc-的-rpc-调用)
- [1.3.1. 阻塞协程式异步调用](#131-阻塞协程式异步调用)
- [1.3.2. 非阻塞协程式异步调用](#132-非阻塞协程式异步调用)
- [2. 性能测试](#2-性能测试)
- [2.1. HTTP echo 测试 QPS](#21-http-echo-测试-qps)
- [3. 安装 TinyRPC](#3-安装-tinyrpc)
- [3.1. 安装必要的依赖库](#31-安装必要的依赖库)
- [3.1.1. protobuf](#311-protobuf)
- [3.1.2. tinyxml](#312-tinyxml)
- [3.2. 安装和卸载 (makefile)](#32-安装和卸载-makefile)
- [3.2.1. 安装 TinyRPC](#321-安装-tinyrpc)
- [3.2.2. 卸载 TinyRPC](#322-卸载-tinyrpc)
- [3.3. 安装和卸载 (cmake)](#33-安装和卸载-cmake)
- [3.3.1. 安装 TinyRPC](#331-安装-tinyrpc)
- [3.3.2. 卸载 TinyRPC](#332-卸载-tinyrpc)
- [4. 快速上手](#4-快速上手)
- [4.1. 搭建基于 TinyPB 协议的 RPC 服务](#41-搭建基于-tinypb-协议的-rpc-服务)
- [4.1.1. 实现 Protobuf 文件接口](#411-实现-protobuf-文件接口)
- [4.1.2. 准备配置文件](#412-准备配置文件)
- [4.1.3. 实现业务接口](#413-实现业务接口)
- [4.1.4. 启动 RPC 服务](#414-启动-rpc-服务)
- [4.2. 搭建基于 HTTP 协议的 RPC 服务](#42-搭建基于-http-协议的-rpc-服务)
- [4.2.1. 准备配置文件](#421-准备配置文件)
- [4.2.2. 实现 Servlet 接口](#422-实现-servlet-接口)
- [4.2.3. 启动 RPC 服务](#423-启动-rpc-服务)
- [4.3. RPC 服务调用](#43-rpc-服务调用)
- [4.3.1. 阻塞协程式异步调用](#431-阻塞协程式异步调用)
- [4.3.2. 非阻塞协程式异步调用](#432-非阻塞协程式异步调用)
- [4.4. TinyRPC 脚手架(tinyrpc_generator)](#44-tinyrpc-脚手架tinyrpc_generator)
- [4.4.1 准备 protobuf 文件](#441-准备-protobuf-文件)
- [4.4.2 生成 TinyRPC 框架](#442-生成-tinyrpc-框架)
- [4.4.3 业务逻辑开发](#443-业务逻辑开发)
- [4.4.4 Protobuf 接口升级怎么办?](#444-protobuf-接口升级怎么办)
- [4.4.5 tinyrpc_generator 选项详解](#445-tinyrpc_generator-选项详解)
- [5. 概要设计](#5-概要设计)
- [5.1. 异步日志模块](#51-异步日志模块)
- [5.2. 协程模块](#52-协程模块)
- [5.2.1. 协程封装](#521-协程封装)
- [5.2.2. m:n 线程:协程模型](#522-mn-线程协程模型)
- [5.3. Reactor 模块](#53-reactor-模块)
- [5.4. Tcp 模块](#54-tcp-模块)
- [5.4.1. TcpServer](#541-tcpserver)
- [5.4.2. TcpConnection](#542-tcpconnection)
- [5.5. TinyPB 协议](#55-tinypb-协议)
- [5.5.1. TinyPB 协议报文格式分解](#551-tinypb-协议报文格式分解)
- [5.6. Http 模块](#56-http-模块)
- [5.7. RPC 调用封装](#57-rpc-调用封装)
- [6. 错误码](#6-错误码)
- [6.1. 错误码判断规范](#61-错误码判断规范)
- [6.2. 错误码释义文档](#62-错误码释义文档)
- [7. 问题反馈](#7-问题反馈)
- [8. 参考资料](#8-参考资料)
<!-- /TOC -->
# 1. 概述
## 1.1. TinyRPC 特点
**TinyRPC** 是一款基于 **C++11** 标准开发的小型**异步 RPC** 框架。TinyRPC 的核心代码应该也就几千行样子,尽量保持了简洁且较高的易读性。
麻雀虽小五脏俱全,从命名上就能看出来,TinyRPC 框架主要用义是为了让读者能**快速地**、**轻量化**地搭建出具有较高性能的异步RPC 服务。至少用 TinyRPC 搭建的 RPC 服务能应付目前大多数场景了。
**TinyRPC** 没有实现跨平台,只支持 Linux 系统,并且必须是 64 位的系统,因为协程切换只实现了 **64** 位系统的代码,而没有兼容 **32** 位系统。这是有意的,因为作者只会 Linux 下开发,没能力做到跨平台。
**TinyRPC** 的核心思想有两个:
1. 让搭建高性能 RPC 服务变得简单
2. 让异步调用 RPC 变得简单
必须说明的是, **TinyRPC** 代码没有达到工业强度,最好不要直接用到生产环境,也可能存在一些未知 BUG,甚至 coredump。读者请自行辨别,谨慎使用!
## 1.2. TinyRPC 支持的协议报文
**TinyRPC** 框架目前支持两类协议:
1. 纯 **HTTP** 协议: TinyRPC 实现了简单的很基本的 HTTP(1.1) 协议的编、解码,完全可以使用 HTTP 协议搭建一个 RPC 服务。
2. TinyPB 协议: 一种基于 **Protobuf** 的自定义协议,属于二进制协议。
## 1.3. TinyRPC 的 RPC 调用
TinyRPC 是一款异步的 RPC 框架,这就意味着服务之前的调用是非常高效的。目前来说,TinyRPC 支持两种RPC 调用方式:**阻塞协程式异步调用** 和 **非阻塞协程式异步调用**。
### 1.3.1. 阻塞协程式异步调用
阻塞协程式异步调用这个名字看上去很奇怪,阻塞像是很低效的做法。然而其实他是非常高效的。他的思想是**用同步的代码,实现异步的性能。** 也就是说,**TinyRPC** 在 RPC 调用时候不需要像其他异步操作一样需要写复杂的回调函数,只需要直接调用即可。这看上去是同步的过程,实际上由于内部的协程封装实现了完全的异步。而作为外层的使用者完全不必关系这些琐碎的细节。
阻塞协程式异步调用对应 TinyPbRpcChannel 类,一个简单的调用例子如下:
```c++
tinyrpc::TinyPbRpcChannel channel(std::make_shared<tinyrpc::IPAddress>("127.0.0.1", 39999));
QueryService_Stub stub(&channel);
tinyrpc::TinyPbRpcController rpc_controller;
rpc_controller.SetTimeout(10000);
DebugLog << "RootHttpServlet begin to call RPC" << count;
stub.query_name(&rpc_controller, &rpc_req, &rpc_res, NULL);
DebugLog << "RootHttpServlet end to call RPC" << count;
```
这看上去跟普通的阻塞式调用没什么区别,然而实际上在 stub.query_name 这一行是完全异步的,简单来说。线程不会阻塞在这一行,而会转而去处理其他协程,只有当数据返回就绪时,query_name 函数自动返回,继续下面的操作。
这个过程的执行流如图所示:
![](./imgs/block_async_call.drawio.png)
从图中可以看出,在调用 query_name 到 query_name 返回这段时间 T,CPU 的执行权已经完全移交给主协程了,也就说是这段时间主协程可以用来做任何事情:包括响应客户端请求、执行定时任务、陷入 epoll_wait 等待事件就绪等。对单个协程来说,它的执行流被阻塞了。但对于整个线程来说是完全没有被阻塞,它始终在执行着任务。
另外这个过程完全没有注册回调函数、另起线程之类的操作,可它确确实实达到异步了。这也是 **TinyRPC** 的核心思想之一。
这种调用方式是 TinyRPC 推荐的方式,它的优点如下:
1. 代码实现很简单,直接同步式调用,不需要写回调函数。
2. 对IO线程数没有限制,**即使只有 1 个 IO 线程**,仍然能达到这种效果。
3. 对于线程来说,他是**
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
c++ async rpc framework. 14w+qps..zip (124个子文件)
reactor.cc 11KB
config.cc 11KB
log.cc 10KB
tcp_connection.cc 10KB
coroutine_hook.cc 9KB
tinypb_codec.cc 9KB
tcp_server.cc 8KB
http_codec.cc 7KB
mysql_instase.cc 6KB
test_http_server.cc 6KB
tinypb_rpc_dispatcher.cc 6KB
tcp_client.cc 5KB
io_thread.cc 5KB
coroutine.cc 5KB
tinypb_rpc_async_channel.cc 4KB
timer.cc 4KB
tinypb_rpc_channel.cc 4KB
fd_event.cc 4KB
tcp_buffer.cc 3KB
net_address.cc 3KB
coroutine_pool.cc 3KB
test_coroutine.cc 3KB
test_tinypb_server.cc 2KB
http_servlet.cc 2KB
http_dispatcher.cc 2KB
http_define.cc 2KB
memory.cc 2KB
tinypb_rpc_controller.cc 2KB
mutex.cc 2KB
string_util.cc 2KB
msg_req.cc 1KB
test_tinypb_server_client.cc 1KB
thread_pool.cc 1KB
start.cc 1KB
tcp_connection_time_wheel.cc 1KB
Dockerfile 1KB
.env 127B
.gitignore 73B
log.h 6KB
mutex.h 3KB
tcp_connection.h 3KB
tcp_server.h 2KB
reactor.h 2KB
tinypb_rpc_controller.h 2KB
tinypb_rpc_async_channel.h 2KB
coroutine.h 2KB
io_thread.h 2KB
tinypb_data.h 2KB
timer.h 2KB
tcp_client.h 2KB
fd_event.h 2KB
http_define.h 2KB
mysql_instase.h 2KB
net_address.h 1KB
error_code.h 1KB
coroutine_hook.h 1KB
config.h 1KB
start.h 1KB
http_servlet.h 1KB
tinypb_rpc_dispatcher.h 1012B
tcp_buffer.h 909B
tcp_connection_time_wheel.h 783B
tinypb_rpc_channel.h 779B
coroutine_pool.h 776B
string_util.h 740B
http_codec.h 734B
memory.h 680B
tinypb_codec.h 658B
http_request.h 621B
coctx.h 599B
abstract_slot.h 598B
thread_pool.h 584B
http_dispatcher.h 568B
abstract_codec.h 559B
tinypb_rpc_closure.h 549B
http_response.h 511B
abstract_dispatcher.h 504B
byte.h 272B
abstract_data.h 253B
run_time.h 200B
msg_req.h 184B
devcontainer.json 1012B
LICENSE 11KB
makefile 5KB
README.md 49KB
nonblock_async_call.drawio.png 453KB
input.drawio.png 244KB
execute.drawio.png 116KB
block_async_call.drawio.png 107KB
tcp_server.drawio.png 82KB
test_succ.png 32KB
wechatpay.png 21KB
alipay.png 14KB
test_tinypb_server.proto 620B
tinyrpc_generator.py 23KB
coctx_swap.S 876B
install-mariadb.sh 4KB
reinstall-cmake.sh 2KB
run.sh 1KB
shutdown.sh 867B
共 124 条
- 1
- 2
资源评论
Lei宝啊
- 粉丝: 2271
- 资源: 1329
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功