最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go Grpc Gateway兼容HTTP協(xié)議文檔自動(dòng)生成網(wǎng)關(guān)

 更新時(shí)間:2022年06月16日 10:47:06   作者:文振熙  
這篇文章主要為大家介紹了Go Grpc Gateway兼容HTTP協(xié)議文檔自動(dòng)生成網(wǎng)關(guān)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

前言

調(diào)用,讓客戶端可以更具自身情況自由選擇,服務(wù)端工作只需要做一份呢?還別說(shuō)真還有一個(gè)準(zhǔn)備好的輪子那就是今天的主角《grpc-gateway》。

附上:

博文實(shí)例demo:https://github.com/sunmi-OS/grpc-gateway-demo

grpc-gateway官網(wǎng):https://github.com/grpc-ecosystem/grpc-gateway

一,grpc-gateway介紹

grpc-gateway是protoc的一個(gè)插件 。它讀取Grpc服務(wù)定義,并生成反向代理服務(wù)器,將RESTful JSON API請(qǐng)求轉(zhuǎn)換為Grpc的方式調(diào)用。主要是根據(jù) google.api.http定義中思想完成的,一下就是grpc-gateway結(jié)構(gòu)圖:

二,grpc-gateway環(huán)境準(zhǔn)備

grpc-gateway使用完全的Go語(yǔ)言進(jìn)行開(kāi)發(fā),所以安裝起來(lái)也非常簡(jiǎn)單,首先需要獲取相關(guān)的依賴包

PS:需要先準(zhǔn)備好準(zhǔn)備好protoc的環(huán)境

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結(jié)構(gòu)文件和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

最終可以看到以下文件

二,編寫(xiě)grpc-gateway服務(wù)

服務(wù)端代碼:

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服務(wù)已經(jīng)開(kāi)啟")
    s.Serve(lis)
}

運(yùn)行g(shù)rpc服務(wù)端:

go build grpc_service.go
./grpc_service

編寫(xiě)gateway服務(wù)

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("服務(wù)開(kāi)啟")
    return http.ListenAndServe(":8080", mux)
}
func main() {
    flag.Parse()
    defer glog.Flush()
    if err := run(); err != nil {
        glog.Fatal(err)
    }
}

運(yùn)行網(wǎng)關(guān)程序

go build grpc_gateway.go
./grpc_gateway

使用http的方式調(diào)用網(wǎng)關(guān):

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

五,性能對(duì)比

對(duì)比以下兩項(xiàng):

http -> go -> grpc -> go

http -> go -> http -> grpc_gateway -> grpc -> go

全程使用ab 帶 -k進(jìn)行壓測(cè)

http -> go -> grpc -> go

http -> go -> http -> grpc_gateway -> grpc -> go

六,總結(jié)

在GO的場(chǎng)景下基本上4倍差距,但是考慮到本身Go在grpc和http上本身就有3.5倍的差距,本身在同等HTTP的情況下經(jīng)過(guò)grpc-gateway和不經(jīng)過(guò)直接到API差距大概在20~30%左右,這樣的性能消耗帶來(lái)的是兼容HTTP并且還可以自動(dòng)生成swagger(還可以作為調(diào)試工具),何樂(lè)而不為呢?

以上就是Go Grpc Gateway兼容HTTP協(xié)議文檔自動(dòng)生成網(wǎng)關(guān)的詳細(xì)內(nèi)容,更多關(guān)于Go Grpc Gateway兼容HTTP的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • golang值接收者和指針接收者的區(qū)別介紹

    golang值接收者和指針接收者的區(qū)別介紹

    這篇文章主要介紹了golang值接收者和指針接收者的區(qū)別,它和函數(shù)的區(qū)別在于方法有一個(gè)接收者,給一個(gè)函數(shù)添加一個(gè)接收者,那么它就變成了方法,接收者可以是值接收者,也可以是指針接收者,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-08-08
  • Go語(yǔ)言反射reflect.Value實(shí)現(xiàn)方法的調(diào)用

    Go語(yǔ)言反射reflect.Value實(shí)現(xiàn)方法的調(diào)用

    本文主要介紹了Go語(yǔ)言反射reflect.Value實(shí)現(xiàn)方法的調(diào)用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 關(guān)于golang中map使用的幾點(diǎn)注意事項(xiàng)總結(jié)(強(qiáng)烈推薦!)

    關(guān)于golang中map使用的幾點(diǎn)注意事項(xiàng)總結(jié)(強(qiáng)烈推薦!)

    map是一種無(wú)序的基于key-value的數(shù)據(jù)結(jié)構(gòu),Go語(yǔ)言中的map是引用類(lèi)型,必須初始化才能使用,下面這篇文章主要給大家介紹了關(guān)于golang中map使用的幾點(diǎn)注意事項(xiàng),需要的朋友可以參考下
    2023-01-01
  • GO語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的目錄復(fù)制功能

    GO語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的目錄復(fù)制功能

    這篇文章主要介紹了GO語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的目錄復(fù)制功能,通過(guò)新建及復(fù)制內(nèi)容等操作最終實(shí)現(xiàn)復(fù)制目錄的功能效果,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2014-12-12
  • golang多次讀取http request body的問(wèn)題分析

    golang多次讀取http request body的問(wèn)題分析

    這篇文章主要給大家分析了golang多次讀取http request body的問(wèn)題,文中通過(guò)代碼示例和圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • Go?web中cookie值安全securecookie庫(kù)使用原理

    Go?web中cookie值安全securecookie庫(kù)使用原理

    這篇文章主要為大家介紹了Go?web中cookie值安全securecookie庫(kù)使用及實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-11-11
  • go語(yǔ)言中g(shù)orm時(shí)間格式化

    go語(yǔ)言中g(shù)orm時(shí)間格式化

    本文主要介紹了go語(yǔ)言中g(shù)orm時(shí)間格式化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • golang讀取各種配置文件(ini、json、yaml)

    golang讀取各種配置文件(ini、json、yaml)

    日常項(xiàng)目中,讀取各種配置文件是避免不了的,本文主要介紹了golang讀取各種配置文件(ini、json、yaml),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • mayfly-go部署和使用詳解

    mayfly-go部署和使用詳解

    這篇文章主要介紹了mayfly-go部署和使用詳解,此處部署基于CentOS7.4部署,結(jié)合實(shí)例代碼圖文給大家講解的非常詳細(xì),需要的朋友可以參考下
    2022-09-09
  • Golang語(yǔ)言的多種變量聲明方式與使用場(chǎng)景詳解

    Golang語(yǔ)言的多種變量聲明方式與使用場(chǎng)景詳解

    Golang當(dāng)中的變量類(lèi)型和C/C++比較接近,一般用的比較多的也就是int,float和字符串,下面這篇文章主要給大家介紹了關(guān)于Golang語(yǔ)言的多種變量聲明方式與使用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下
    2022-02-02

最新評(píng)論

张家川| 丽水市| 沈丘县| 葫芦岛市| 汉寿县| 上林县| 志丹县| 时尚| 深泽县| 苏尼特左旗| 尉氏县| 尉氏县| 鹤庆县| 明光市| 六枝特区| 陆川县| 贡山| 孟津县| 冷水江市| 冷水江市| 桐梓县| 临沭县| 汝城县| 社会| 汕头市| 广元市| 黄石市| 灵川县| 卢龙县| 鞍山市| 吐鲁番市| 西和县| 威信县| 武定县| 京山县| 汕头市| 黄龙县| 东光县| 松原市| 喜德县| 罗源县|