gRPC学习记录(三)--proto3知识
在上一篇中,得知proto文件是定義服務端和客戶端通訊接口的標準,說白了就是客戶端該傳什么樣的參數,服務端該返回什么樣子的參數,客戶端該怎么調用,是阻塞還是非阻塞,是同步還是異步,那么就需要對這個東西有所了解,該篇了解基于官方文檔.
建議有能力的還是直接看官方文檔,該文章內容是個人看文檔時的摘錄.
https://developers.google.com/protocol-buffers/docs/javatutorial
https://developers.google.com/protocol-buffers/docs/proto3
1.定義一個message
syntax = "proto3";//指定版本為proto3,默認為proto2message SearchRequest {string query = 1;int32 page_number = 2;int32 result_per_page = 3; }分別對應了生成代碼的String和Integer,另外消息定義中的每個字段都有唯一的編號標簽,也就是tag,比如query是1,page_number是2。這些標記用于以消息二進制格式標識字段,并且在使用消息類型后不應更改。注意,值在1到15范圍內的標簽需要一個字節進行編碼,包括標識號和字段類型(您可以在協議緩沖區編碼中找到更多信息)。在16到2047范圍內的標簽采用兩個字節。因此,您應該為非常頻繁出現的消息元素保留標簽1到15。記住要為可能在將來添加的頻繁出現的元素留出一些空間。
生成后的結構如下:
Paste_Image.png
2.保留tag和字段
如果您通過完全刪除字段或對其進行注釋來更新消息類型,以后的用戶可以在對類型進行自己的更新時重新使用標記編號。如果以后加載相同.proto的舊版本,包括數據損壞,隱私錯誤等,這可能會導致嚴重的問題。確保不會發生這種情況的一種方法是指定保留已刪除字段的字段標簽.
message Foo {reserved 2, 15, 9 to 11;reserved "foo", "bar"; }3.數據類型對照
3.1基本數據類型
| double | double |
| float | float |
| int32/uint32/sint32/fixed32/sfixed32 | int |
| int64/uint64/sint64/fixed64/sfixed64 | long |
| bool | boolean |
| string | String |
| bytes | ByteString |
針對數值型,默認值為0,字符型默認值為空,布爾型默認值為false,這個生成驗證下就能得知.
3.2枚舉類型
定義如下:
message SearchRequest {string query = 1;int32 page_number = 2;int32 result_per_page = 3;enum Corpus {UNIVERSAL = 0;WEB = 1;IMAGES = 2;LOCAL = 3;NEWS = 4;PRODUCTS = 5;VIDEO = 6;}Corpus corpus = 4; }另外要注意,枚舉中第一個元素的tag必須為0.
3.3其他message類型
為searchRequest定義一個返回信息
message SearchResponse {repeated Result results = 1; }message Result {string url = 1;string title = 2;repeated string snippets = 3; }這里用到了repeated,代表這是一個集合,所以翻譯后為
/*** <code>repeated .Result results = 1;</code>*/java.util.List<Demo1.Result> getResultsList();/*** <code>repeated string snippets = 3;</code>*/java.util.List<java.lang.String> getSnippetsList();3.4導入其他proto文件
導入后就可以使用其下定義的一些信息,這里的路徑測試時包名路徑,并不是相對文件夾路徑.
import "myproject/other_protos.proto";3.5嵌套定義
本質翻譯為一個內部靜態類,所以其他message可以按照靜態類模式調用
message SearchResponse {message Result {string url = 1;string title = 2;repeated string snippets = 3;}repeated Result results = 1; }其他類調用
message SomeOtherMessage {SearchResponse.Result result = 1; }3.6 Any類型
可以代指任意類型,使用pack和unpack方法包裹對應的信息.
import "google/protobuf/any.proto";message ErrorStatus {string message = 1;repeated google.protobuf.Any details = 2; }3.7Maps類型
map<key_type, value_type> map_field = N;4.定義Service
service SearchService {rpc Search (SearchRequest) returns (SearchResponse); }5.Options選項
- option java_package = "com.example.foo"; 生成的類所在的包,和package作用一致,不過package一般不使用反向域名作為名稱.
- option java_multiple_files = true;為true的話,生成代碼不會在一個類中,也就是把之前的內部類提到外面單獨成為一個java文件.
- option java_outer_classname = "name";最外層Java類名稱,默認是文件名首字母大寫的駝峰標識后的字串.
- option optimize_for = CODE_SIZE;沒看明白
- int32 old_field = 6 [deprecated=true]; 標識該字段不推薦使用
作者:此博廢棄_更新在個人博客
鏈接:https://www.jianshu.com/p/c23364f32f04
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的gRPC学习记录(三)--proto3知识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gRPC学习记录(二)--Hello W
- 下一篇: gRPC学习记录(四)--官方Demo