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

引入gRPC:gRPCClientandServer

时间:2023-03-30 03:45:41 PHP

鍘熸枃鍦板潃锛氬紩鍏RPC锛歡RPCClientandServer椤圭洰鍦板潃锛歡o-grpc-example鍓嶈█鏈珷灏嗕娇鐢℅o缂栧啓gRPCServer鍜孋lient锛岃瀹冧滑鐩镐簰閫氫俊銆傛渶閲嶈鐨勬槸锛屽皢浣跨敤浠ヤ笅搴擄細google.golang.org/grpcgithub.com/golang/protobuf/protoc-gen-goinstallgRPCgoget-ugoogle.golang.org/grpcProtocolBuffersv3wgethttps://github.com/google/protobuf/releases/download/v3.5.1/protobuf-all-3.5.1.zipunzipprotobuf-all-3.5.1.zipcdprotobuf-3.5.1/./configuremakemakeinstall妫€鏌ユ槸鍚﹀畨瑁呮垚鍔焢rotoc--version濡傛灉鍑虹幇濡備笅閿欒锛屾墽琛宭dconfig鍛藉悕鍙互瑙e喅杩欎釜闂/protobuf/protoc濡傛灉浣犲-gen-go鐨勫畨瑁呯幆澧冩湁浠€涔堥棶棰橈紝鍙互鍙傝€冩垜涔嬪墠鐨勬枃绔犮€婁粙缁嶄笌鐜瀹夎銆嬫湁璇︾粏鐨勪粙缁嶏紝gRPC涓嶅啀璧樿堪銆傛湰鑺傚紑濮嬫寮忕紪鍐檊RPC鐩稿叧绋嬪簭銆備竴璧蜂笂杞﹀惂馃槃濡傚浘鎵€绀虹殑鐩綍缁撴瀯$treego-grpc-examplego-grpc-example鈹溾攢鈹€client鈹溾攢鈹€proto鈹傗敂鈹€鈹€search.proto鈹斺攢鈹€server.goIDL鍐欏湪proto鏂囦欢澶逛笅鐨剆earch.proto鏂囦欢锛屽啓鍏ュ涓嬪唴瀹癸細syntax="proto3";packageproto;serviceSearchService{rpcSearch(SearchRequest)returns(SearchResponse){}}messageSearchRequest{stringrequest=1;}messageSearchResponse{stringresponse=1;}鍦╬roto鏂囦欢澶逛笅鐢熸垚鎵ц涓轰笅涓€涓懡浠わ細$protoc--go_out=plugins=grpc:.*.protoplugins=plugin1+plugin2锛氭寚瀹氳鍔犺浇鐨勫瓙鎻掍欢鍒楄〃銆傛垜浠畾涔夌殑proto鏂囦欢娑夊強RPC鏈嶅姟锛岄粯璁や笉鐢熸垚RPC浠g爜锛屾墍浠ラ渶瑕佺粰protoc-gen-go浼犻€抪lugins鍙傛暟锛屽憡璇夊畠锛岃鏀寔RPC锛堣繖閲屾寚瀹歡RPC锛?-go_out=.:璁剧疆杈撳嚭Go浠g爜鐨勭洰褰曡鍛戒护浼氬姞杞絧rotoc-gen-go鎻掍欢浠ヨ揪鍒扮敓鎴怗o浠g爜鐨勭洰鐨勶紝鐢熸垚鐨勬枃浠跺悗缂€涓?pb.go:(鍐掑彿)鍐掑彿浣滀负鍒嗛殧绗︼紝鍚庤窡鎵€闇€鐨勫弬鏁伴泦濡傛灉杩欓噷涓嶆秹鍙奟PC锛屽懡浠ゅ彲浠ョ畝鍖栦负锛?protoc--go_out=銆?.proto娉ㄦ剰锛氬缓璁ぇ瀹剁湅涓€涓嬭繖涓や釜鍛戒护鐢熸垚鐨?pb.go鏂囦欢锛屾湁浠€涔堝尯鍒紵鎮ㄥ皢鑾峰緱涓€涓寘鍚互涓嬪唴瀹圭殑.pb.go鏂囦欢锛歵ypeSearchRequeststruct{Requeststring`protobuf:"bytes,1,opt,name=request"json:"request,omitempty"`XXX_NoUnkeyedLiteralstruct{}`json:"-"`XXX_unrecognized[]byte`json:"-"`XXX_sizecacheint32`json:"-"`}func(m*SearchRequest)Reset(){*m=SearchRequest{}}func(m*SearchRequest)String()瀛楃涓瞷returnproto.CompactTextString(m)}func(*SearchRequest)ProtoMessage(){}func(*SearchRequest)Descriptor()([]byte,[]int){returnfileDescriptor_search_8b45f79ee13ff6a3,[]int{0}}func(m*SearchRequest)GetRequest()string{ifm!=nil{returnm.Request}return""}閫氳繃闃呰杩欓儴鍒嗕唬鐮侊紝鎴戜滑鍙互鐭ラ亾涓昏娑夊強浠ヤ笅鍑犱釜鏂归潰锛氬瓧娈靛悕鐢卞皬鍐欎笅鍒掔嚎杞崲鑰屾潵浠ュぇ鍐欓┘宄板紡锛堝瓧娈靛鍑猴級鐢熸垚涓€缁凣etters鏂规硶锛屽彲浠ヨ交鏉惧鐞嗕竴浜涚┖鎸囬拡鍊笺€侾rotoMessage鏂规硶瀹炵幇proto.Message鎺ュ彛鐢熸垚Rest鏂规硶锛屾柟渚垮皢Protobuf缁撴瀯鎭㈠涓洪浂鍊笺€俁epeated杞崲涓哄垏鐗囩被鍨婼earchRequeststruct{璇锋眰瀛楃涓瞏protobuf:"bytes,1,opt,name=request"json:"request,omitempty"`}func(*SearchRequest)Descriptor()([]byte,[]int){returnfileDescriptor_search_8b45f79ee13ff6a3,[]int{0}}typeSearchResponsestruct{鍝嶅簲瀛楃涓瞏protobuf:"bytes,1,opt,name=response"json:"response,omitempty"`}func(*SearchResponse)Descriptor()([]byte,[]int){returnfileDescriptor_search_8b45f79ee13ff6a3,[]int{1}}...funcinit(){proto.RegisterFile("search.proto",fileDescriptor_search_8b45f79ee13ff6a3)}varfileDescriptor_search_8b45f79ee13ff6a3=[]byte{//131瀛楄妭鐨勫帇缂〧ileDescriptorProto0x81f,0x81f,0x81f,0x81f0x08銆?x00銆?x00銆?x00銆?x00銆?x00銆?x02銆?xff銆?xe2銆?xe2銆?x29銆?x4e銆?x4d銆?x2c銆?x4a銆?xce銆?xd0銆?x2b銆?x28銆?xca銆?x2銆?x2銆?x5銆?x5銆?x1c0x53,0x4a,0x9a,0x5c,0xbc,0xc1,0x60,0xe1,0xa0,0xd4,0xc2,0xd2,0xd4,0xe2,0x12,0x21,0x09,0x2e,0xf6,0x22,0x25,0x25,0x08,081,0x51,0x83,0x33,0x08,0xc6,0x55,0xd2,0xe1,0xe2,0x83,0x29,0x2d,0x2e,0xc8,0xcf,0x2b,0x4e,0x15,0x92,0x0xa1,0x0xa0,8,0xe1,0x7c,0x23,0x0f,0x98,0xc1,0xc1,0xa9,0x45,0x65,0x99,0xc9,0xa9,0x42,0xe6,0x5c,0x6c,0x10,0x01,0x21,0x11,0x88,0x13,0xf4,0x50,0x2c,0x96,0x12,0x45,0x13,0x85,0x98,0xa3,0xc4,0x90,0xc4,0x06,0x16,0x37,0x06,0x04,0x00,0x00,3x,0xff,5,0x0,0x0,0x90x90x00,}杩欓儴鍒嗕唬鐮佷富瑕佹槸鍥寸粫fileDescriptor杩涜鐨勶紝杩欓噷鐨刦ileDescriptor_search_8b45f79ee13ff6a3浠h〃涓€涓紪璇戝ソ鐨刾roto鏂囦欢锛屾瘡涓柟娉曢兘鍖呭惈Descriptor鏂规硶锛屼篃灏辨槸璇磋繖涓柟娉曞湪fileDescriptor鐨凪essageFieldServer閮ㄥ垎浼氬啓鐨勫熀纭€妯℃澘gRPCServer瀹屾垚涓€娆℃柟娉曡皟鐢ㄥ湪server.go涓啓鍏ヤ互涓嬪唴瀹癸細{}func(s*SearchService)Search(ctxcontext.Context,r*pb.SearchRequest)(*pb.SearchResponse,error){return&pb.SearchResponse{Response:r.GetRequest()+"Server"},nil}constPORT="9001"funcmain(){server:=grpc.NewServer()pb.RegisterSearchServiceServer(server,&SearchService{})lis,err:=net.Listen("tcp",":"+PORT)濡傛灉鍑洪敊!=nil{log.Fatalf("net.Listenerr:%v",err)}server.Serve(lis)}鍒涘缓涓€涓猤RPCServer瀵硅薄锛屽彲浠ョ悊瑙d负鏈嶅姟绔娊璞″璞″拰SearchService锛堝叾涓寘鍚皟鐢ㄧ殑鏈嶅姟鍣ㄦ帴鍙o級娉ㄥ唽鍒癵RPCServer鐨勫唴閮ㄦ敞鍐屼腑蹇冦€傝繖鏍凤紝褰撴帴鏀跺埌璇锋眰鏃讹紝閫氳繃鍐呴儴鏈嶅姟鍙戠幇锛屽彲浠ユ壘鍒版湇鍔$鎺ュ彛锛屽苟杩涜閫昏緫澶勭悊锛屽垱寤轰竴涓狶isten锛岀洃鍚琓CP绔彛gRPCServer锛屽惎鍔╨is.Accept锛岀洿鍒癝top鎴朑racefulStopClient涓嬶紝缂栧啓gRPCGoClientTemplate鐨勫熀纭€锛屾墦寮€client/client.go鏂囦欢锛屽啓鍏ュ涓嬪唴瀹癸細-grpc-example/proto")constPORT="9001"funcmain(){conn,err:=grpc.Dial(":"+PORT,grpc.WithInsecure())iferr!=nil{log.Fatalf("grpc.Dialerr:%v",err)}deferconn.Close()client:=pb.NewSearchServiceClient(conn)resp,err:=client.Search(context.Background(),&pb.SearchRequest{璇锋眰:"gRPC",})濡傛灉鍑洪敊锛?nil{log.Fatalf("client.Searcherr:%v",err)}log.Printf("resp:%s",resp.GetResponse())}createaconnectioninteractionwiththegiventarget(server)鍒涘缓SearchService鐨勫鎴风瀵硅薄鍙戦€丷PC璇锋眰锛岀瓑寰呭悓姝ュ搷搴旓紝寰楀埌鍥炶皟杈撳嚭鍚庤繑鍥炲搷搴旂粨鏋滃搷搴旂粨鏋滄牎楠宻tartServer$pwd$GOPATH/github.com/EDDYCJY/go-grpc-example$gorunserver.go鍚姩瀹㈡埛绔?pwd$GOPATH/github.com/EDDYCJY/go-grpc-example/client$gorunclient.go2018/09/2311:06:23resp:gRPCServer鍦ㄦ湰绔犺繘琛屼簡鎬荤粨銆傛垜浠垎鍒粙缁嶄簡Protobuf鍜実RPCClient/Server銆傚笇鏈涘ぇ瀹跺彲浠ユ牴鎹枃涓弿杩扮殑鍐呭鍐欎竴涓猟emo銆傛繁鍏ョ悊瑙o紝涓€瀹氫細鏇村ソ馃绯诲垪鐩綍寮曞叆gRPC锛歡RPC鍙婄浉鍏充粙缁嶅紩鍏RPC锛歡RPCClientandServer寮曞叆gRPC锛歡RPCStreaming,ClientandServer寮曞叆gRPC锛歍LScertificateauthentication寮曞叆gRPC锛欳A-basedTLScertificateauthentication寮曞叆gRPC锛歎naryandStreaminterceptor寮曞叆gRPC锛氳浣犵殑鏈嶅姟鍚屾椂鎻愪緵HTTP鎺ュ彛寮曞叆gRPC锛氬RPC鏂规硶鍋氳嚜瀹氫箟璁よ瘉寮曞叆gRPC锛歡RPCDeadlines寮曞叆gRPC锛氬垎甯冨紡閾炬帴璺熻釜gRPC+Opentracing+鎷夐摼