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

引入gRPC:gRPCDeadlines

时间:2023-03-30 05:21:28 PHP

鍘熸枃鍦板潃锛氬紩鍏RPC锛歡RPCDeadlines椤圭洰鍦板潃锛歨ttps://github.com/EDDYCJY/go...鍓嶈█鍦ㄥ墠闈㈢殑绔犺妭涓紝宸茬粡浠嬬粛浜唃RPC鐨勫熀鏈敤娉曘€傞偅浣犳兂鎯筹紝灏辫繖鏍疯瀹冭8濂旂湡鐨勬病闂鍚楋紵閭d箞锛屼竴瀹氭湁闂銆備粖澶╁氨鏉ヤ粙缁嶄竴涓嬪繀澶囨妧鑳絞RPCDeadlines鐨勭敤娉曘€傚唴瀹逛篃姣旇緝绠€鍗曘€侱eadlinesDeadlines琛ㄧず鎴鏃ユ湡銆傚湪gRPC涓紝寮鸿皟浜員L;DR锛堝お闀匡紝璇峰嬁闃呰锛夛紝寤鸿濮嬬粓璁剧疆鎴鏃ユ湡銆備负浠€涔堬紵涓轰粈涔堣璁剧疆锛熷綋娌℃湁璁剧疆Deadlines鏃讹紝浼氫娇鐢ㄩ粯璁ょ殑DEADLINE_EXCEEDED锛堣繖涓椂闂撮潪甯稿ぇ锛夈€傚鏋滃彂鐢熼樆濉炵瓑寰咃紝澶ч噺姝e湪杩涜鐨勮姹傚皢琚繚鐣欙紝鎵€鏈夎姹傞兘鍙兘杈惧埌鏈€澶ц秴鏃舵椂闂淬€傝繖灏嗕娇鏈嶅姟杩愯鏈夎€楀敖璧勬簮鐨勯闄╋紝渚嬪鍐呭瓨锛岃繖浼氬鍔犳湇鍔$殑寤惰繜锛屾垨鑰呭湪鏈€鍧忕殑鎯呭喌涓嬪彲鑳戒細瀵艰嚧鏁翠釜杩涚▼宕╂簝gRPCClientfuncmain(){...ctx,cancel:=context.WithDeadline(context.Background(),time.Now().Add(time.Duration(5*time.Second)))defercancel()client:=pb.NewSearchServiceClient(conn)resp,err:=client.Search(ctx,&pb.SearchRequest{Request:"gRPC",})iferr!=nil{statusErr,ok:=status.FromError(err)ifok{ifstatusErr.Code()==codes.DeadlineExceeded{log.Fatalln("client.Searcherr:deadline")}}log.Fatalf("client.Searcherr:%v",err)}log.Printf("resp:%s",resp.GetResponse())}context.WithDeadline:灏嗚繑鍥炴渶缁堢殑涓婁笅鏂囨埅姝㈡椂闂淬€傜涓€涓弬鏁版槸鐖朵笂涓嬫枃锛岀浜屼釜鍙傛暟鏄皟鏁村悗鐨勬埅姝㈡棩鏈熴€傚鏋滅埗鏃堕棿鏃╀簬瀛愭椂闂达紝鍒欎互鐖舵椂闂翠负鍑嗭紝鍚﹀垯浠ュ瓙鏃堕棿涓烘渶缁堟埅姝㈡椂闂磃uncWithDeadline(parentContext,dtime.Time)(Context,CancelFunc){ifcur,ok:=parent銆傛渶鍚庢湡闄愶紙锛?ok&&cur.Before(d){//褰撳墠鎴鏃ユ湡宸茬粡姣旀柊鎴鏃ユ湡鏃╀簡銆俽eturnWithCancel(parent)}c:=&timerCtx{cancelCtx:newCancelCtx(parent),deadline:d,}propagateCancel(parent,c)dur:=time.Until(d)濡傛灉dur<=0{c.cancel(true,DeadlineExceeded)//鎴鏃ユ湡宸茬粡杩囧幓returnc,func(){c.cancel(true,Canceled)}}c.mu.Lock()deferc.mu.Unlock()ifc.err==nil{c.timer=time.AfterFunc(dur,func(){c.cancel(true,DeadlineExceeded)})}returnc,func(){c.cancel(true,Canceled)}}context.WithTimeout锛氬彟涓€涓潪甯稿父瑙佺殑鏂规硶鏄搷浣滄柟渚裤€傚叾瀹炲氨鏄WithDeadline鐨勫皝瑁協uncWithTimeout(parentContext,timeouttime.Duration)(Context,CancelFunc){returnWithDeadline(parent,time.Now().Add(timeout))}status.FromError:杩斿洖鍏蜂綋鐨凣RPCStatus浠g爜閿欒锛屽鏋滀笉鍚堟硶鍒欑洿鎺ヨ繑鍥炰唬鐮併€俇nknownServertypeSearchServicestruct{}func(s*SearchService)Search(ctxcontext.Context,r*pb.SearchRequest)(*pb.SearchResponse,error){for鎴戯細=0锛涙垜<5;i++{濡傛灉ctx.Err()==context.Canceled{returnnil,status.Errorf(codes.Canceled,"SearchService.Searchcanceled")}time.Sleep(1*time.Second)}return&pb.SearchResponse{Response:r.GetRequest()+"Server"},nil}funcmain(){...}鍦ㄦ湇鍔″櫒绔紝鎴鏃ユ湡宸茬敱瀹㈡埛绔缃€傛湇鍔$涓€瀹氳妫€娴嬪埌锛屽惁鍒欏鏋滃鎴风宸茬粡缁撴潫浜嗭紝鏈嶅姟绔繕浼氬偦鍌荤殑鎵ц鍦ㄩ偅閲岋紝瀵硅祫婧愮殑鏋佸ぇ娴垂锛屾墍浠ヨ繖閲岄渶瑕佷娇鐢╟tx.Err()==context.Canceled鏉ュ垽鏂紝涓轰簡涓轰簡妯℃嫙鍦烘櫙锛屾垜浠坊鍔犱簡涓€涓惊鐜拰鐫$湢馃楠岃瘉骞堕噸鍚痵erver.go鍜宑lient.go锛屽緱鍒扮粨鏋滐細$gorunclient.go2018/10/0617:45:55client.Searcherr:deadlineexitstatus1鎬荤粨鏈珷姣旇緝绠€鍗曪紝浣犻渶瑕佷簡瑙d互涓嬬煡璇嗙偣锛氬浣曡缃瓺eadlines涓轰粈涔堣璁剧疆Deadlines浣犲繀椤绘竻妤氬湴璁よ瘑鍒癵RPCDeadlines闈炲父閲嶈锛屽惁鍒欒繖涓皬鍔熻兘鐐逛細鎵兼潃浣犵殑鐢熶骇馃か鍙傝€冧功绀轰緥浠g爜绯诲垪go-grpc-example绯诲垪鐩綍杩涘叆gRPC锛歡RPC鍙婄浉鍏充粙缁嶈繘鍏RPC锛歡RPCClientandServer杩涘叆gRPC锛歡RPCStreaming锛孋lientandServer杩涘叆gRPC锛歍LScertificateauthenticationintogRPC:CA-basedBringTLS璇佷功韬唤楠岃瘉鍒癵RPC锛歎nary鍜孲tream鎷︽埅鍣ㄥ紩鍏RPC锛氳浣犵殑鏈嶅姟鍚屾椂鎻愪緵HTTP鎺ュ彛寮曞叆gRPC锛氬RPC鏂规硶鍋氳嚜瀹氫箟璁よ瘉寮曞叆gRPC锛歡RPCDeadlines淇℃伅gRPC鍜孌eadlines

最新推荐
猜你喜欢