Goole 的 protobuf  即 Protocol Buffers  是一个很好的RPC 框架,支持 c++ python  java 接下来进行官方文档的解读,然后你会对protobuf 会有一个很好的认识:

Protocol buffers  are language-neutral, platform-netural extensible mechanism for serializing strutctured data ,think xml . but smaller,faster . and simpler

You define how you want your data to be structured once 。then you can use special generated of soure code to easilly write and read your structured data

to and from a variety of data streams and using a variety of languages

即 protocol buffers 是一个语言中立,平台中立的 可扩展机制用于序列化结构化的数据,就像xml 一样,但是它的体积更小,更快,和更简单(放屁用的,难了谁学),

你需要定义一次你的什么样的数据结构,然后即就可以使用特殊生成的源代码去使用各种语言很轻松的读和写你的结构化数据进入到你的各种数据流中

Protocol buffers  currently supports generated code in java python ,Objective-C and c++ .With our new proto3 language version ,you can also work with Go ,Ruby ....with more

languages to come

Protocol buffers   当前支持 python .java ob c++ 代码的生成,在proto3 版本中,支持了GO Ruby 等更多语言;

java 如何使用之官方文档 tutorials ---指南,教程

the complete sample code for each application is also provided

在官网中每一个应用都提供了完整的例子代码

this tutorial  provides a basic java programmers's introduction to  working with protocol buffeers ,By walking through creating a simple example application 。it shows you how to

      1.Define meassage formats in a .proto file

      2.Use the protocol buffer compiler

      3.Use the java protocol  api to write and read message

这个指南提供了额一个基础的 java 程序在protobuf 运行介绍,通过建立一个简单的例子应用,展示你怎么去

      1. 定义消息格式在你的。proto file 文件中

      2. 使用protbuf 编译器

      3.使用java api 去读写消息

How do you serialize and retrieve structured data like this ?  There are a few ways to solve this problem

那你怎么去序列化和收到结构化数据呢,这是一些方式去解决这些问题

1.use java Seralization  this is the default approach since it's build into the language ,but it has a host of well-known problems ,and also dosen't work very well  if you need to

share data with applications written  in C++ or python

1.使用java 序列化,它是默认的方法,因为他是java 的内置的,但是它有很多已知的问题,所以如果你需要去分享数据和其他语言,它不能进行很好的工作就是不能用的意思

2.you can invent an ad-hoc way to encode the data items into a singal string 。such as encoding 4 ints as "12:3:-23:67"   this is a simple and flexible approach although

it dose require writing one-off encoding and parsing code and the parsing imposes a small run-time cost . this works best for enoding very small data

2.你可以发明一种 ad-hoc  的 方式去编码数据条目成为字符串 ,比如 编码4个整数 为12:3:-23;67  这是一个简单而且灵活的方式,虽然他需要编写一次性的编码和解析代码

以及 解析代码会强加一些运行时的损耗 ,所以如果编码小的数据的话,他可以很好的工作

3.Serialize the data to XML ,this approach can be very attractive since XML is (sort of) human readable and there are binding libraries for lots of languages .this  can be a good choice if you want to share date with other appliation/project  .  however XML is notoriously space intensive  and encoding/decoding it can impose a huge performance penalty

on application  also navigating an xml DOM tree is considerably more complicated than navigating simple fields in class normally would be

3.序列化data 成xml ,这个方法是非常有吸引力的,因为XML 是一个人类可读的和 在很多语言中都有关于XMl的绑定库 如果你想要和其他语言应用进行分享数据,这是一个很好的选择,然而 xml 是臭名昭著的占据空间 ,在应用中,它编解码会强加很多性能执行的坏处损耗,xml dom 树导航 是非常的复杂的比去遍历class字段

-----显然,上面3点都有自己的局限性,看protocolbuffers 给我们提供了什么?

Protocol buffers are flexible ,efficient automated solution to  solve exactly this problem, With Protocol buffers ,you writer a .proto description of data structure you wish to store

From that. protocol compiler creates a class that implemients automatic encoding and parsing of the protocol buffer data with an efficient binary format The generated class provides getter and setters as aunit ,importantly .the protocolbuf format supports the ideas of extending the format over time in such a way that the code can still read data

encoded with the old format

protocol buffers 是一个灵活的 有效的自动化解决方案去正确的解决这个问题(上面的三点),对于Protocol buffers 你可以写一个你希望存储的结构化描述proto  文件

针对这个文件,protocol 编译器会生成一个class文件 自动实现了在有效的的二进制protocol buffer 数据格式中进行编码与解码  生成的class 提供了get set 方法 

重要的是 protocolbuf  格式支持一个思想就是 这个格式随着时间的推移,这些code 仍然可以读取数据,用旧的格式编码

------接下来就是 .pro文件改如何编写,官网有很好的例子:

The proto file starts with a package declaration .which helps to prevent naming conflicts between different project  。the package name is used as the java package unless you

have explicitly  specified a java_package  . as we have here  even if  you do provide a java_package .you should still define  a normal package  as well to avoid name collisions

in the protocol buffers name space as well as in no java languages

proto 文件以一个包名声明开始,它是用来去阻止在不同的工程中的命名冲突,这个包名被用作java  的包 除非你已经明确指定了一个 java_package,但是呢, 尽管你已经提供了一个java_package,你也应该仍然定义一个 正常的包名来避免在protobuf 命名空间中的命名冲突 在不是java 环境下的

  说白了,我们开发中,必须定义package 与 java_package ,包名以java_package  为准

The =1,=2 markers on each element identify the unique 'tag' that field uses in the binary encoding .  tag-numbers 1-15 require one less byte to encode than height number

转载于:https://www.cnblogs.com/iscys/p/9654405.html

RPC 框架之 Goole protobuf相关推荐

  1. gRPC:Google开源的基于HTTP/2和ProtoBuf的通用RPC框架

    gRPC:Google开源的基于HTTP/2和ProtoBuf的通用RPC框架 gRPC:Google开源的基于HTTP/2和ProtoBuf的通用RPC框架 Google Guava官方教程(中文版 ...

  2. 图文分析:如何利用Google的protobuf,来思考、设计、实现自己的RPC框架

    [CSDN 编者按]本文主要分析 Google 的 protobuf 序列化工具的基本原理和使用.利用 protobuf 序列化功能, libevent 网络通信功能,来设计.实现自己的 RPC 远程 ...

  3. 基于Protobuf的分布式高性能RPC框架——Navi-Pbrpc

    基于Protobuf的分布式高性能RPC框架--Navi-Pbrpc 二月 8, 2016 1 简介 Navi-pbrpc框架是一个高性能的远程调用RPC框架,使用netty4技术提供非阻塞.异步.全 ...

  4. 轻量级分布式 RPC 框架

    RPC,即 Remote Procedure Call(远程过程调用),说得通俗一点就是:调用远程计算机上的服务,就像调用本地服务一样. RPC 可基于 HTTP 或 TCP 协议,Web Servi ...

  5. Java分布式 RPC 框架性能大比拼,Dubbo真的最差吗?

    点击上方"搜云库技术团队",选择"设为星标" 回复"1024"或"面试题"获取学习资料 Dubbo 是阿里巴巴公司开源的 ...

  6. 分布式RPC框架性能大比拼

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 来源:鸟窝 链接:http://985.so/aXe2 Dubbo ...

  7. Java分布式 RPC 框架性能大比拼,Dubbo最差?

    点击上方"方志朋",选择"设为星标" 做积极的人,而不是积极废人 Dubbo 是阿里巴巴公司开源的一个Java高性能优秀的服务框架,使得应用可通过高性能的 RP ...

  8. 花了一个星期,我终于把RPC框架整明白了!

    " RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想. 作者:李金葵,来自:51CTO技术栈 R ...

  9. Java实现简单的RPC框架

    一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用) ...

最新文章

  1. 如何改进你的脚本程序
  2. Spring 自动装配模式之构造函数装配方式
  3. 季度报告 选择日期_易方达富惠纯债债券型证券投资基金 2018年第4季度报告
  4. linux 内容替换 注释,为让 Linux 代码注释更加和谐 有人提议用“拥抱”替换 F**k...
  5. 选择、冒泡、插入、快速排序
  6. 我不是来约架,我只是请他们说几句实话——QCon上海2015编程语言专题前瞻
  7. 文本去重的技术方案讨论(一)
  8. u盘在电脑上读不出来?从这几方面排查
  9. html学生基本信息表格模板,学生基本信息表excel模板
  10. linux下怎么批量命名文件,linux下的文件操作——批量重命名
  11. 第一代程序员作家--王小波
  12. 在iPhone上如何备份WhatsApp数据
  13. 51nod3148 松鼠聚会
  14. android crt证书,android https 抓包,root安装证书
  15. 如果看广告还有钱拿,你还会嫌广告太多么?
  16. java核心技术读书笔记—继承
  17. 学会python语法后的第一个爬虫
  18. Eclipse中页面跳转、请求转发
  19. 北乔峰南慕容:懂球帝与虎扑体育的“武功”较量
  20. 【GPS】经纬度DMS格式与DDD格式在线互换

热门文章

  1. Struts2→拦截器、工作原理、拦截器计算Action执行时间、Struts2自带拦截器、拦截器栈
  2. 顺时针90°旋转矩阵
  3. D进制A+B(20)
  4. nedtworking
  5. 2019蓝桥杯B组:完全二叉树权值
  6. UnityGI5:实时 GI 与光探代理体
  7. Unity同一项目双开方法
  8. ubuntu下启动、停止、重启apache2
  9. 安卓调用系统录像功能:1、启动录像返回视频,2、启动录像将视频存储在指定路径下
  10. OPNET网络仿真分析-1.1.1、网络仿真简介