鍘熸枃鍦板潃锛氬紩鍏RPC锛氳浣犵殑鏈嶅姟鍚屾椂鎻愪緵HTTP鎺ュ彛椤圭洰鍦板潃锛歨ttps://github.com/EDDYCJY/go...Preface鎺ュ彛闇€瑕佹彁渚涚粰鍏朵粬涓氬姟缁勮闂紝浣嗘槸RPC鍗忚涓嶅悓锛屽唴閮ㄦ棤娉曡皟鏁淬€傚鏂归棶鏄惁鍙互浣跨敤HTTP鎺ュ彛锛屾€庝箞鍔烇紵寰俊锛堝叕浼楀彿銆佸皬绋嬪簭锛夌瓑绗笁鏂瑰洖璋冩帴鍙e彧鏀寔HTTP鎺ュ彛銆傛垜搴旇鎬庝箞鍔烇紵鐩镐俊鍦ㄥ疄闄呭伐浣滀腑浣犱細閬囧埌浠ヤ笂闂銆俫RPC閲岄潰鏈夎В鍐虫柟妗堬紝鏈珷浼氫粙缁嶐煠斾负浠€涔堝彲浠ュ悓鏃舵彁渚汬TTP鎺ュ彛锛熷叧閿槸gRPC鍗忚鏄熀浜嶩TTP/2鐨勶紝鎵€浠ュ簲鐢ㄥ彲浠ュ湪涓€涓猅CP绔彛涓婂悓鏃舵彁渚汬TTP/1.1鍜実RPC鎺ュ彛鏈嶅姟锛堜袱绉嶄笉鍚岀殑娴侊級銆傚浣曞悓鏃舵彁渚汬TTP鎺ュ彛妫€娴嬪崗璁甶fr.ProtoMajor==2&&strings.Contains(r.Header.Get("Content-Type"),"application/grpc"){server.ServeHTTP(w,r)}else{mux.ServeHTTP(w,r)}杩涚▼妫€娴嬭姹傚崗璁负HTTP/2锛屽垽鏂瑿ontent-Type鏄惁涓篴pplication/grpc锛坓RPC榛樿鏍囧織锛夋牴鎹笉鍚屽崗璁浆鍙戠粰涓嶅悓鏈嶅姟杩涜灏佽鏈妭涓渶瑕佸鐢ㄤ唬鐮侊紝閲嶆柊灏佽锛岃锛歡o-grpc-example鐩綍缁撴瀯鏂板缓simple_http_client銆乻imple_http_server鐩綍锛岀洰褰曠粨鏋勫涓嬶細go-grpc-example鈹溾攢鈹€client鈹傗敎鈹€鈹€simple_client鈹傗敎鈹€鈹€simple_http_client鈹傗敂鈹€鈹€stream_client鈹溾攢鈹€conf鈹溾攢鈹€pkg鈹傗敂鈹€鈹€gtls鈹溾攢鈹€proto鈹溾攢鈹€server鈹傗敎鈹€鈹€simple_http_server鈹傗敎鈹€鈹€simple_server鈹傗敂鈹€鈹€stream_serverServer鍒涘缓涓€涓柊鏈嶅姟鍣ㄥ湪simple_http_server鐩綍.go涓嬶紝鍐欏叆鏂囦欢鍐呭锛歱ackagemainimport("context""log""net/http""strings""github.com/EDDYCJY/go-grpc-example/pkg/gtls"pb"github.com/EDDYCJY/go-grpc-example/proto""google.golang.org/grpc")typeSearchServicestruct{}func(s*SearchService)Search(ctxcontext.Context,r*pb.SearchRequest)(*pb.SearchResponse,error){return&pb.SearchResponse{鍝嶅簲:r.GetRequest()+"HTTPServer"},nil}constPORT="9003"funcmain(){certFile:="../../conf/server/server.pem"keyFile:="../../conf/server/server.key"tlsServer:=gtls.Server{CertFile:certFile,KeyFile:keyFile,}c,err:=tlsServer.GetTLSCredentials()iferr!=nil{log.Fatalf("tlsServer.GetTLSCredentialserr:%v",err)}mux:=GetHTTPServeMux()server:=grpc.NewServer(grpc.Creds(c))pb.RegisterSearchServiceServer(server,&SearchService{})http.ListenAndServeTLS(":"+PORT,certFile,keyFile,http.HandlerFunc(func(whttp.ResponseWriter,r*http.Request){ifr.ProtoMajor==2&&strings.Contains(r.Header.Get("Content-Type"),"application/grpc"){鏈嶅姟鍣ㄣ€係erveHTTP(w,r)}else{mux.ServeHTTP(w,r)}return}),)}funcGetHTTPServeMux()*http.ServeMux{mux:=http.NewServeMux()mux.HandleFunc("/",func(whttp.ResponseWriter,r*http.Request){w.Write([]byte("eddycjy:go-grpc-example"))})returnmux}http.NewServeMux:CreatesanewServeMux,ServeMux鏈川涓婃槸榛樿瀹炵幇ServeHTTP鐨勮矾鐢辫〃锛屾墍浠ヨ繑鍥濰andler鍚庯紝鍙互鐩存帴閫氳繃HandleFunc娉ㄥ唽pattern鍜屾祦绋嬮€昏緫http.ListenAndServeTLS:鍙互绠€鍗曠悊瑙d负鎻愪緵鐩戝惉HTTPS鏈嶅姟鐨勬柟娉曪紝鍏抽敭鐨勫崗璁垽鏂浆鍙戞槸杩樻湁杩欓噷鍏跺疄浣犵悊瑙d箣鍚庯紝浼氬彂鐜板緢绠€鍗曘€傛牳蹇冩楠わ細鍒ゆ柇->杞彂->鍝嶅簲銆傛垜浠敼鍙樹簡鍓嶄袱姝ョ殑榛樿閫昏緫锛屼粎姝よ€屽凡銆侰lient鍦╯imple_http_server鐩綍涓嬫柊寤轰竴涓猚lient.go锛屽啓鍏ユ枃浠跺唴瀹癸細/gtls"pb"github.com/EDDYCJY/go-grpc-example/proto")constPORT="9003"funcmain(){tlsClient:=gtls.Client{ServerName:"go-grpc-example",CertFile:"../../conf/server/server.pem",}c,err:=tlsClient.GetTLSCredentials()iferr!=nil{log.Fatalf("tlsClient.GetTLSCredentialserr:%v",err)}conn,err:=grpc.Dial(":"+PORT,grpc.WithTransportCredentials(c))iferr!=nil{log.Fatalf("grpc.Dialerr:%v",err)}寤惰繜conn.Close()client:=pb.NewSearchServiceClient(conn)resp,err:=client.Search(context.Background(),&pb.SearchRequest{Request:"gRPC",})濡傛灉鍑洪敊锛?nil{log.Fatalf("client.Searcherr:%v",err)}log.Printf("resp:%s",resp.GetResponse())}楠岃瘉gRPCClient$gorunclient.go2018/10/0414:56:56resp:gRPCHTTPServerHTTP/1.1璁块棶鎬荤粨閫氳繃杩欎竴绔狅紝鍚岀鍙f彁渚涘弻閲嶆湇鍔$殑鍔熻兘琛ㄩ潰涓婃槸瀹屾垚浜嗭紝浣嗗疄闄呬笂搴旇鍔犳繁瀵笻TTP/2鐨勭悊瑙e拰浣跨敤鏄繀涓嶅彲灏戠殑鎷撳睍銆傚鏋滀綘鏈夊悓鏃舵彁渚汻PC鍜孯ESTfulJSONAPI鎺ュ彛鐨勯渶姹傦紝涓嶈鐘硅鲍锛岀偣鍑伙細gRPC+gRPCGateway缁冧範棰樹綘瑙夊緱杩欎釜鏂规澶熺敤鍚楋紵鏄笉鏄竾鑳界殑锛屼絾鏄EnvoyProxy鐨勬敮鎸佽繕涓嶅畬鍠勶紝涓嶅彲鑳藉湪涓€涓鍙e悓鏃剁洃鎺т袱绉嶆祦閲忓甫Server鐨刧RPC锛歡RPCStreaming锛孋lient鍜孲erver甯RPC鐨勶細TLS璇佷功璁よ瘉寮曞叆gRPC锛氬熀浜嶤A鐨凾LS璇佷功璁よ瘉寮曞叆gRPC锛歎nary鍜孲tream鎷︽埅鍣ㄥ紩鍏RPC锛氳浣犵殑鏈嶅姟鍚屾椂鎻愪緵HTTP鎺ュ彛gRPC锛歊PC鏂规硶鐨勮嚜瀹氫箟璁よ瘉寮曞叆gRPC锛歡RPCDeadlines
