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