久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運營的一線實戰(zhàn)洞察。

ProtoBuf編碼原理與工程實踐:從JSON對比到兼容性坑點

ProtoBuf編碼原理與工程實踐:從JSON對比到兼容性坑點 前陣子幫朋友排查一個接口問題他負責的服務(wù)給別人返回用戶卡片數(shù)據(jù)跑著跑著網(wǎng)關(guān)日志里出現(xiàn)一堆告警響應(yīng)體太大下游客戶端解析超時。我?guī)退褦?shù)據(jù)拉出來一看明明從數(shù)據(jù)庫讀出來也就幾KB序列化成JSON之后竟然膨脹到幾十KB。這種場景你一定不陌生——JSON好用歸好用但只要字段一多、調(diào)用一頻繁重復(fù)的字段名、文本化的數(shù)字就全都變成帶寬和CPU開銷。ProtoBufProtocol Buffers就是專門解決這類問題的東西它先把數(shù)據(jù)的結(jié)構(gòu)用一份.proto文件定義好再通過編譯器生成各語言代碼最終序列化出來的字節(jié)流又小又快解析起來也比JSON省事得多。這篇文章我會從編碼原理講到工程落地把ProtoBuf的語法、工具鏈、兼容性規(guī)則和實戰(zhàn)坑點一次性說清楚。無論你是后端工程師、客戶端開發(fā)還是正在做IM、游戲、物聯(lián)網(wǎng)這類對傳輸體積敏感的項目讀完都能自己上手并且知道為什么要這樣設(shè)計——這一點比單純背語法重要得多。1. 為什么JSON不夠用一個字節(jié)賬本的對比先別急著上ProtoBuf我們得先弄清楚它到底解決了什么問題。JSON最大的優(yōu)點是給人類看的鍵名是字符串數(shù)字是能直接讀的文本結(jié)構(gòu)一目了然。但機器看它其實很累。舉個例子一個很簡單的用戶消息{ user_id: 104653, user_name: demo_user, level: 7, vip: true }這個JSON在網(wǎng)絡(luò)上傳輸時實際字節(jié)長這樣忽略空格{user_id:104653,user_name:demo_user,level:7,vip:true}數(shù)一下大概58個字節(jié)。注意這58個字節(jié)里真正承載有效信息的部分只有多少104653這個數(shù)本身是6個字符而user_id這個鍵名就占了9個字符加上冒號、逗號、花括號開銷比數(shù)據(jù)本身還大。這個例子字段少還好說真實項目里一個訂單消息幾十個字段鍵名重復(fù)出現(xiàn)幾十次體積自然蹭蹭往上漲。更麻煩的是接收方要把這一段文本做詞法分析、語法解析才能把字符串還原成數(shù)字、布爾值CPU成本也很可觀。再來算一下同樣的數(shù)據(jù)用ProtoBuf序列化之后是多少字節(jié)?,F(xiàn)在先不展開原理直接給結(jié)論這條消息用ProtoBuf大概只有16到18個字節(jié)大概是JSON的四分之一。而且這還只是簡單數(shù)據(jù)字段越多、嵌套越深、數(shù)組越大差距越夸張。我之前做過一個真實對比一個包含商品列表、促銷信息、物流狀態(tài)的訂單詳情JSON序列化后是2.1KB切成ProtoBuf后是520字節(jié)左右壓縮了整整四倍。當然ProtoBuf也不是沒有代價——它犧牲了可讀性數(shù)據(jù)不再是肉眼能看懂的文本調(diào)試時必須借助工具抓包看到的是一堆不可讀字節(jié)。工程上不是所有場景都需要上ProtoBuf像純前端頁面渲染、公開API這類重可讀性的場景JSON更合適。但只要是內(nèi)部服務(wù)之間的高頻調(diào)用、長連接推送、存儲空間敏感的數(shù)據(jù)ProtoBuf基本都是首選。那它到底是怎么做到又小又快的答案藏在三件事里去掉字段名、變長整數(shù)編碼、二進制協(xié)議。接下來我們就拆開看。2. ProtoBuf拿什么換來了“又快又小”TLV編碼與Varint原理如果你用各種編程語言的Marshal接口把一個消息序列化成字節(jié)然后直接打印這些字節(jié)你會發(fā)現(xiàn)它們長這樣08 8D 87 06 12 09 64 65 6D 6F 5F 75 73 65 72 18 07 20 01這里面沒有user_id沒有:沒有{。那解析的一方怎么知道每個字節(jié)代表什么意思這就要講ProtoBuf最核心的編碼機制TLVTag-Length-Value即類型-長度-值三段式結(jié)構(gòu)。2.1 丟掉字段名用編號說話JSON的每一對鍵值鍵名都是完整字符串。ProtoBuf完全不要這些字符串它在.proto文件里給每個字段分配一個字段編號比如user_id 1、user_name 2。序列化時每個字段的信息前面只帶一個tag——由字段編號和字段類型組合成的數(shù)字通常只要1到2個字節(jié)。解析方拿到tag去查消息定義就知道后面的字節(jié)對應(yīng)哪個字段。這就好比你在超市買東西JSON像每次在收銀臺念一遍“農(nóng)夫山泉550ml裝一瓶、可口可樂330ml裝兩罐”而ProtoBuf像給商品編碼——直接掃條碼機器一掃就知道是哪個商品。條碼短得多掃起來也快得多。具體的tag編碼是這樣的tag (字段編號 3) | wire_type。低3位存wire_type表示這個字段在字節(jié)流里的編碼方式高位移存字段編號。計算方式如下字段編號1wire type0(1 3) | 0 0x08字段編號2wire type2(2 3) | 2 0x12所以看那串字節(jié)開頭08就是“字段1、varint類型”12是“字段2、長度分隔類型”。tag后面跟的就是字段值本身。2.2 Varint小數(shù)字用1字節(jié)大數(shù)字最多10字節(jié)有了tag接下來要解決數(shù)字體積的問題。JSON里104653是6個ASCII字符也就是6個字節(jié)。ProtoBuf用的是一個叫做Varint的變長整數(shù)編碼數(shù)字越小占用字節(jié)越少。原理很巧妙每個字節(jié)只取低7位存數(shù)據(jù)最高位當作“繼續(xù)標志位”——如果這一位是1說明下一個字節(jié)還是這個數(shù)字的一部分如果是0說明這個數(shù)字到此結(jié)束。解碼時從低位開始把每個字節(jié)的7位有效數(shù)據(jù)依次拼起來。舉個例子編碼數(shù)字300300 的二進制是1 0010 1100從低位開始每7位一組0101100低7位和0000010剩余高位第一組0101100前面還要加“還有后續(xù)”標志位1變成10101100也就是十六進制的0xAC第二組0000010加“到此結(jié)束”標志位0變成00000010也就是0x02所以300在字節(jié)流里就是AC 022個字節(jié)。而104653拆開之后是3個字節(jié)。你看一個原本要6個字節(jié)的數(shù)3個字節(jié)就搞定了。Varint還有個細分選擇。int32、int64是普通整數(shù)如果是負數(shù)因為負數(shù)在內(nèi)存里以補碼存儲符號位全是1會被當成很大的無符號數(shù)最后得用滿10個字節(jié)存儲。這時候應(yīng)該改用sint32、sint64——它們會用ZigZag編碼把負數(shù)映射成正數(shù)-1變成11變成2越靠近0的數(shù)越短負數(shù)也能用1個字節(jié)搞定。很多新手不知道這個區(qū)別在高性能場景選了int32傳負數(shù)結(jié)果發(fā)現(xiàn)體積不降反升這就是踩坑了。還有一種固定寬度的類型fixed32、fixed64、double、float。它們不搞變長永遠占4字節(jié)或8字節(jié)。那什么時候用當數(shù)字普遍很大、幾乎都會超過5字節(jié)時fixed反而更劃算而且編碼解碼不需要遍歷字節(jié)速度更快。典型場景是某些ID、時間戳。實際項目中要看數(shù)值分布來選沒有銀彈。2.3 TLV三段式類型-長度-值現(xiàn)在我們有了tag和數(shù)字編碼還差一種情況字符串、字節(jié)數(shù)組這類不定長的數(shù)據(jù)怎么存這就是length-delimited類型。它的格式是三段式tag 長度(varint) 值(定長的字節(jié)串)比如上面例子里的user_name demo_user對應(yīng)字節(jié)是tag0x12字段2length-delimited長度0x099字節(jié)值64 65 6D 6F 5F 75 73 65 72也就是demo_user的ASCII碼解析時程序先讀到tag知道這是字段2接著讀一個Varint得到長度9再按長度讀9個字節(jié)的字符串一次搞定。整個結(jié)構(gòu)非常規(guī)整——tag負責“這是什么字段”長度負責“這段數(shù)據(jù)到哪結(jié)束”值就是真正的載荷。所有類型都跑不出這幾種wire typewire type含義適用類型0Varint變長整數(shù)int32、uint32、int64、bool、enum164位定長fixed64、sfixed64、double2長度分隔string、bytes、嵌套消息、打包數(shù)組3開始組已廢棄一般不用4結(jié)束組已廢棄一般不用532位定長fixed32、sfixed32、float前面說vip true編碼為20 01就是字段4的varint tag0x20加一個字節(jié)的布爾值1。整個用戶消息就這么組成了08 8D 87 06 // user_id 104653 12 09 64 65 6D 6F 5F 75 73 65 72 // user_name demo_user 18 07 // level 7 20 01 // vip true總共18字節(jié)。讀者可以算算比JSON的58字節(jié)省了多少。到這里你會明白ProtoBuf的體積優(yōu)勢不是靠壓縮算法而是靠協(xié)議層面的高效設(shè)計沒有重復(fù)鍵名、數(shù)字是緊湊二進制、類型信息壓縮在tag里。3. .proto文件語法全解從message到枚舉再到嵌套編碼原理懂了接下來就是寫.proto文件。這是整個ProtoBuf的“契約層”所有語言生成的代碼都以它為準。語法本身不難但我見過很多人在細節(jié)上栽跟頭下面逐一講清楚。3.1 一個最小可用的proto文件以剛才的用戶數(shù)據(jù)為例完整寫出來是這樣syntax proto3; package user; message UserProfile { uint32 user_id 1; string user_name 2; uint32 level 3; bool vip 4; repeated Achievement achievements 5; enum Gender { GENDER_UNKNOWN 0; GENDER_MALE 1; GENDER_FEMALE 2; } Gender gender 6; message Address { string country 1; string city 2; string detail 3; } Address address 7; } message Achievement { uint32 id 1; string name 2; }幾個關(guān)鍵點syntax proto3聲明語法版本必須寫在第一行。現(xiàn)在新項目基本都是proto3。package user相當于命名空間防止不同模塊的消息重名沖突。每個字段的格式是類型 字段名 字段編號。字段編號是必須寫的它是協(xié)議的一部分也是后面兼容性的根基。enum的第一個值必須從0開始并且值0是默認值。消息可以嵌套比如Address定義在UserProfile里面使用時寫UserProfile.Address。這里有個很反直覺的地方對新人不友好proto3里所有標量字段都是“可選”的沒有required和optional的強制聲明。你給一個字段賦了默認值數(shù)字0、空字符串、false序列化的時候它根本不會出現(xiàn)在字節(jié)流里。這意味著接收方解析后讀到的也是默認值無法區(qū)分“這個字段沒設(shè)置”和“這個字段被顯式設(shè)置成了0”。如果要區(qū)分需要用optional關(guān)鍵字或者用包裝類型google.protobuf.Int32Value這種。這個細節(jié)在做協(xié)議更新時尤其重要后面講兼容性時還會提。3.2 標量類型選型對照.proto里的類型和各個語言的類型不是一一對應(yīng)選型會影響字節(jié)大小和跨語言行為。我列一個常用對照表proto類型編碼適用語言默認類型以Go為例建議場景int32 / int64Varintint32 / int64一般整數(shù)負數(shù)時最壞情況會膨脹uint32 / uint64Varintuint32 / uint64非負整數(shù)ID等sint32 / sint64Varint ZigZagint32 / int64可能為負的值如增減量fixed32 / fixed64定長uint32 / uint64大數(shù)值性能優(yōu)先double / float定長float64 / float32浮點boolVarintbool開關(guān)量stringlength-delimitedstringUTF-8文本byteslength-delimited[]byte任意字節(jié)選型有個基本思路默認用int32/uint32/string就夠性能敏感且值域很大的ID用fixed64可能為負的用sint。不要無腦把所有整數(shù)都定義成int64字段多了之后體積差距會被放大。3.3 repeated、map、oneofrepeated是數(shù)組。特別要注意proto3對標量數(shù)值類型的repeated字段默認開啟了packed編碼——也就是說一串整數(shù)不會再每個都帶一個tag而是合并成一個length-delimited數(shù)據(jù)塊里面連續(xù)放著所有值。這個設(shè)計很省體積但有一個歷史坑如果老的proto2接收方遇到packed編碼的repeated字段可能會解析失敗??绨姹就ㄐ艜r最好確定雙方都支持proto3。repeated uint32 levels 1;map類型在proto3里也支持了?;菊Z法mapstring, string labels 2;要注意key只能使用整數(shù)或字符串類型value可以是任意消息類型。map字段本質(zhì)上是一種語法糖實際會被編譯成一個repeated的map_entry消息而且不保證順序。如果業(yè)務(wù)依賴map遍歷順序那得在應(yīng)用層面上排序別指望ProtoBuf給你保持。oneof是用來處理“多選一”的比如請求參數(shù)既可能是微信登錄也可能是手機驗證碼登錄但每次只會有一個。它最大的價值是共享字段編號段多個字段只能存在一個顯式賦了一個就會自動清空其他。oneof login_type { string wechat_code 1; string mobile_code 2; }如果是一次性的協(xié)議版本晉級用oneof很合適但要注意升級后不能隨便加字段進去否則可能造成語義混亂。3.4 時間、空值和嵌套的實用建議時間字段我建議直接用官方擴展的google.protobuf.Timestamp不要自己用string傳時間字符串。官方類型自帶UTC規(guī)范、跨語言轉(zhuǎn)換都給你封裝好而且序列化用的是int64秒數(shù)加納秒體積要比ISO8601字符串小得多。使用前記得在proto文件里加上import google/protobuf/timestamp.proto;??罩祮栴}上面提過如果某個字段很重要允許客戶端顯式置空別用默認值判斷。解決辦法是用包裝類型import google/protobuf/wrappers.proto; google.protobuf.Int32Value level 1;這樣level是一個可空的對象就能區(qū)分“沒設(shè)置”和“設(shè)置為0”。至于嵌套消息官方建議控制在一個合理深度。因為解析時每嵌套一層就多一次方法調(diào)用和內(nèi)存分配嵌套過深的消息不但難維護性能也差。一般兩到三層夠用再深就該重新設(shè)計消息結(jié)構(gòu)了。4. 從proto文件到可運行代碼工具鏈的正確用法定義寫完真正工程化的下一步是編譯成代碼。這一步?jīng)]人能繞開但也是最容易出各種環(huán)境問題的地方。我把流程走一遍順便說幾個常見報錯的處理思路。4.1 安裝protoc和語言插件protoc是ProtoBuf的官方編譯器負責把.proto編譯成目標語言代碼。它本身只管解析.proto具體的語言代碼生成要靠插件比如protoc-gen-go、protoc-gen-java等。安裝 protoc 最省事的方式是用包管理器# macOS brew install protobuf # Ubuntu / Debian apt install protobuf-compiler # 也可以直接從官方二進制包下載放到 PATH裝完驗證一下protoc --version然后裝Go插件以Go為例go install google.golang.org/protobuf/cmd/protoc-gen-golatest go install google.golang.org/grpc/cmd/protoc-gen-go-grpclatest如果生成gRPC代碼這兩個插件都要。裝完后確保$(go env GOPATH)/bin在PATH里不然protoc找不到插件會報protoc-gen-go: program not found or is not executable。這個報錯我見過太多次了基本都是PATH問題。4.2 編譯命令與產(chǎn)物假設(shè)項目結(jié)構(gòu)是project/ ├── proto/ │ └── user.proto └── gen/執(zhí)行protoc --proto_pathproto --go_outgen --go-grpc_outgen proto/user.proto--proto_path指定.proto文件搜索根目錄import里的路徑都基于它解析。--go_out生成純消息代碼。--go-grpc_out生成gRPC服務(wù)的客戶端和服務(wù)端骨架。跑完以后gen/下面會出現(xiàn)user.pb.go和user_grpc.pb.goGo代碼里直接import就行。4.3 生成代碼的實際用法寫一段Go示例演示序列化和反序列化package main import ( fmt log google.golang.org/protobuf/proto yourmodule/gen/user ) func main() { u : user.UserProfile{ UserId: 104653, UserName: demo_user, Level: 7, Vip: true, } data, err : proto.Marshal(u) if err ! nil { log.Fatal(err) } fmt.Printf(marshal size: %d bytes\n, len(data)) var decoded user.UserProfile if err : proto.Unmarshal(data, decoded); err ! nil { log.Fatal(err) } fmt.Printf(name%s level%d vip%v\n, decoded.GetUserName(), decoded.GetLevel(), decoded.GetVip()) }注意生成的getter方法會自動處理默認值所以即使level字段沒出現(xiàn)在字節(jié)流里.GetLevel()也會返回0。這是工程很友好的點——解析方不需要寫一堆空值判斷。4.4 RPC服務(wù)的定義如果要用gRPC還得在proto里定義serviceservice UserService { rpc GetUser(GetUserRequest) returns (UserProfile); } message GetUserRequest { uint32 user_id 1; }編譯后再通過--go-grpc_out生成服務(wù)代碼服務(wù)端只需填充方法體客戶端直接拿到強類型的stub。以前用JSON做RPC時要自己拼HTTP請求、自己寫錯誤處理用gRPC之后這部分工作幾乎全被替代了。5. 兼容性的底層邏輯為什么字段編號就是生命線ProtoBuf最大賣點是“向前向后兼容”但很多團隊只把它當成口號直到某天升級協(xié)議時崩了一地。先說一個我見過的真實事故細節(jié)脫敏某團隊在版本迭代時把一個廢棄字段desc的編號刪除新客戶端上線后老客戶端收到新發(fā)來的消息把某個新字段的數(shù)據(jù)解析成了舊的desc類型結(jié)果一堆本地緩存和展示邏輯直接錯亂。排查了一整天才定位到是字段編號復(fù)用的問題。5.1 字段編號為何不能改、不能復(fù)用回到編碼原理字段編號是tag的一部分。解析方看到tag命中的是編號不是字段名。如果你刪掉字段5、又給新字段用了5老客戶端遇到新字段5的數(shù)據(jù)會按照老字段5的類型去解析語義完全錯位。即使類型一樣字段名變了也沒用——協(xié)議層面只認編號。所以官方規(guī)則非常明確已經(jīng)發(fā)布的字段編號堅決不能修改哪怕你只是改個字段名。刪除字段后編號要用reserved保留防止后人誤用。新增字段只能用全新的編號。對應(yīng)的proto寫法message UserProfile { reserved 2, 15, 9 to 11; reserved old_name, deprecated_field; uint32 user_id 1; uint32 level 3; }reserved后面跟編號或字段名都可以。只要聲明了后續(xù)再有人想用這些編號或名字定義字段protoc會直接報錯。這是防止“歷史包袱”被遺忘的最有效手段。5.2 類型兼容哪些能變哪些不是隨便變編碼原理決定了字段類型不是隨便改的。核心看的是wire typeVarint類int32、uint32、bool、enum、fixed64等之間可以互通但語義可能截斷。32位和64位之間的變更非常危險解析時可能把后面字段的字節(jié)吃掉或遺漏。string和bytes在wire type上是同族但string強制UTF-8不能拿bytes存非法文本再聲明成string。把int32換成float這類會解析成完全不同的值基本等于作死。這背后的原因很直接解析器只會根據(jù)wire type處理字節(jié)不知道你原來定義的是什么語義。類型不匹配相當于讓解析器用錯誤的“尺子”量數(shù)據(jù)結(jié)果當然不對。所以修改已發(fā)布字段類型必須當作破壞性變更處理在上線前評估所有存量客戶端。5.3 枚舉值同樣要有版本意識proto3的枚舉有個特殊坑它是開放類型。也就是說接收方遇到不認識的新枚舉值不會直接報錯而是把它當作未知字段保存下來。在不同實現(xiàn)的語言里行為甚至不一致——有的會給個未知值占位有的會丟進unknownFields。跨語言通信時一個新枚舉值可能導(dǎo)致某個老版本的服務(wù)端把它當0處理業(yè)務(wù)邏輯瞬間跑偏。所以枚舉和字段一樣也建議用reserved保留廢棄值enum Gender { option allow_alias true; GENDER_UNKNOWN 0; reserved 5; reserved GENDER_XXX; GENDER_MALE 1; GENDER_FEMALE 2; }再說一遍枚舉值0一定是默認值設(shè)計時最好把枚舉0當作“未知/未設(shè)置”來用不要讓它承載實際業(yè)務(wù)含義。5.4 新舊版本混部時的對策真實環(huán)境的升級不是瞬間完成的總有老版本進程還在跑。穩(wěn)妥的做法是新增字段全部放到消息尾部用一個新編號段比如原來的字段用到20新版本就統(tǒng)一從21開始加。這樣老版本解析時只會把不認識的字段丟進unknownFields不影響舊字段讀取。而新版本讀舊數(shù)據(jù)時新字段沒有數(shù)據(jù)就用默認值再配合包裝類型判斷是否設(shè)置整套流程就安全了。6. 工程實踐中的坑與最佳實踐清單代碼能跑起來只是第一步。真正決定項目質(zhì)量的往往是那些文檔里不寫、要在線上踩過才明白的細節(jié)。我按照踩坑頻率排個序列成清單每一條都值得多看兩遍。6.1 高頻錯誤對照表錯誤做法問題正確做法修改已發(fā)布字段的編號老版本解析錯亂永不修改新增只加新編號刪除字段但不加reserved編號被復(fù)用數(shù)據(jù)串位刪除時同步reserved編號和名稱把int32改成fixed32wire type變化解析錯位保持同wire type族int64轉(zhuǎn)JSON時直接通字符串前端JS大整數(shù)精度丟失用string類型承載大ID用默認值判斷用戶是否設(shè)置字段無法區(qū)分“0”和“未設(shè)置”用optional或包裝類型反復(fù)創(chuàng)建大消息對象內(nèi)存分配和GC壓力大復(fù)用對象或分頁減小消息體repeated不關(guān)心packed老proto2客戶端可能解析失敗統(tǒng)一proto3版本溝通TCP直接拼包解析丟包/粘包導(dǎo)致解析失敗加長度前綴按完整消息解析6.2 大整數(shù)精度問題這個坑在Web前端特別常見。后端用int64存流水號JSON序列化后到了JavaScript里超過Number.MAX_SAFE_INTEGER就直接丟精度。ProtoBuf本身沒這問題但你在日志、調(diào)試、或者跟只支持JSON的系統(tǒng)對接時一旦轉(zhuǎn)成JSON就會踩雷。我的習慣是所有需要在接口層跨系統(tǒng)傳遞的大整數(shù)ID一律用string定義避免任何轉(zhuǎn)換環(huán)節(jié)的精度流失。6.3 高并發(fā)下的性能觀察ProtoBuf解析確實快但也不是零成本。實測下來它的開銷主要在兩個地方內(nèi)存分配和反射。大量小消息反復(fù)Marshal/Unmarshal時最好復(fù)用對象避免頻繁初始化如果消息結(jié)構(gòu)又大又深解析時的復(fù)制操作會很明顯。還有一種零拷貝思路是直接操作底層字節(jié)但這只適合單語言內(nèi)部通信跨語言場景還是老實走標準解析器。另外不要在一個gRPC流里塞超大消息。單個消息超過幾MB無論序列化還是網(wǎng)絡(luò)傳輸都會拖慢整體RT還可能觸發(fā)各框架的默認消息大小限制。真有大塊數(shù)據(jù)要傳先考慮分片或者走對象存儲再在消息里放引用。6.4 多proto文件與包管理項目大了之后proto文件也會膨脹。我的建議是按業(yè)務(wù)域拆文件比如user.proto、order.proto不要一個文件塞所有消息。用import正確管理依賴導(dǎo)入路徑基于--proto_path。包名用公司域名的倒序跟語言包名區(qū)分開避免生成代碼沖突。線上服務(wù)建議做“協(xié)議版本目錄”比如v1/、v2/一旦v1凍結(jié)再開v2并列演進絕不原位改協(xié)議。工具方面buf這個工具鏈可以做格式檢查、lint和依賴管理還能自動生成代碼比裸用protoc省心很多。尤其是多人協(xié)作時它能保證大家的proto風格一致。6.5 調(diào)試與可視化二進制協(xié)議最難的就是調(diào)不了。我的調(diào)試方案分三層寫單元測試時把marshal后的字節(jié)打印出來對照編碼規(guī)則人工檢查一遍——練手階段強烈推薦。需要看線上消息內(nèi)容時用protoc自帶工具或者把消息轉(zhuǎn)成JSON觀察字段值。抓包時可以用Wireshark的ProtoBuf插件前提是給它配好.proto文件路徑。轉(zhuǎn)JSON這一步要注意jsonpb有專門處理proto3的規(guī)則比如枚舉轉(zhuǎn)成字符串、int64轉(zhuǎn)成字符串直接拿普通json.Marshal轉(zhuǎn)很容易出格式不符的問題。生成代碼里自帶的protojson是標準做法。7. 我第一次從JSON遷移到ProtoBuf的真實體會最后分享一點我的個人經(jīng)驗。曾經(jīng)有個項目一開始接口全用JSON上線后業(yè)務(wù)漲得快日志里全是“響應(yīng)超時”“帶寬告警”。后來我們灰度切到ProtoBuf同一個接口的數(shù)據(jù)包體積降到了原來的四分之一服務(wù)端的CPU占用也明顯下降。但真正讓我對ProtoBuf改觀的不是性能而是協(xié)議的約束力。用JSON的時候接口文檔和實現(xiàn)總在悄悄脫節(jié)——文檔說你傳user_id代碼里寫成uid前端按文檔寫后端按代碼讀線上吭哧吭哧查半天。換成ProtoBuf之后消息結(jié)構(gòu)是編譯期強類型字段名、編號、類型全被編譯器盯著想不一致都不可能。當然我也踩過不少坑。比如有一次給字段加了reserved雖然protoc編譯通過但我在潛意識里以為這個字段還在寫代碼時連續(xù)引用了舊字段名編譯直接報錯那一刻反而覺得省事。協(xié)議設(shè)計這東西編碼只是工具真正硬核的是演進策略你每定義一個字段都要想到它不是今天寫完就完而是會成為線上所有服務(wù)的契約。字段編號、枚舉值、包名這些一旦發(fā)布就在很大程度上鎖定了。如果讓我給新手一個建議那就是先在工具里把字節(jié)流手推一遍搞清楚Varint到底怎么變長、tag如何組裝再去用各種語言的生成代碼。很多人用了很久ProtoBuf碰到線上解析錯亂還是一臉懵就是因為底層編碼只是個黑盒。把原理吃透了后面所有工具鏈、語法糖、兼容規(guī)則都可以順著推導(dǎo)出來而不是靠死記。下一步你可以試試自己寫一個包含數(shù)組、枚舉、嵌套消息的proto文件定義service跑一遍gRPC再人為構(gòu)造一次字段編號沖突看看解析結(jié)果長什么樣。多試幾次踩過幾個坑你才能真正說一句ProtoBuf我學會了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
深田咏美亚洲精品福利社 | 久草大| 日本一级真人黄色性爱视频| 校园春色美腿丝袜 | 玖玖爱一区在线| 91伊人大香蕉| 丰满欧美放荡少妇在线| 日韩亚洲欧美中文字幕| 福利社区午夜一区二区| 综合久欧洲| 日本精品加勒比海一区| 乱伦熟女专区| 日韩精品色呦呦| 中文人妻av高清一区| 日韩精品人妻一| 九九色图| 国产麻豆91欧美一区二区久久婷婷国产精品| 国产400孕妇孕交群| 亚洲欧美国产中文视频| 久99| 超碰一区二区| 日韩熟女三十乱伦| 久久久久成人蜜桃精品| 亚欧洲日韩国产精品| 久久av无码| 95精品在线| 大白逼三四级| 亚洲国产尤物yw在线观看| 级品肉射| 日本高清免费一本视频在线观看| 亚洲色丰满少妇高潮| 97超碰9| 天天色,天天干,天天干| 久久国产视频专区一二三| 97在线观看视频| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲一区二区三区麻豆传媒| 日韩精品免费高清视频在线| 999 久久久| 欧美人人曰人人操人人射射| 97超碰免费人人性爱| 夜夜爽夜夜爽| 美女91色黄18| 91free福利| 日日嗨AV一区二区夜夜| 欧洲成人性爱视频| www被窝色com| 亚洲精品乱码久久久久久蜜桃麻豆 | 黄页视频网站野外| 劲爆欧美人妖三区91| 人人操人人大香蕉| 91欧美巨乳| 日韩婷婷| 欧美国产精品久久九九| julia ann久久| 免费一级毛片在线视频观看| 黑人精品XXX一区一二区| 久草草一二三四区久久| 激情文学网伊人| 伊人九九| 亚洲黄色网址| 中文字幕神马久久| 四虎国产成人精品免费一女五男| 综合av社区| 夜夜高潮夜夜爽高清视频一| 一二三四视频中文字幕在线看| 精彩久久中文| 嗯嗯啊在线视频| 人人艹亚洲| 蜜汁欧美| 人人妻人人色一区二区三区| 欧美在线啊啊啊| 天天日天天色| 激情五月综合开心五月| 色约约一区=区三区| 青女在线| 九九热免费在线国产视频伊人五月| 国产中文精品一区二区在线观看| 超碰成人人人爽人人爽| 啊啊啊啊啊啊好多水| 国产一区二区在线播放,久久亚洲精品中文字幕第一区,亚洲精品在线中文字幕视频 | 美腿丝袜高跟网免费视频免费视频| 无码国产精品久久久久| 日韩Va亚洲va欧美Ⅴa久久| 丝袜亚洲综合| 一本大道久| 欧美日韩青操| 青青草啪啪网| 嗯嗯啊啊好大好爽| 午夜精品久久久久久久99热影院| 中美日韩毛片| 欧美韩国你懂得在线| 精品人妻1237| 99啪啪| 久久久久久国产成人| 人妻精品一区二区三区| 97超碰久久色| 久久99手机免费视频| 97九色人妻| 国产成人亚洲精品无码古代早漏男| 欧美狠狠| 亚洲婷婷丁香在线| 久久久久久免费电影| 亚洲综合大片| 亚春色色| 传媒在线观看一区二区三区| 久久久男人的天堂| 走光一区92下载| 加勒比日本在线| 91大神电影天堂| 网页导航五月天免费一二三区| 国产综合网站在线播放| 久久99人妖视频国产| 看免费的黄片| 曰韩操B| 午夜视频好爽啊| 国产免a费看黄片在线| 国产精品制服丝袜清纯唯美| 国产亚洲综合欧美一区| 欧美日韩情色一区二区| 欧美操逼一二三区| 人妻久久久久久久久久久久久久久| 综合欧美日本三级| 婷婷五月天av| 日韩三级一区 | 天天综合网站| 人妻在线大香蕉| 日日摸日日碰| 九九九九一区| 亚洲无码国产探花在线观看| 日本国产高清色www视频在线| 中文字幕99999| 人妻少妇精品| 国产Aα| 69精品久久久久中文字幕| 日本污ww视频网站| 国产综合久久久鬼色| 欧美在线啊啊啊| 亚洲高清男人天堂| 久久国产精品m码| 91丨国产丨白浆秘 洗澡动漫| 欧美黑人极品高潮喷吹熟女黑人性暴力日韩在线欧美极品一区二区老师黑人潮喷一 | 日本 情色 1区2区3区| 床戏久久久av一区二区麻豆| 绯色一区二区三区不卡少妇 | 精品九九| 蜜桃无码AV一区二区| 久操黄色视频| 国产精品在线一区二区| 啊啊啊好多水| 日韩久久激情精品| 久久国产精品,久久国产| 少好三P| A一区片| 久久麻豆一区二区| 久久久国产精品亚洲精品| sewuyueav| 精品人妻免费观看| 天天欧美色| Aa东京男人的天堂| 18禁免费视频| 噜噜噜久久亚洲精品色情| 超碰色大香蕉| 国产区91柔拿会所技师| 抽插爽| 久久久久久久久久久久色网| 一级黄色性爱A级片| 91人妻视频在线| 欧美色蜜桃97| 亚洲乱码国产乱码精网站| 亚洲有薄码区日本系列中文字幕| 天堂av最新电影网| 高清无码久操视频| 亚洲色吧网| 97国产|免费| 无码黑人精品一区二区三区三| 插入综合网| 视频在线中文字幕| 免费αⅴ在线观看| 97超碰亚洲| 草草影院最新网址| 九九九九久久久| 国产日韩中文字幕欧美| 亚洲啪啪视频一区二区| 五月天久久婷婷亚洲| 天天综合网91| 91 丝袜在线| 大香蕉78| 国产大片精久久久久久| 久久久久久久伊人精品| 欧美色日本| av毛片aaaaa免费看| caopeng97| 99rre在线精品99re8| 人人摸人人叼| 亚洲素人综合| 99热色精品| 日日夜夜骑| 久久五月视频| 97精品一区二区视频| 天天影视色香色欲| 亚洲在线| 国产亚卅97| 国产精品噜噜噜日日日| 久久国内| 久久久99999久网站| 国产野战露脸在线播放| 欧美影音在线| 欧美做爰无码A片视频| 好一吊区二区| 久久久蜜桃一区二区三区| 亚洲日韩美女丝袜美腿人妻视频| 久久久国产三级黄色片| 亚洲一区二区av| 女优免费一区二区永久| 亚洲无线观看久久| 久久这里| 五月大香蕉| 伊人麻豆传媒| 91处女在线视频| 九九黄色网| 国产精品熟女一区二区三区| 九一综合精品视品av| 欧美Aⅴ| 欧美第二页午夜| 国产欧美一区激情交| 怡红院久久老司机| 91嫩草欧美| 成人日本视频人妻在线| 激情综合网激情综合| 熟女欧美日韩综合婷婷| 亚洲av无码成人精品国产| 九九热av| 欧美综合制服在线| 青青草吊丝| 温婉少妇玩3p| 91精品人妻偷情| 五十路人妻在线| 蜜臀av一区二区三区免费观看| 中文字幕人妻资源在线| 日本顶级天天操狠狠操夜夜操中文字幕| 亚洲黄网在哪免费看| 97超碰美女| 97视频在| 欧州色图区| 国人欧美精品一区二区| 色波多| 欧美手机在线综合| 国产男女无套97| 婷婷色导航| 正在播放国产精品一区| 麻豆亚洲AV成人无码久久精品| 香一区二区三区| 欧美日韩性爱精品| 免费黄色片。| 亚洲AV成人精品网站在AV| 中文字幕无码不卡啪啪| 青青欧美| 日本啊啊啊啊啊视频| 色综合久| 综合欧美日本三级| 狠狠操夜夜| 精品视频在线观看| 伊人国产AV| 天天躁狠狠躁av| 九九精品美女高溯喷水| 狼人久草| 另类小说五月天| 一线黄色免费性爱片| A 天堂| 99少妇| 99re在线视频国产| 97AV在线免费观看| 五十路人妻在线| 久久国模av| 欧洲天天在线| 九九久久久九九| 男人的天堂2010| 成人片在线播放| 秋霞蝌科网日本一区| 先锋影音av先锋一区| 中文字幕三四区| 亚洲 欧美综合| 玖玖大干人妻| 黑丝制服中文字幕| 日韩99999| 国产精品久久泡妞网站| 亚洲欧美洲综合| 日本男人天堂| 欧美狠狠干| 搡老女人老91妇女老熟女| 9精品久久久久| 中国91AV| 色婷婷一区二区三区久久| 91丝袜视频在线观看| 日韩精品 欧美激情| 久久风骚城市人| 91青青| 四虎AV在线播放| 夜夜久久久| 亚洲在线欧美| 一级日本牲交大片好爽在线看| 人人操人人插 - 百度 - 百度| 久久久新亚洲AV| 国产精品不卡一区二区电影| 久久久久亚洲三级电影| 免费看污网站| 色屁屁影院www国产| 97国产精选| 国产精品另类| 日本久久女同性恋视频| 另类小说综合网| 26uuu国产日韩综合在线观看| 操操操日本的逼| 欧美色性爱| 欧美疯狂做爰xxxx| 超碰 另类 欧美| 欧美性爱一区| 欧美色图99| 蜜臀久久99精品久久久久久婷婷| 国产亚洲99久久精品熟| xxxx网站亚洲精品| 色婷婷综合网| 青青草色情网站视频| 东京热99999| 亚洲国产97| 欧美日韩国产色五月综合在线| 欧美色图99| 国产精品女aA片爽爽视频| 亚洲精品乱码线路中文字幕| 99热只有这里有精品| 色色热| 97免费视频网| 黑人性欧美| 家庭乱伦国产精品| 大香蕉婷婷| 成人综合网 欧美| 少好三P| 水多多映视AV| 91一起操| 97 九色| 亚洲女人91| 在线有码中文字幕| 亚洲中文字幕网| 嗯……啊…嗯嗯…啊…好舒服| 97伦乱| 九九综合九九综合| 久久久久久亚洲精品不卡人乳| 99在线观看无大码| 亚洲人妻久久| 自偷自拍的亚洲视频| 操美女人妻| 午夜精品久久久久久久久久久久久| 人妻无一区二区三区| 99热精品免费| 熟妇一区,二区,三区。| 伊人专区一区二区三区| 熟妇在线视频一区二区| 综合网亚洲1| 欧美区亚洲区偷拍区| 人妻熟女av国产网站| 欧美 日韩 另类 亚洲| 夜夜爽夜夜爽| 人妻激情另类| 欧美91在线| 色色色999| 亚洲日韩欧美一区二区| 日韩乱伦AⅤ| 无码heyzo高清一区| 狠狠躁久久躁| 亚洲成A∨人影院在线欢看| 9超碰免费| 91免费看一区二区三区| 六月婷激情福利天堂69| 91bbb| 婷婷五月色| 午夜视频久久久| 无码WWW免费视频网站| 夜夜爽妓女| 亚洲在线| 亚洲色图 欧美热图 清纯唯美 另类自拍| 欧美日韩另类激情图片| 午夜天堂精品久久久久91| 蜜汁欧美| 亚洲天堂,男人| 欧美se综合| 婷婷丁香六月| 1240青青草一区二区三区视频天爱| 人人爱操| 国产自制av蜜乳| 青青青国产| 人人搞人人插人人操| 91色鬼| 2018天天日天天日| 夜夜人妻爽| 人干人人人操人人摸| 九九av| 插欧洲美女欧美精品| 久9久9久9久9久9久9| 免费精品福利在线观看| 亚洲第一页色网| 香蕉综合网| 青青草毛片| 18岁禁 茉莉成人久久| 免费?级毛片无码?∨蜜芽试看| 欧美天天谢综合网| 天天操夜夜嗨| 亚洲一区中文字幕| 夜夜中出国产| 高清国产性猛交xxxx乱大交| 97中文字幕一区| 成人 日韩欧美一区| 国产精品精品系列在线观看| 97爱b| 国产人妻天天干精品| 国产精品久久蜜乳av| 亚洲天堂东京热| 亚洲国产av中文字幕久久| 精品九九淫乱男| 成人黑料社久久| 97天天摸天天爽| 蜜桃视频一区二区三区| 人妻AV在线| 国产亚洲欧美每日在线| 97这里有精品| 欧美91网站| 色婷婷香蕉| 日韩性爱小视频| 亚洲AV在线资源| 91丨国产丨白浆| 国产熟女完整版中字| 亚洲狠狠入| 久草资源在线视频官方总站日韩丝袜美腿 | 人妻大相焦在线| 人、人、摸,人、人、草| 欧美不在线| 欧美精品久久| 青苹果影院男人的天堂| 国产精品三级视频网站| 岛国在线免费视频| 999精品女人| 后入式在线免费观看60秒| 亚洲天堂久久| 第四色亚洲色图| 人摸人人操人| 国产91av在线播放| 欧美黄业| 欧美中日韩XXXX| 91美女看B| 日本久久久久久久久| 亚洲啪啪视频一区二区| 国产1024在线播放| 蜜臀AV午夜精品久| 欧美91网| 熟妇人妻一二三区免费| 麻豆 亚洲 97| 日韩超碰精品综合| 欧美中文字幕男人天堂久久精品| 色综合九九| 淫荡少妇免费| 日韩在线一区二区| 亚洲欧洲日韩天堂av| 亚洲综合欧美| 91高潮| 深喉吞精| 欧美丝袜亚洲| 国产黑白丝在线| 日韩天天本| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 亚洲强奸乱伦影视网| 国产午夜在线观看视频| 秋霞午夜成人福利片片| 九月伊人中文字幕| 91蜜桃传媒精品久久久一区二区| 人妻五十路在线| 日日做夜狠狠爱欧美黑人| 二对二中文字幕。| 色欲人妻一区二区在线| 国产老熟女| 亚洲综合另类欧美久久久| 欧美日韩色图片| 亚洲男人天堂2019| 夜夜爽77777| 日韩亚洲美女一区久久| 久久婷婷国产一区二区色| 久久天堂婷婷网| 长长久久免费视频| 桃色六月天| 啊啊啊啊啊啊好湿好爽视频| 青女在线| 伊人9| 亚洲色图 91| 熟女少妇视频| 亚洲色图亚洲| 人妻中文字幕精品无码| 亚洲欧美在线观看免费| 欧美性爱视频免费一区一A| 欧美劲爆视频一区二区| 99九九久久| 粉嫩国产精品久久粉嫩| 91网亚洲| 日韩久草| 综合亚洲欧美| 国产精品麻豆成人av| 欧美人人曰人人操人人射射 | 大香蕉伊人网| 乱伦一二三区| 亚洲午夜福利在线影院| 亚洲精品久久久久久久蜜桃臀| 99热最新| 九九九久千久久激情蜜桃在线看| 1204av韩国| 91欧洲入口| 国产三级片在线观看| 1000部熟女视频在线观看| www.91理论| 色情综合网| 婷婷国产精品九区| 久久九精品| 中文字幕激情小说| 国产极品粉嫩馒头一线天av| 国产激情在线| 91亚州日韩高清| 黑人精品久久97| 97国产|免费| 黄片qw| 国产做?爰片久久毛片?片美国| 亚洲欧美大香蕉| 色综和网| 丝袜美腿av女优在线| 岛国免费黄色网址| 欧美制服网站美腿丝袜| 中文字幕一区二区三四五区日日骚| 久久日韩肥臀| 女人被男人桶爽视频网站| 99免费视频| 国产情色第一第二页在线观看| 69精品| 1024人妻熟女一区二区三区| 色哟哟-国产专区| 婷婷10月天青娱乐| 欧美αv.com| 久久久工口| 久草看看看| 国产精品久久99日日| 玖玖97综合 | 激情五月天中文字幕色| 久热91| 日韩一级二级三级免费看完整版国语版 | 青青草好吊| 亚洲男人综合| 黄页大片在线观看| 久久精品电影在线| 欧美成人性爱视频大全| 60秒免费视频| 亚洲成人性爱网站在线播放| 91老司机在线视频免费观看| 婷婷激情四射| 97av在线视频| 97在线播放 | 一类av片在线看| 日韩中文字幕熟妇人妻| 91性片| 国产 码在线成人网站| 日产123区精品免费观看| 伊人网青青| 啊嗯好大视频在线观看| 成年人黄色| 97五月天| 福利视频网站| 一区黄二区黄| 亚欧高清| 欧美亚洲一区二区久久久婷精品大包诱| 2017亚洲天堂| 97在线国产精品| 电家庭影院午夜69久久夜色精品国产69乱 | 亚洲欧美999| 夜夜爽77777| …亚洲黄色厕厕女女在线播…| AA丁香综合激情| 怡红院成人视频| 婷婷色综合| 国产一区在线播放| 日韩熟女精品无码专区一区二区| 97爱爱| 97免费视频网| 2019天天干天天操| 欧美桃色网| 91日韩在线| 淫荡网址| 国模不卡一本二本三电影| 91搞逼视频| 乱子伦一区二区三区国产精品| 日本丝袜人妻内射| 日本精品加勒比海一区| 天天插天天插| 无码直播久久久| 亚洲和欧美裸体美女双飞视频| 国产精品美女在线一区| 国内精品久9| 久久天堂婷婷网| 蜜臀无码视频在线观看| 99色骚| 极品尤物在线观看| 一区二区乱码福利| 亚洲精品国产av天美传媒| 亚洲一区二区三区四区视频| 国产熟女无套内射| 日韩三级在线观看mp4| 成人性爱高清视频免费看| 不卡二三区人妻少妇| 久久久久久性爱视频| 亚洲成人av电影在线| 精品玖九九久| 精品十三区| 黄色av一区二区在线| 懂色Av| 天天操熟妇| 99国内精品| 亚洲毛片一级带毛片基地| 亚洲小说视频| 中文字幕女同在线| 骚逼高潮久久精品| 一区二区三区黄片免费观看| 国产农村妇女毛片精品久久| 久久久不卡区一区二区三区久久久| 96久久精品一二三区色欲| 神马久久久久久久| 国产成人啪一区二区| 91美女在线精品视频| 黄片aaaaa一区| 日本韩高清无砖码22o| 国产丝袜高跟美女av免费观看| 91久久精品国产| 最近2019中文字幕国语免费版| 天天综合91| 新怡红院| 啊啊啊啊啊啊啊啊要喷了| 在线观看十八禁| 簧片免费看视频| 国产精品盗摄 偷窥盗摄| 78精品| 大香蕉92| 午夜福利区| 999日韩中文精品观看视频。| 手机在线看片免费人成视频| 欧美A片中文字幕| 午夜精品久久久久久久久久久久久| 欧美天天综合站| 不卡九肏| 精品熟女一区=区三区| 另类专区在线观看| 亚洲色图欧美视频| 国产欧美精选激情视频| 欧美不卡在线一区二区| 女色综合| 国产精品操| 91欧美经典| 五月天久久人妻| 精品人妻视频一区二区在线播放 | 91美女中出| 免费看日本操逼视频| 91快色色色色色| 370p日韩欧美亚洲精品| 日韩免费高清大片在线| 日本潮催一卡操| 欧美日韩在线视频网站| 日韩肏逼视频| 91社区伊人| 秋霞网无码| 日韩成年人性爱视频| 欧美色欧美| 探花视频免费观看国产专区| 日韩视频中文字幕| 亚洲欧美第一页| 精品无码久久久久久久久果冻糖心| 亚洲综合在线第一页| 99久久99九九99九九九| 91观看 国产白丝| 天天综合网~91| 啊啊啊啊啊啊好多水| 超碰91在线| 思思久热在线精品66| 在线日韩日本亚洲国产| 成人小说另类在线| 亚洲国产欧美一区二区潘金莲| 人人贴人人摸| a级成人毛片免费视频高清| 中日韩久久久| 无套内射性感少妇视频| 大香蕉啪啪啪| 久久久久国产亚洲一区欧美色图日韩 | 欧美v亚洲v综合v国产v妖精| 天天日天天干天天色| 色翁荡息又大又硬又粗又爽| 国产黄片在线免费观看| 日韩不卡毛片Av免费高清| 天天插天天操| 黄色大片一区二区密桃丝袜| 久久有碼| 日韩电影免费网站麻豆视频| 欧美黑人熟妇精品91| 97超碰人人模人人拍人人| 丰满人妻一区二区三区性色| 日韩欧美中文| 女优视频第10页| 96AV久久久| 嗯嗯啊啊的视频| 国产免费小视频| 日韩精品在线放| 国产精品香蕉热久久新品| 五月色综合| 午夜欧美J进J出白浆流出久久久 | 99re这里| 国产熟女无套内射| 超碰无码加勒比| 激情五月天色色网| 久久国产精品,久久国产| 91无摭挡| 丁香七月婷婷| 亚洲综合中文字幕有码| 久久久久久久极品香蕉视频| 欧美 亚洲 综合 制服 另类| 熟妇熟女一区二区三区| 天天看天天在线精品| 激情丁香五月婷婷| 欧美78| 久久黄人人爽视频| 免费亚洲黄色视频在线观看| 亚洲中文字幕97久久精品少妇| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 国产精品福利视频播放| 丁香婷婷啪啪| 亚洲污污网站| 高清孕妇孕交| 国产成人久久久精品免费AV| 91夜夜蜜桃臀1区2区3区| 在线播放欧洲免费av| 91丨九色丨国产丨人妻在线| 99爱精品| 91精品少妇搡搡搡| 欧美特大AA级黄片| 久久极品一区二区| 超碰综合97在线| 影音先锋日本一区二区| 欧插网站| 中文 人妻 制服| 国人欧美精品一区二区| 日本精品国产视频| 神马久久久久久久| 国产这里只有精品| 久久久少妇诱惑精品视频| 国产日韩精品人妻久久久久色欲网站 | 日韩欧美大片免费高清啪啪| 日日夜夜狠狠| 欧美第五页| 性爱乱伦网址| 欧美综合 站| 国产又黄又爽又刺激久久久久久| 亚洲欧美九九| 精品黄色电影| 亚州色交| 欧成人精品H无码| 丁香六月啪啪| 欧美se综合| 99久视频| 亚洲人妻日日日| www.色婷婷.com| www.人人摸在线视频| 精品一区二区人妖| 天天干1区2区在线| 黄色大香焦1级‘′‘| 国产精品一区二区后入| 久久精品国产亚洲AV嘿嘿| 亚洲激情色片| 欧美综合娱乐久久| 亚熟hd视频在线| 亚洲图片婷婷五月天| 性生活无遮挡纯毛片在线看| 色欲av一区二区三区蜜芽| 97久久超碰国产网站| 综合久久久久久久久91| 久久国产对白激情浪潮| 人人操人人插人人摸人人干| 无码久| 亚洲一区二区精品福利| 99日视频在线免费| 婷婷五月成人| 看全色黄大色大片免费视频| 亚洲AV资源| 国内毛片无遮挡国产| 熟女一区二区三区| 日本熟妇人妻中出视频| 青青草华人在线欧美在线| 大香蕉久操| 中文字幕乱亚洲美女精品一区| 中文高清一区二区的| 亚洲在线网站| 亚洲大胆人体av| 333kkkk·亚洲com久久| 久久有码视频| 四虎 精品 WWW| 亚洲图片激情综合另类| 熟女熟妇伦久久影院毛片一区二区| 搡老熟女老女人老熟妇免费视频| 好涩综合| 东北老女人的激情视频| 福利色色| 视频国产欧美在线播放| 人人澡人人弄| 狠狠激情综合狠狠操中文字幕| 国产传媒一区二区三区| 中文字幕久久精品一区| 国产成人自拍视频在线| 亚洲中文字幕在现观看| 亚洲性猛| 日韩人妻资源网| 不卡av在线中文字幕| 欧美小说区视频区| 超碰 另类 欧美| 中文字幕 国产区| 老熟女乱伦片| 超碰在线综合97| 日韩欧美成人大香蕉| 日本性爱少妇| 久久AV无码AV| 天天综合站| 91在线视频免费中出| 国产亚洲日本精品在线| 天天噜| 伊人色综合欧美| 炮色五月| 免费a在线播放v| 亚洲欧洲成人在线电影| yazhouzaixian| 黄色高清久久无码依人| 99热超碰| 亚洲中文国际强奸字幕| 欧美激情久操网| 亚洲狠狠入| 极品久久久久久久久久久久久久| 亚洲欧美精品一区天堂久久| 日本性爱不卡视频| 精品国模无码| 极品肉射| 日日AAvv| 日欧毛片久久| 欧美日本久久精品一区 | 亚洲国产激情国产av| 琪琪精品免费一区二区三区| 91精品国产综合久久久蜜臀酒店| 中文字幕精品三级久久久| 日本97久久久精品| 麻豆精品久久久久久久| 久久99视频| 逼逼逼逼操操操操操操操操操午夜剧场| 放黄片放3级黄片没穿衣服| 国产97在线播放| 操淫穴亚洲五月丁香| 亚州色站 日韩电影| 少妇二级| 91校园春色长篇| 激情综合婷婷| 天天看,天天做| 欧美人妻精品一区二区| 亚洲熟女精品| 国产最火爆久久国产网站网站| 国产久久久久久| 欧美亚洲特P| 农村少妇久久久久久久| 中出20p| 久久九九精品一区二区| 日本免费一区二区不卡| B049AV在线播放| 性爱AV天堂| 亚洲在高跟鞋自慰久久在色线| 亚洲综合网图| 欧洲射精91| 亚洲中文字幕乱码无码一区二区| 九九热精品免费视频| 丰满人妻一区二区三区免费,| 五月婷婷AV| 中文字幕文字幕无码一区二区三区电影99| 夜夜夜爽www精品视频| 日本熟女中文| 自拍鲍鱼一区在线高清观看免费| 国产一区二区av综合| 强奸乱伦av电影| 国产熟女乱论| 亚洲精品人妻吞精av| 熟妇操花| 玖玖色综合| 99性爱视频| 欧美日韩丝袜 | 日韩国产精品人妻无码久久久| 日韩综合色图| 久久大黄片| AV乱伦专区| 欧美激情性久久久久久| 一级性爱啪啪视频| 中国东北熟女老太婆内谢| 美国一区二区免费视频| 欧美日韩性爱视屏免费看了| 五月婷婷色色| 日韩中字av一区| 久婷婷一区| 任你干在线视频| 精品丰满熟妇人妻一区| 亚洲中文字幕熟女少妇一区二区| 99热| 欧美激情性爱视频网站| 亚洲成人性爱在线观看| 五月丁香综合网| 江都AV在线| 久久久99999久网站| 夜夜嗨一区二区三区三州加勒比| 欧美亚洲特P| 国产在线综合网| 岛国视频免费在线观看| 91久久久久久| 欧美色图片91| 精品9999| 日韩欧美性爱电影在线观看| 天天操天天干一区二区 | 久草视频在线视频在线视频在线观看| 韩国一级做A片免费的| 校园春色制服丝袜中文字亚洲| 91亚州欧美| 激情文学小说一区二区 | 一卡二卡三卡| 91啦人妻| 偷窥自拍亚洲天堂网爆| 91 国产丝袜在线放观看| 日韩欧美天天爽爽爽天天爽爽 | 大香蕉一人在线| 色原狠狠天天天| 极品综合| 日日夜夜狠狠| 性爱AV天堂| 亚洲激情视频| 中文字幕123| 久热久一区二区三区| 超碰97在线中文| 欧美狠狠| 欧美日韩第一页| 91国产大片| 91老司机精品| 日本熟女中文字幕一区| 欧美天天插| 色哟哟精品1精品2| 综合国产影视三级| 国产亚洲一黄| 少妇高潮喷水无套久久久久久| 天天操夜夜操| 你懂得91| 91欧美性| 影音先锋日本乱伦| 五月丁香六月婷| 日日嗷| 99re国产精品视频| 蜜臀亚洲中文| 日日夜夜免费| 色五月激情综合网| 欧美色图在线视频少妇| 韩三级a视频在线观看| 怡红院视频在线| 78精品在线| 抽插无码高清一区| 久久久久久久久久久久九| 日韩精品在线放| 99青草| 伊人91| 九九色影院| 女上位精品在线| 熟女乱伦A| 男生女生啊啊啊啊| 欧美Ⅴ性爱| 日韩中字av一区| 爱逼综合| 大香樵伊人网| 亚洲少妇视频| 91GD.COM| 欧美在线亚洲| 婷婷激情综合网| 欧美成人贴图| 亚洲乱熟女一区二区三区大香蕉| 丝袜色综合| 无码聚合| 蜜臀在线看片| 丰满人妻一区二区三区大胸懂色| 超碰97在线中文| 最新日产中文在线麻豆| 嗯嗯嗯啊啊啊干死我吧| 日韩 欧美 视频 在线 一区| 青青草乱入乱欲视频在线观看| 亚洲电影中字一区二区| 情色av电影| 看免费的黄片| 亚洲第91页| 人人操人人uiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiii | 不卡av免费在线网址| 色噜噜国产在线| 乱抡国产91| 久久神马影院| 911av网站免费观看| 小骚逼被操的爽不爽| 亚洲无吗在线视频| 国产女主播视频在线观看| 玖玖爱免费观看视频| 97在线日韩中文字幕| 二色av| 91亚洲欧洲| 欧美亚洲国产自久久| 18禁无码永久免费无限制| 97资源免费视频| 偷看洗澡一二三区美女| 久久久一区二区三区麻豆| 五月婷丁香| 91社区伊人| 国产少妇高潮| 日韩人妻无码专区| 日日夜夜免费| 日本一天色道久久久精品视频| 国产免a费看黄片在线| 国产又长又大又粗的视频| 91久久久久久| 黄色免费一级在线毛片| 老女人碰碰在线碰碰视频| 日本精品第一视频在'| 免费视频一二三区| 欧洲精品一区二区三区| 久久精品国产亚洲AV成人直播| 少妇无码999| 亚洲天堂自拍| 人成午夜免费大片| 国产又粗又大硬免费色网视频| 男人的天堂在线| 91碰碰| 亚洲国产欧美一区二区潘金莲| 91在线丝袜| 欧美亚男人的天堂| 丰满少妇乱子伦精品无| 福利视频网站| 九九综合网| 97亚洲综合电影| 亚洲暴力强奸AV| 97免费在线观看| 亚洲综合射| 69精品在线| 牛牛aV| 精品国产Av无码久久久亚洲| 综合情欲网| 情色av电影| 色五月婷婷在线| 狠狠中文字幕| 久久久九九九| 视频在线97| 极品粉嫩少妇视频| 丁香六月天| 欧美系列在线一区二区| 欧美日本成人一区二区| 女人18精品一区二区三区| 99re69| 猛交交| 欧美刺激色黄片免费看| 国产不良强奸视频免费看| 高清视频一区| 久久久久婷婷精品av电影| 亚洲精品天天影视综合网| 五月花婷婷| 久久香蕉综合一本到3atv| 国产成久久综合片| 欧美乱欲| 久久久女人| 久久高清无码夜夜操| 久久97资源 网| 欧美久久九九| 亚洲综合九九| 91小视频| 国产精品嫩草久久久久| 2024黄色视频| 东京热双插| 国产精品丝袜在线| 欧美亚洲色的图| 新精精品久久精品| 日韩 欧美 校园一区| 精品.99999| 999日韩中文精品观看视频。| 成人av免费观看| 久久婷婷综合国际产色怕| 黄色AAAAA欧美| 国产精品一区av在线| 国产兽交视频在线播放| 国产捆绑一区| 亚洲欧美电影| 精品人妻一区二区免费蜜桃视频| 久久97视频| 无码二级三级| 久久中文字幕人妻熟av女蜜柚| 97精品在线| 久久久精品久久| 欧洲自拍色图gif在线| 国产精品天干天干综合网麻豆| 屌妞视频久久久久久久久久久久| 淫色网综合| 亚州成人a∨| 欧美天天综| 亚洲天堂第一页| 97天天弄| 人人操人人射人人干| 中字一区| 亚洲色欧| 91性网| 亚洲色图欧美色图另类图片| 久久一二三四| 白丝被操91| 日本性爰一道本| 色色色欧美| 亚欧高清在线| 色色婷婷五月天| 猛交交| 久久夜色一区二区| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 亚洲高清欧美总合| 91丝袜| 欧美不卡在线一区二区| 少妇一级婬片免费放一级a性色.| 国产精品一区二区校花| 夜嗨影院| 久热99| 大香蕉 222| 国产视频小说| 96国产精品| 亚洲中字幕日本一区二区三区| 亚洲啪AⅤ永久无码| 成人亚欧免费视频| 337p大胆噜噜噜噜噜91Av| 青青国产精品在线| 91网站视频在线观看| 天天操狠狠日夜夜干超大胆开放com大香蕉视频在线观看 | 亚洲色9| 欧美草草| 综合网91| 国产av又色又爽又黄| 激情四射五月天| 欧美欲色| 亚洲交换| 张柏芝国产一区在线观看| 国产无马av| 亚洲自拍偷拍视频在线| 大二网站亚洲| 欧美系列在线一区二区| 久久人妻办公室视频| 超碰99热中文字幕| 亚州精品人妻一二三区| 久久人妻| 国产真实野战在线视频| 亚洲综合色男人网| av久日| 亚洲日韩天堂|