发布时间:2024-10-29 16:01
调用,让客户端可以更具自身情况自由选择,服务端工作只需要做一份呢?还别说真还有一个准备好的轮子那就是今天的主角《grpc-gateway》。
附上:
博文实例demo:https://github.com/sunmi-OS/grpc-gateway-demo
grpc-gateway官网:https://github.com/grpc-ecosystem/grpc-gateway
grpc-gateway是protoc的一个插件 。它读取Grpc服务定义,并生成反向代理服务器,将RESTful JSON API请求转换为Grpc的方式调用。主要是根据 google.api.http定义中思想完成的,一下就是grpc-gateway结构图:
grpc-gateway使用完全的Go语言进行开发,所以安装起来也非常简单,首先需要获取相关的依赖包
PS:需要先准备好准备好protoc的环境
go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger go get -u github.com/golang/protobuf/protoc-gen-go
cd $GOPATH/src/ mkdir -p grpc-gateway-demo/gateway cd grpc-gateway-demo/gateway vim gateway.proto syntax = \"proto3\"; package gateway; # 新增以下引入 import \"google/api/annotations.proto\"; message StringMessage { string value = 1; } # 修改方法增加http定义 # service Gateway { # rpc SayHello Echo(StringMessage) returns (StringMessage) {} # } service Gateway { rpc Echo(StringMessage) returns (StringMessage) { option (google.api.http) = { post: \"/v1/example/echo\" body: \"*\" }; } }
生成grpc结构文件和gateway文件:
protoc --proto_path=../ -I/usr/local/include -I. -I$GOPATH/src -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis --go_out=plugins=grpc:. gateway.proto
protoc --proto_path=../ -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:. gateway.proto
最终可以看到以下文件
服务端代码:
cd .. vim grpc_service.go package main import ( \"log\" \"net\" pb \"grpc-gateway-demo/gateway\" \"google.golang.org/grpc\" \"golang.org/x/net/context\" ) const ( PORT = \":9192\" ) type server struct {} func (s *server) Echo(ctx context.Context, in *pb.StringMessage) (*pb.StringMessage, error) { log.Println(\"request: \", in.Value) return &pb.StringMessage{Value: \"Hello \" + in.Value}, nil } func main() { lis, err := net.Listen(\"tcp\", PORT) if err != nil { log.Fatalf(\"failed to listen: %v\", err) } s := grpc.NewServer() pb.RegisterGatewayServer(s, &server{}) log.Println(\"rpc服务已经开启\") s.Serve(lis) }
运行grpc服务端:
go build grpc_service.go ./grpc_service
编写gateway服务
vim grpc_gateway.go package main import ( \"flag\" \"net/http\" \"log\" \"github.com/golang/glog\" \"golang.org/x/net/context\" \"github.com/grpc-ecosystem/grpc-gateway/runtime\" \"google.golang.org/grpc\" gw \"grpc-gateway-demo/gateway\" ) var ( echoEndpoint = flag.String(\"echo_endpoint\", \"localhost:9192\", \"endpoint of Gateway\") ) func run() error { ctx := context.Background() ctx, cancel := context.WithCancel(ctx) defer cancel() mux := runtime.NewServeMux() opts := []grpc.DialOption{grpc.WithInsecure()} err := gw.RegisterGatewayHandlerFromEndpoint(ctx, mux, *echoEndpoint, opts) if err != nil { return err } log.Println(\"服务开启\") return http.ListenAndServe(\":8080\", mux) } func main() { flag.Parse() defer glog.Flush() if err := run(); err != nil { glog.Fatal(err) } }
运行网关程序
go build grpc_gateway.go ./grpc_gateway
使用http的方式调用网关:
curl -X POST -k http://localhost:8080/v1/example/echo -d \'{\"value\":\" world\"}\' {\"value\":\"Hello world\"}
cd gateway protoc -I/usr/local/include -I. \\ -I$GOPATH/src \\ -I$GOPATH/src/github.com/grpc-ecosystem/grpc-gateway/third_party/googleapis \\ --swagger_out=logtostderr=true:. \\ gateway.proto
对比以下两项:
http -> go -> grpc -> go
http -> go -> http -> grpc_gateway -> grpc -> go
全程使用ab 带 -k进行压测
在GO的场景下基本上4倍差距,但是考虑到本身Go在grpc和http上本身就有3.5倍的差距,本身在同等HTTP的情况下经过grpc-gateway和不经过直接到API差距大概在20~30%左右,这样的性能消耗带来的是兼容HTTP并且还可以自动生成swagger(还可以作为调试工具),何乐而不为呢?
以上就是Go Grpc Gateway兼容HTTP协议文档自动生成网关的详细内容,更多关于Go Grpc Gateway兼容HTTP的资料请关注脚本之家其它相关文章!
BERT模型(Attention注意力机制 + Transformer Encoder)
用c++设计一个类Line,用于表示二维坐标体系中的任意一条直线并输出该直线的属性。
使用StanfordCoreNLP的句法树以及NLTK的Tree建立DGL的图数据结构
kernel 劫持seq_operations && 利用pt_regs
mysql为什么不用b树_为什么Mysql用B+树做索引而不用B树
SAP UI5 ObjectPageLayout 控件使用方法分享
python中ahp的代码_AHP | 层次分析法原理及Python实现
docker出现GPG error: At least one invalid signature was encountered 相关问题及解决方法