生成数据结构和服务接口代码:
protoc --cpp_out=./ helloworld.proto
protoc --grpc_out=./ --plugin=protoc-gen-grpc="/C:/Program Files/grpc/bin/grpc_cpp_plugin.exe" helloworld.proto
protoc生成代码分析
客户端连接服务端 调用服务端的sayhello同步接口
helloworld.pb.h:
Generated by the protocol buffer compiler通信数据结构定义,用于通信前后数据的正反序列化/helloworld.pb.cc实现代码
request
请求封装 new protobuf数据转换 protobuf::Metadata元数据接口转换 可以理解为rttr反射获取结构体的方法 字段类型
Reply
helloworld.grpc.pb.h
Generated by the gRPC C++ plugin.
服务接口定义 Greeter::Service
服务定义
连接
断开
核心接口
async_interface 还生成了异步接口
支持了两种回调:
std::function<void(::grpc::Status)>
::grpc::ClientUnaryReactor* reactor
异步接口在实际做完事情后会调用相应private的ClientAsyncResponseReaderInterface 回调client传输的接口
Server代码分析:
absl std标准库增强库
Strings:提供了一套更方便、更易于使用的字符串处理工具,包括字符串分割、连接、替换、格式化等功能。
Containers:包含了一些新的容器类,如 flat_hash_map、flat_hash_set,它们提供了更高效的哈希表实现。
Algorithm:提供了一些常用算法的实现,如 StrSplit()、StrJoin(),以及其他一些便利性函数。
Time:提供了一套用于处理时间和日期的工具,包括时钟、时间间隔计算、格式化等。
Debugging:提供了一些调试工具,如断言、日志记录、内存泄漏检查等。
反射插件
proto_server_reflection_plugin.h
健康检查
health_check_service_interface.h
grpc头文件
grpcpp.h
接口头文件
helloworld.grpc.pb.h
核心接口:
实现测
class GreeterServiceImpl final : public Greeter::Service {
Status SayHello(ServerContext* context, const HelloRequest* request,
HelloReply* reply) override {
服务定义的同步sayhello接口实现
context, 额外参数解析
request, 原始请求解析
Status SayHello(ServerContext* context, const HelloRequest* request,
HelloReply* reply) override {
客户端代码分析:
服务端ip端口定义和解析
通过服务端ip端口创建通道 这里创建了一个不安全的通道 通道里创建了一个存根/stub
grpc::InsecureChannelCredentials
通过通道调用客户端sayhello接口
请求体
接收体
额外信息
stub远程过程调用sayhello
状态判断
消息解析//处理
客户端和服务端的几个接口定义和接口处理逻辑
写业务代码也可参考
ip端口解析-创建通道-构造存根/session封装-调用接口
序列化数据请求体-调用接口----接收接收体---反序列化接收体
官方给的图里
1 发起调用
2 序列化
3 socket session 发起网络接口
4 请求体反序列化
5 处理请求/本地业务逻辑:螺丝钉关注点
6 返回体序列化
7 socket 回传客户端/同步、异步
8 返回体反序列化
9 本地业务逻辑处理:螺丝钉关注点