網站首頁 編程語言 正文
前言
調用,讓客戶端可以更具自身情況自由選擇,服務端工作只需要做一份呢?還別說真還有一個準備好的輪子那就是今天的主角《grpc-gateway》。
附上:
博文實例demo:https://github.com/sunmi-OS/grpc-gateway-demo
grpc-gateway官網:https://github.com/grpc-ecosystem/grpc-gateway
一,grpc-gateway介紹
grpc-gateway是protoc的一個插件 。它讀取Grpc服務定義,并生成反向代理服務器,將RESTful JSON API請求轉換為Grpc的方式調用。主要是根據 google.api.http定義中思想完成的,一下就是grpc-gateway結構圖:
二,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
最終可以看到以下文件
二,編寫grpc-gateway服務
服務端代碼:
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"}
四,使用gateway生成swagger文檔
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進行壓測
http -> go -> grpc -> go
http -> go -> http -> grpc_gateway -> grpc -> go
六,總結
在GO的場景下基本上4倍差距,但是考慮到本身Go在grpc和http上本身就有3.5倍的差距,本身在同等HTTP的情況下經過grpc-gateway和不經過直接到API差距大概在20~30%左右,這樣的性能消耗帶來的是兼容HTTP并且還可以自動生成swagger(還可以作為調試工具),何樂而不為呢?
原文鏈接:https://juejin.cn/post/6844904074454925319
相關推薦
- 2022-10-06 C#中List<T>存放元素的工作機制_C#教程
- 2022-12-01 解決k8s?namespace?一直處于?Terminating?狀態的問題_云其它
- 2022-11-24 詳解Linux定時任務Crontab的介紹與使用_linux shell
- 2022-05-14 linq中的分區操作符_實用技巧
- 2022-11-16 一文搞懂阿里云服務器部署Redis并整合Spring?Boot_Redis
- 2022-08-20 Linux常用高頻命令_linux shell
- 2023-09-18 ECharts 觸發click點擊事件的兩種方式
- 2022-06-01 python?嵌套型partials的使用_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支