簡體   English   中英

gRPC服務器如何調用REST端點

[英]How can a gRPC server make calls to REST endpoints

我目前是gRPC技術的新手,並且一直在閱讀它。

我目前的理解是,就像REST一樣, gRPC只是另一種協議。 現在假設我啟動了一個我希望客戶端使用的gRPC服務器,但是在該gRPC服務器中,我希望能夠從外部消費者RESTful Apis獲取信息(例如https://developer.riotgames.com/ api-methods / )仍然可行嗎?

對的,這是可能的。 您可以從自己的gRPC服務代碼調用其他API和服務。

只需讓您的客戶致電您的gRPC服務即可。 然后,您的服務對外部API進行REST調用(可能使用客戶端請求到gRPC服務的參數)並進行處理。 將結果返回給客戶端,但是您的gRPC服務會響應。

你可能會需要使用grcp-gateway生成代理上提供完整的代碼復GRPC教程感謝phuongdo 在此處輸入圖片說明

  1. 安裝部門:

     $sudo apt install libprotobuf-dev go get google.golang.org/grpc go get -u github.com/golang/protobuf/{proto,protoc-gen-go} go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway 
  2. 定義服務,pb / service.proto:

     syntax = "proto3"; option go_package = "echo"; package echo; import "google/api/annotations.proto"; //Message represents a simple message sent to the Echo service. message Message { string id = 1; string msg = 2; } //Echo service responds to incoming echo requests. service EchoService { //Echo method receives a simple message and returns it. //The message posted as the id parameter will also be returned. rpc Echo(Message) returns (Message) { option (google.api.http) = { post: "/v1/example/echo/{id}/{msg}" }; } } 
  3. 為服務器和客戶端生成存根

     $ protoc -I/usr/local/include -I. \\ -I$GOPATH/src \\ -I$GOPATH/src/github.com/grpc-ecosystem/grpc- gateway/third_party/googleapis \\ --go_out=google/api/annotations.proto=github.com/grpc-ecosystem/grpc- gateway/third_party/googleapis/google/api,plugins=grpc:. \\ pb/service.proto 
  4. REST API reverse proxy

     $ protoc -I/usr/local/include -I. \\ -I$GOPATH/src \\ -I$GOPATH/src/github.com/grpc-ecosystem/grpc- gateway/third_party/googleapis \\ --grpc-gateway_out=logtostderr=true:. \\ pb/service.proto 
  5. 服務器/ server.go:

     package main import ( "flag" "github.com/golang/glog" pb "github.com/go-grpc-tutorial/pb" "golang.org/x/net/context" "google.golang.org/grpc" "net" ) // Implements of EchoServiceServer type echoServer struct{} func newEchoServer() pb.EchoServiceServer { return new(echoServer) } func (s *echoServer) Echo(ctx context.Context, msg *pb.Message) (*pb.Message, error) { glog.Info(msg) return msg, nil } func Run() error { listen, err := net.Listen("tcp", ":50051") if err != nil { return err } server := grpc.NewServer() pb.RegisterEchoServiceServer(server, newEchoServer()) server.Serve(listen) return nil } func main() { flag.Parse() defer glog.Flush() if err := Run(); err != nil { glog.Fatal(err) } } 
  6. 編寫rest api,server / server-rproxy.go:

     package main import ( "flag" "net/http" "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/golang/glog" pb "github.com/go-grpc-tutorial/pb" "golang.org/x/net/context" "google.golang.org/grpc" ) var ( echoEndpoint = flag.String("echo_endpoint", "localhost:50051", "endpoint of EchoService") ) func RunEndPoint(address string, opts ...runtime.ServeMuxOption) error { ctx := context.Background() ctx, cancel := context.WithCancel(ctx) defer cancel() mux := runtime.NewServeMux(opts...) dialOpts := []grpc.DialOption{grpc.WithInsecure()} err := pb.RegisterEchoServiceHandlerFromEndpoint(ctx, mux, *echoEndpoint, dialOpts) if err != nil { return err } http.ListenAndServe(address, mux) return nil } func main() { flag.Parse() defer glog.Flush() if err := RunEndPoint(":8080"); err != nil { glog.Fatal(err) } } 
  7. 構建客戶端服務器/client.go:

      package main import ( "log" "os" "golang.org/x/net/context" "google.golang.org/grpc" pb "github.com/go-grpc-tutorial/pb" ) const ( address = "localhost:50051" defaultName = "PhuongDV" ) func main() { // Set up a connection to the server. conn, err := grpc.Dial(address, grpc.WithInsecure()) if err != nil { log.Fatalf("did not connect: %v", err) } defer conn.Close() c := pb.NewEchoServiceClient(conn) // Contact the server and print out its response. name := defaultName if len(os.Args) > 1 { name = os.Args[1] } r, err := c.Echo(context.Background(), &pb.Message{Id: "1", Msg: name}) if err != nil { log.Fatalf("could not greet: %v", err) } log.Printf("Greeting: %s", r.Msg) } 
  8. 最終運行服務器,客戶端,休息並調用休息:

     $ go run server/server.go $ go run client/client.go $go run server/server-rproxy.go $ curl -X POST "http://localhost:8080/v1/example/echo/1/PhuongDV" 

    1https//github.com/phuongdo/go-grpc-tutorial 2https//i.stack.imgur.com/C4s7s.png

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM