当前位置: 首页 > 后端技术 > PHP

引入gRPC:gRPC及相关介绍

时间:2023-03-29 18:18:57 PHP

鍘熸枃鍦板潃锛氬紩鍏RPC锛歡RPC鍙婄浉鍏充粙缁嶉」鐩湴鍧€锛歡o-grpc-example浣滀负寮€绡囷紝灏嗕粙缁嶄竴浜沢RPC鐩稿叧鐨勭煡璇嗐€傜畝鍗曟潵璇达紝gRPC鏄竴涓熀浜嶩TTP/2鍗忚璁捐鐨凴PC妗嗘灦銆傚畠浣跨敤Protobuf浣滀负IDL銆備綘鏈夋病鏈夋兂杩囧畠浠槸浠€涔堬紵鏈枃灏嗕粙缁嶄竴浜涘父鐢ㄧ殑鐭ヨ瘑鍜屾蹇碉紝骞剁粰鍑烘洿璇︾粏鐨勬墜鍐屽湴鍧€锛屼互渚挎洿娣卞叆銆備竴銆丷PC浠€涔堟槸RPCRPC锛烴o.)鍗忚绛夈€傚厑璁歌繍琛屽湪涓€鍙拌绠楁満涓婄殑绋嬪簭璋冪敤鍙︿竴鍙拌绠楁満涓婄殑瀛愮▼搴忥紝寮€鍙戣€呬笉闇€瑕侀澶栫紪鍐欒繖绉嶄氦浜掔殑瀹為檯鍦烘櫙锛氭湁涓ゅ彴鏈嶅姟鍣紝A鍜孊銆侫涓婄殑搴旂敤绋嬪簭C鎯宠皟鐢ㄦ湇鍔″櫒B涓婄殑搴旂敤绋嬪簭D锛屼粬浠彲浠ョ洿鎺ュ湪鏈湴璋冪敤鍚楋紵绛旀鏄惁瀹氱殑锛屼絾鏄娇鐢≧PC杩樻槸寰堟柟渚跨殑銆傚洜姝わ紝浜轰滑甯歌浣跨敤RPC灏卞儚鍦ㄦ湰鍦拌皟鐢ㄤ竴涓嚱鏁颁竴鏍风畝鍗曘€傚湪鎴戠湅鏉ワ紝涓€涓畬鏁寸殑RPC妗嗘灦搴旇鍖呮嫭璐熻浇鍧囪 銆佹湇鍔℃敞鍐屼笌鍙戠幇銆佹湇鍔℃不鐞嗙瓑鍔熻兘锛屽苟涓斿叿鏈夊彲鎵╁睍鎬т互鏂逛究娴侀噺鐩戞帶绯荤粺銆傚綋鐒讹紝鍦ㄦ彃鍏ヤ箣鍓嶅畠涓嶄細瀹屾垚銆備竴浜涚浉瀵圭畝鍗曠殑RPC妗嗘灦涔熷彲浠ラ€氳繃缁勫悎澶氫釜缁勪欢鏉ユ弧瓒宠繖涓爣鍑嗐€備綘鎬庝箞璁や负锛熷父鐢≧PC妗嗘灦瀵规瘮gRPCThriftRpcxDubbo\璺ㄨ瑷€澶欼DL鏈嶅姟娌荤悊娉ㄥ唽涓績鏈嶅姟绠$悊gRPC鈭毭椕椕椕桾hrift鈭毭椕椕椕桼pcx脳鈭氣垰鈭氣垰Dubbo脳鈭氣垰鈭氣垰涓轰粈涔圧PC绠€鍗曘€侀€氱敤銆乻afe,EfficiencyRPC鍙互鍩轰簬HTTP鍚楋紵RPC鏄寚杩滅▼杩囩▼璋冪敤锛屽畠鍙互鍩轰簬HTTP鍗忚銆傛湁浜鸿偗瀹氫細璇存湁鏁堢巼浼樺娍銆傛垜鍙互鍛婅瘔浣狅紝瀹冩槸鍩轰簬HTTP/1.1鐨勩€侶TTP/2浼樺寲浜嗗緢澶氶棶棰橈紙褰撶劧涔熸湁鏂扮殑闂锛夛紝鎵€浠ヤ綘宸茬粡鐪嬪埌浜嗘湰鏂囩殑涓婚gRPC2.Protobuf绠€浠婸rotocolBuffers鏄竴绉嶇嫭绔嬩簬璇█鍜屽钩鍙般€佸彲鎵╁睍鐨勫簭鍒楀寲缁撴瀯鍖栨暟鎹殑鏂规硶锛岄€氬父鐢ㄤ簬閫氫俊鍗忚銆佹暟鎹瓨鍌ㄧ瓑銆備笌JSON鍜孹ML鐩告瘮锛屽畠鏇村皬銆佹洿蹇€佹洿绠€鍗曪紝鍥犳鏇村彈寮€鍙戣€呴潚鐫怱yntax="proto3";serviceSearchService{rpcSearch(SearchRequest)returns(SearchResponse);}messageSearchRequest{stringquery=1;int32page_number=2;int32result_per_page=3;}messageSearchResponse{...}1.绗竴琛岋紙闈炵┖锛岄潪娉ㄩ噴琛岋級澹版槑浣跨敤proto3璇硶銆傚鏋滄湭澹版槑锛屽皢榛樿浣跨敤proto2璇硶銆傚悓鏃舵垜寤鸿浣犱娇鐢╲2鎴栬€卾3锛屽苟涓斾綘搴旇澹版槑浣犱娇鐢ㄧ殑鐗堟湰銆?.瀹氫箟SearchServiceRPC鏈嶅姟锛屽叾涓寘鍚玆PC鏂规硶Search銆傝緭鍏ュ弬鏁版槸SearchRequest娑堟伅锛岃緭鍑哄弬鏁版槸SearchResponse娑堟伅銆?.瀹氫箟SearchRequest鍜孲earchResponse娑堟伅銆傚墠鑰呭畾涔変簡涓変釜瀛楁锛屾瘡涓瓧娈靛寘鍚笁涓睘鎬э細绫诲瀷銆佸瓧娈靛悕銆佸瓧娈电紪鍙?銆侾rotobuf缂栬瘧鍣ㄤ細鏍规嵁閫夋嫨鐨勮瑷€鐢熸垚鐩稿簲璇█鐨凷erviceInterfaceCode鍜孲tubs銆侳inally,hereisjustasimplegrammarintroduction,detailed鐨勮鍙虫嫄LanguageGuide(proto3)鏁版嵁绫诲瀷.protoTypeC++TypeJavaTypeGoTypePHPTypedoubledoubledoublefloat64floatfloatfloatfloatfloat32floatint32int32intint32integerint64int64longint64integer/stringuint32uint32intuint32integeruint64uint64longuint64integer/stringsint32int32intint32integersint64int64longint64integer/stringfixed32uint32intuint32integerfixed64uint64longuint64integer/stringsfixed32int32intint32integersfixed64int64longint64integer/stringboolboolbooleanboolbooleanstringstringStringstringstringbytesstringByteString[]bytestringv2鍜寁3涓昏鍖哄埆鍒犻櫎鍘熷鍊煎瓧娈靛瓨鍦ㄤ簬鎬荤紪杈戜腑鐨勫瓧娈靛垹闄equired瀛楁鍒犻櫎optional瀛楁锛岄粯璁ゆ槸鍒犻櫎default瀛楁鍜屽垹闄ゆ墿灞曠壒寰侊紝娣诲姞Any绫诲瀷鏇挎崲銆傚鍔犲垹闄ゆ湭鐭ュ瓧娈电殑鏀寔銆傛坊鍔犱簡鏂扮殑JSONMapping浠ユ敮鎸丮ap绫诲瀷銆傛灇涓剧殑鏈煡绫诲瀷琚慨澶峳epeatated榛樿浣跨敤鎵撳寘缂栫爜骞跺紩鍏ユ柊鐨勮瑷€瀹炵幇锛圕#銆丣avaScript銆丷uby銆丱bjective-C锛夈€備互涓婃槸鏃ュ父鐢熸椿涓父瑙佺殑鍔熻兘銆傚鏋滀綘鎯充簡瑙f洿澶氾紝鍙互闃呰ProtobufVersion3.0.0ComparedwithProtobuf,whynotuseitXML?鏇寸畝鍗曠殑鏁版嵁鎻忚堪鏂囦欢鍙渶瑕佸師鏉ョ殑1/10鍒?/3瑙f瀽閫熷害鏄師鏉ョ殑20鍒?00鍊嶏紝鍑忓皯姝т箟锛屽垱寤烘洿鏄撶敤鐨勬暟鎹闂被3.gRPC绠€浠媑RPC鏄竴绉嶉珮鎬ц兘锛屽紑婧愬拰閫氱敤鐨凴PC妗嗘灦锛屼笓涓虹Щ鍔ㄥ拰HTTP/2澶氳瑷€璁捐C++C#DartGoJavaNode.jsObjective-CPHPPythonRuby鐗圭偣1.HTTP/22,Protobuf3,clientandserverbasedonthesameIDL4.鑹ソ鐨勬敮鎸乫ormobilenetworks5.鏀寔澶氳瑷€姒傝璁茶В1.瀹㈡埛绔紙gRPCSub锛夎皟鐢ˋ鏂规硶锛屽彂璧稲PC璋冪敤2.浣跨敤Protobuf瀵硅姹備俊鎭繘琛屽璞″簭鍒楀寲鍜屽帇缂╋紙IDL锛?.鏈嶅姟绔悗(gRPCServer)鏀跺埌璇锋眰锛岃В鐮佽姹備綋锛岃繘琛屼笟鍔¢€昏緫澶勭悊骞惰繑鍥?.浣跨敤Protobuf瀵瑰搷搴旂粨鏋滆繘琛屽璞″簭鍒楀寲鍘嬬缉(IDL)5.瀹㈡埛绔帴鏀舵湇鍔″櫒鍝嶅簲锛岃В鐮佽姹備綋鍥炶皟琚皟鐢ㄧ殑A鏂规硶锛屽敜閱掔瓑寰呭搷搴旓紙闃诲锛夌殑瀹㈡埛绔皟鐢ㄥ苟杩斿洖鍝嶅簲缁撴灉绀轰緥鏈妭绠€鍗曞睍绀篻RPC瀹㈡埛绔拰鏈嶅姟绔殑绀轰緥浠g爜銆傚笇鏈涘ぇ瀹舵湁涓€涓熀鏈殑鍗拌薄锛屼笅涓€绔犱細璇︾粏浠嬬粛馃鎼缓鍜屽惎鍔ㄦ湇鍔″櫒lis,err:=net.Listen("tcp",fmt.Sprintf(":%d",*port))iferr!=nil{log.Fatalf("failedtolisten:%v",err)}grpcServer:=grpc.NewServer()...pb.RegisterSearchServer(grpcServer,&SearchServer{})grpcServer.Serve(lis)1.鐩戝惉鎸囧畾鐨凾CP绔彛锛岀敤浜庢帴鍙楀鎴风璇锋眰2銆佸垱寤篻RPCServer瀹炰緥瀵硅薄3銆佹敞鍐実RPCServer鍐呴儴鏈嶅姟鍜岃矾鐢?銆丼erve()璋冪敤鏈嶅姟鍣ㄦ墽琛岄樆濉炵瓑寰咃紝鐩村埌杩涚▼缁堟鎴栬璋冪敤閫氳繃Stop()鍒涘缓涓€涓鎴风varopts[]grpc.DialOption...conn,err:=grpc.Dial(*serverAddr,opts...)iferr!=nil{log.Fatalf("鎷ㄥ彿澶辫触:%v",err)}deferconn.Close()client:=pb.NewSearchClient(conn)...1.鍒涘缓gRPCChannel涓巊RPCServer閫氫俊锛堥渶瑕佹湇鍔″櫒鍦板潃鍜岀鍙d綔涓哄弬鏁帮級2.璁剧疆DialOptions鍑瘉锛堜緥濡俆LS銆丟CE鍑瘉銆丣WT鍑瘉锛?.鍒涘缓SearchClientStub4.璋冪敤鐩稿簲鐨勬湇鍔℃柟娉昑hinking闂1銆佷粈涔堝満鏅笅涓嶉€傚悎浣跨敤Protobuf锛岃€岄€傚悎浣跨敤JSON鍜孹ML锛?銆丳rotobuf閮ㄥ垎鎻愬埌鐨刾ackedencoding鏄粈涔堬紵灏忕粨鍦ㄥ紑鍦哄唴瀹逛腑锛屾垜鐢ㄥ敖鍙兘绠€鐭殑鎻忚堪锛屽悜澶у浠嬬粛浜嗗繀瑕佸拰蹇呰鐨勭煡璇嗙偣銆傚笇鏈涗綘鑳芥湁鎵€鏀惰幏銆傛渶濂藉幓鐪嬫垜缁欑殑鍙傝€冭祫鏂欐繁鍏ュ涔犮€俫RPC寮曞叆涓€绯诲垪鐩綍锛歡RPC鍙婄浉鍏充粙缁嶅紩鍏RPC锛歡RPCClient鍜孲erver寮曞叆gRPC:gRPCStreaming,ClientandServer寮曞叆gRPC:TLS璇佷功璁よ瘉寮曞叆gRPC:鍩轰簬CA鐨凾LS璇佷功璁よ瘉寮曞叆gRPC:UnaryandStream鎷︽埅鍣ㄥ紩鍏RPC:璁╀綘鐨勬湇鍔″悓鏃舵彁渚汬TTP鎺ュ彛寮曞叆gRPC:forRPCMethodtodocustomauthentication甯﹀叆gRPC:gRPCDeadlines甯﹀叆gRPC:DistributedlinktrackinggRPC+Opentracing+ZipkinReferencesProtocolBuffersgRPC