Protobuf和GRPC(一)

该博客探讨了在分布式系统中数据交互协议Protobuf和RPC框架GRPC的重要角色。主要内容包括Protobuf的三个组成部分——Core、Compiler和Runtime,以及GRPC的Core、Compiler和Runtime。文章详细阐述了从proto文件到生成代码的基本流程,并对源码进行了分析,特别是GRPC的protobuf插件实现。
摘要由CSDN通过智能技术生成

数据交互协议和RPC框架对于分布式系统来说是必不可少的组件,这个系列主要用来分析Protobuf和GRPC的实现原理,本文主要介绍Protobuf生成代码的流程以及Protobuf与GRPC之间的交互方式。


简要描述

  • Protobuf
    Protobuf主要由三大部分构成:

    1. Core: 包括核心的数据结构比如Message和Service等等
    2. Compiler: proto文件的Tokenizer和Parser; 代码生成器接口以及不同语言的具体实现, 并提供插件机制; protoc的主程序
    3. Runtime: 支撑不同语言的基础数据结构,通常和Core的主要数据结构对应,Ruby和PHP等直接以扩展的形式封装使用Core中的数据结构,而Go和Java则重新实现了一套对应的数据结构
  • GRPC
    GRPC也可以看做三大部分构成:

    1. Core: C语言实现的channel, http, transport等核心组件
    2. Compiler: 各个语言的Protobuf插件,主要作用是解析proto文件中的service并生成对应的server和client代码接口
    3. Runtime: 支撑不同语言的通信框架,通常是封装Core中的C实现,但是Go和Java是完全重新实现的整个框架(grpc-go和grpc-java)
  • 基本流程

    proto files -> tokenizer and parser -> FileDescriptor -> CodeGenerator(内部注册的生成器实现或者外部插件比如grpc插件) -> code


代码生成主要流程的源码分析

  • 入口
//  protobuf/src/google/protobuf/compiler/main.cc
int main(int argc, char* argv[]) {
  google::protobuf::compiler::CommandLineInterface cli;

  // 注册插件的前缀,当使用protoc --name_out=xx生成代码时,如果name对应的插件
  // 没有在内部注册那么默认当做插件,会查找protoc-gen-name的程序是否存在,如
  // 果指定了--plugin=protoc-gen-name=/path/to/bin参数,则优先使用此参数设置
  // 的路径这是grpc的protobuf插件以及go的protobuf实现与protoc命令交互的机制。
  cli.AllowPlugins("protoc-");

  // 注册内部代码生成器插件
  google::protobuf::compiler::cpp::CppGenerator cpp_generator;
  cli.RegisterGenerator("--cpp_out", "--cpp_opt", &cpp_generator,
"Generate C++ header and source.");

  /* ... */

  return cli.Run(argc, argv);
}
  • 参数
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值