https://github.com/grpc-ecosystem/grpc-gateway
サービスgrpcにアクセスするためにいるProtobuf形式に、前方grpcプロキシの上にレイヤーを追加し、
インストール
行くのget -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc- ゲートウェイ 行くのget -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen- 闊歩 行くのget -u githubのを。 COM / golang /いるProtobuf / protoc-GEN-行きます
Prod.proto
構文= 「proto3 」。 パッケージサービス。 インポート" グーグル/ API / annotations.proto " ; メッセージProdRequest { INT32 PROD_ID = 1。 // 传入的商品ID } メッセージProdResponse { INT32 prod_stock = 1。// 商品库存 } サービスProdService { RPC GetProdStock(ProdRequest)リターン(ProdResponse){ オプション(google.api.http) = { 得る:" / V1 / PROD / {PROD_IDを} " }。 } }
二つのファイル
まず、pbfilesにcd
これはProd.pb.go生成 Protoc ../:--go_out =プラグイン= GRPC サービスProd.proto これはProd.pb.gw.go生成 Protoc --grpc-gateway_out = = logtostderrをtrueに:製品版../サービス.proto
httpserver.go
メインパッケージ のインポート( " 文脈" " github.com/grpc-ecosystem/grpc-gateway/runtime " " google.golang.org/grpc " " grpcpro /サービス" " ログ" " ネット/ HTTP " ) {)(メインFUNCを gwmux: = runtime.NewServeMux() OPT: = [] grpc.DialOption {grpc.WithInsecure()} ERR: = services.RegisterProdServiceHandlerFromEndpoint(context.Background()、 gwmux、" ローカルホスト:8081 " 、 OPT) の場合、ERR!=ゼロ{ log.Fatal(ERR) } httpServerの: =&http.Server { ADDR:" :8080 " 、 ハンドラ:gwmux、 } httpServer.ListenAndServe() }
server.go
メインパッケージ のインポート( " google.golang.org/grpc " " grpcpro /サービス" " ネット" ) 、メイン(){FUNC :rpcServer = grpc.NewServer() services.RegisterProdServiceServer(rpcServer、新しい(services.ProdService)) 、LISを_: = net.Listen(" TCP "、" :8081 " ) rpcServer.Serve(LIS) }