鍘熸枃鍦板潃锛氬紩鍏RPC锛歍LS璇佷功璁よ瘉椤圭洰鍦板潃锛歨ttps://github.com/EDDYCJY/go...鍓嶈█鍦ㄥ墠闈㈢殑绔犺妭涓紝鎴戜滑浠嬬粛浜唃RPC鐨勫洓涓柟闈竴绉嶄娇鐢ˋPI鐨勬柟娉曘€傛槸涓嶆槸寰堢畝鍗曫煒€杩欐椂鍊欏嚭鐜颁簡瀹夊叏闂銆傚湪鍓嶉潰鐨勪緥瀛愪腑锛実RPCClient/Server閮芥槸鏄庢枃浼犺緭鐨勩€傛湁琚獌鍚殑椋庨櫓鍚楋紵鎬讳箣锛屾槸鐨勩€傚湪鏄庢枃閫氫俊鐨勬儏鍐典笅锛屼綘鐨勮姹傛槸璧よ8瑁哥殑锛屾湁鍙兘琚涓夋柟鎭舵剰绡℃敼鎴栬€呬吉閫犳垚鈥滈潪娉曗€濇暟鎹潵鎶㈠寘銆傚棷锛屾槑鏂囦紶杈撴槸姝g‘鐨勩€傝繖鏄湁闂鐨勶紝鎴戜滑灏嗘敼閫犳垜浠殑gRPC鏉ヨВ鍐宠繖涓棶棰橉煒よ瘉涔︾敓鎴愮閽pensslecparam-genkey-namesecp384r1-outserver.key鑷鍚嶅叕閽pensslreq-new-x509-sha256-keyserver.key-outserver.pem-days3650濉啓淇℃伅CountryName(2lettercode)[]:StateorProvinceName(fullname)[]:LocalityName(eg,city)[]:OrganizationName(eg,company)[]:OrganizationalUnitName(eg,section)[]:CommonName(eg,fullyqualifiedhostname)[]:go-grpc-exampleEmailAddress[]:鐢熸垚璇佷功鍚庯紝灏嗚瘉涔︾浉鍏崇殑鏂囦欢鏀惧湪conf/涓?鐩綍缁撴瀯锛?treego-grpc-examplego-grpc-example鈹溾攢鈹€client鈹溾攢鈹€conf鈹傗敎鈹€鈹€server.key鈹傗敂鈹€鈹€server.pem鈹溾攢鈹€proto鈹斺攢鈹€server鈹溾攢鈹€simple_server鈹斺攢鈹€stream_server鐢变簬鏈枃鍋忓悜gRPC锛岃鎯呰鍙傝€冦€婂埗浣滆瘉涔︺€嬨€傚悗缁墽闆嗗彲鑳戒細灞曞紑璇︾粏鎻忚堪馃憣涓轰粈涔堜箣鍓峴imple_server涓笉闇€瑕佽瘉涔︼紝涓轰粈涔堚€滀粈涔堥兘涓嶅仛鈥濆氨鍙互涓嶇敤璇佷功璺戯紵Servergrpc.NewServer()鏄剧劧娌℃湁浼犲叆浠讳綍DialOptionsClientconn,err:=grpc.Dial(":"+PORT,grpc.WithInsecure())鍦ㄥ鎴风娉ㄦ剰鍒癵rpc.WithInsecure()鏂规硶funcWithInsecure()DialOption{returnnewFuncDialOption(func(o*dialOptions){o.insecure=true})}鏂规硶涓紝鍙互鐪嬪埌WithInsecure杩斿洖浜嗕竴涓狣ialOption锛屽畠鏈€缁堜細閫氳繃璇诲彇璁剧疆鍊兼潵绂佺敤瀹夊叏浼犺緭锛岀劧鍚庘€渇inally鈥濆畠鍦ㄥ摢閲屽姞宸ワ紵璁╂垜浠妸娉ㄦ剰鍔涜浆绉诲埌grpc.Dial()鏂规硶涓妎pt.apply(&cc.dopts)}...if!cc.dopts.insecure{ifcc.dopts.copts.TransportCredentials==nil{returnnil,errNoTransportSecurity}}else{ifcc.dopts.copts.TransportCredentials!=nil{returnnil,errCredentialsConflict}for_,cd:=rangecc.dopts.copts.PerRPCCredentials{濡傛灉cd.RequireTransportSecurity(){returnnil,errTransportCredentialsMissing}}}...creds:=cc.dopts.copts.TransportCredentialsifcreds!=nil&&creds.Info().ServerName!=""{cc.authority=creds.Info().ServerName}elseifcc.dopts.insecure&&cc.dopts.authority!=""{cc.authority=cc.dopts.authority}else{//浣跨敤鏉ヨ嚜"scheme://authority/endpoint"鐨勭鐐逛綔涓篸efault//authorityforClientConn.cc.authority=cc.parsedTarget.Endpoint}...}gRPC鎺ヤ笅鏉ユ垜浠寮忓紑濮嬬紪鐮佸疄鐜癵RPCClient/Server涓婄殑TLS璇佷功璁よ瘉鏀寔馃TLSServerpackagemainimport("context""log""net""google.golang.org/grpc""google.golang.org/grpc/credentials"pb"github.com/EDDYCJY/go-grpc-example/proto")...constPORT="9001"funcmain(){c,err:=credentials.NewServerTLSFromFile("../../conf/server.pem","../../conf/server.key")iferr!=nil{鏃ュ織銆傛硶濉攍f("credentials.NewServerTLSFromFileerr:%v",err)}server:=grpc.NewServer(grpc.Creds(c))pb.RegisterSearchServiceServer(server,&SearchService{})lis,err:=net.Listen("tcp",":"+PORT)iferr!=nil{log.Fatalf("net.Listenerr:%v",err)}server.Serve(lis)}credentials.NewServerTLSFromFile:鏍规嵁璇佷功鏂囦欢鍜孠ey鏋勯€燭LS鍑嵁funcNewServerTLSFromFile(certFile,keyFilestring)(TransportCredentials,error){cert,err:=tls.LoadX509KeyPair(certFile,keyFile)iferr!=nil{returnnil,err}returnNewTLS(&tls.Config{璇佷功:[]tls.Certificate{cert}}),nil}grpc.Creds():杩斿洖涓€涓猄erverOption鐢ㄤ簬璁剧疆鏈嶅姟鍣ㄨ繛鎺ョ殑鍑嵁瀵逛簬grpc.NewServer(opt...ServerOption)涓篻RPCServer璁剧疆杩炴帴閫夐」funcCreds(ccredentials.TransportCredentials)ServerOption{returnfunc(o*options){o.creds=c}}缁忚繃涓婇潰涓や釜绠€鍗曠殑姝ラ锛実RPCServer寤虹珛浜嗕竴涓渶瑕佽瘉涔﹁璇佺殑鏈嶅姟馃TLSClientpackagemainimport("context""log""google.golang.org/grpc""google.golang.org/grpc/credentials"pb"github.com/EDDYCJY/go-grpc-example/proto")constPORT="9001"funcmain(){c,err:=credentials.NewClientTLSFromFile("../../conf/server.pem","go-grpc-example")iferr!=nil{log.Fatalf("credentials.NewClientTLSFromFileerr:%v",err)}conn,err:=grpc.Dial(":"+PORT,grpc.WithTransportCredentials(c))iferr!=nil{log.Fatalf("grpc.Dialerr:%v",err)}deferconn.Close()瀹㈡埛绔細=pb.NewSearchServiceClient(conn)resp,err:=client.Search(context.Background(),&pb.SearchRequest{Request:"gRPC",})iferr!=nil{log.Fatalf("client.Search鍛價:%v",err)}log.Printf("resp:%s",resp.GetResponse())}credentials.NewClientTLSFromFile():鏍规嵁璇佷功鏂囦欢鍜屽瘑閽ヨ緭鍏ユ瀯閫燭LS鍑瘉serverNameOverride浣滀负鏈嶅姟鍚嶇敱瀹㈡埛绔痜uncNewClientTLSFromFile(certFile,serverNameOverridestring)(TransportCredentials,error){b,err:=ioutil.ReadFile(certFile)iferr!=nil{returnnil,err}cp:=x509.NewCertPool()if!cp.AppendCertsFromPEM(b){returnnil,fmt.Errorf("credentials:failedtoappendcertificates")}returnNewTLS(&tls.Config{ServerName:serverNameOverride,RootCAs:cp}),nil}grpc.WithTransportCredentials():杩斿洖涓€涓厤缃繛鎺ialOption閫夐」銆傚浜巊rpc.Dial(targetstring,opts...DialOption)璁剧疆杩炴帴閫夐」funcWithTransportCredentials(credscredentials.TransportCredentials)DialOption{returnnewFuncDialOption(func(o*dialOptions){o.copts.TransportCredentials=creds})}璁よ瘉璇锋眰閲嶅惎server.go骞舵墽琛宑lient.go锛屽緱鍒板搷搴?gorunclient.go2018/09/3020:00:21resp:gRPCServer鎴愬姛鎶撳寘馃憤鎬荤粨鏈珷鎴戜滑瀹炵幇浜唃RPCTLSClient/Servert锛屼綘瑙夊緱浣犲畬鎴愪簡鍚楋紵鎴戞病鏈夐棶棰橉煒ゅ鏋滀綘浠旂粏鐪嬶紝瀹㈡埛绔牴鎹湇鍔″櫒鐨勮瘉涔﹀拰鏈嶅姟鍚嶇О寤虹珛璇锋眰銆傚湪杩欑鎯呭喌涓嬶紝浣犻渶瑕侀€氳繃鍚勭鏂瑰紡鎶婃湇鍔″櫒鐨勮瘉涔︿氦缁欏鎴风锛屽惁鍒欏氨浼氬嚭鐜版棤娉曞畬鎴愯繖涓换鍔$殑闂銆備綘涓嶈兘淇濊瘉浣犵殑鈥滃悇绉嶆墜娈碘€濋兘鏄畨鍏ㄧ殑銆傛瘯绔熺幇鍦ㄧ殑缃戠粶鐜寰堝嵄闄┿€備竾涓€琚姄鍒?..鎴戜滑浼氬湪涓嬩竴绔犺В鍐宠繖涓棶棰橈紝淇濊瘉鍏跺彲闈犳€RPC:gRPCClientandServer寮曞叆gRPC:gRPCStreaming,ClientandServer寮曞叆gRPC:TLScertificateauthentication寮曞叆gRPC:CA-basedTLScertificateauthentication寮曞叆gRPC锛歎naryandStreaminterceptor寮曞叆gRPC锛氳浣犵殑鏈嶅姟鍚屾椂鎻愪緵HTTP鎺ュ彛寮曞叆gRPC锛氫负RPC鏂规硶鍋氳嚜瀹氫箟璁よ瘉寮曞叆gRPC锛歡RPCDeadlines寮曞叆gRPC锛氬垎甯冨紡閾炬帴璺熻釜gRPC+Opentracing+Zipkin
