您的位置:首页 > 教程 > 其他脚本 > GoGrpcGateway兼容HTTP协议文档自动生成网关

GoGrpcGateway兼容HTTP协议文档自动生成网关

2022-06-16 13:07:13 来源:易采站长站 作者:

GoGrpcGateway兼容HTTP协议文档自动生成网关

目录
前言一,grpc-gateway介绍二,grpc-gateway环境准备二,编写grpc-gateway服务四,使用gateway生成swagger文档五,性能对比http -> go -> grpc -> gohttp -> go -> http -> grpc_gateway -> grpc -> go六,总结

JBi站长之家-易采站长站-Easck.Com

前言

调用,让客户端可以更具自身情况自由选择,服务端工作只需要做一份呢?还别说真还有一个准备好的轮子那就是今天的主角《grpc-gateway》。JBi站长之家-易采站长站-Easck.Com

附上:JBi站长之家-易采站长站-Easck.Com

博文实例demo:https://github.com/sunmi-OS/grpc-gateway-demoJBi站长之家-易采站长站-Easck.Com

grpc-gateway官网:https://github.com/grpc-ecosystem/grpc-gatewayJBi站长之家-易采站长站-Easck.Com

JBi站长之家-易采站长站-Easck.Com

一,grpc-gateway介绍

grpc-gateway是protoc的一个插件>

JBi站长之家-易采站长站-Easck.Com

JBi站长之家-易采站长站-Easck.Com

二,grpc-gateway环境准备

grpc-gateway使用完全的Go语言进行开发,所以安装起来也非常简单,首先需要获取相关的依赖包JBi站长之家-易采站长站-Easck.Com

PS:需要先准备好准备好protoc的环境JBi站长之家-易采站长站-Easck.Com

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文件:JBi站长之家-易采站长站-Easck.Com

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.protoJBi站长之家-易采站长站-Easck.Com

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.protoJBi站长之家-易采站长站-Easck.Com

最终可以看到以下文件JBi站长之家-易采站长站-Easck.Com

JBi站长之家-易采站长站-Easck.Com

JBi站长之家-易采站长站-Easck.Com

二,编写grpc-gateway服务

服务端代码:JBi站长之家-易采站长站-Easck.Com

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服务端:JBi站长之家-易采站长站-Easck.Com

go build grpc_service.go
./grpc_service

JBi站长之家-易采站长站-Easck.Com

编写gateway服务JBi站长之家-易采站长站-Easck.Com

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)
    }
}

运行网关程序JBi站长之家-易采站长站-Easck.Com

go build grpc_gateway.go
./grpc_gateway

JBi站长之家-易采站长站-Easck.Com

使用http的方式调用网关:JBi站长之家-易采站长站-Easck.Com

curl -X POST -k http://localhost:8080/v1/example/echo -d '{"value":" world"}'
{"value":"Hello  world"}

JBi站长之家-易采站长站-Easck.Com

四,使用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

JBi站长之家-易采站长站-Easck.Com

JBi站长之家-易采站长站-Easck.Com

五,性能对比

对比以下两项:JBi站长之家-易采站长站-Easck.Com

http>

http -> go -> http -> grpc_gateway -> grpc -> goJBi站长之家-易采站长站-Easck.Com

全程使用ab 带 -k进行压测JBi站长之家-易采站长站-Easck.Com

JBi站长之家-易采站长站-Easck.Com

http>

JBi站长之家-易采站长站-Easck.Com

JBi站长之家-易采站长站-Easck.Com

JBi站长之家-易采站长站-Easck.Com

http>

JBi站长之家-易采站长站-Easck.Com

JBi站长之家-易采站长站-Easck.Com

JBi站长之家-易采站长站-Easck.Com

六,总结

在GO的场景下基本上4倍差距,但是考虑到本身Go在grpc和http上本身就有3.5倍的差距,本身在同等HTTP的情况下经过grpc-gateway和不经过直接到API差距大概在20~30%左右,这样的性能消耗带来的是兼容HTTP并且还可以自动生成swagger(还可以作为调试工具),何乐而不为呢?JBi站长之家-易采站长站-Easck.Com

以上就是Go>

如有侵权,请联系QQ:279390809 电话:15144810328

相关文章

  • 使用Go基于WebSocket构建千万级视频直播弹幕系统的代码详解

    使用Go基于WebSocket构建千万级视频直播弹幕系统的代码详解

    (1)业务复杂度介绍 开门见山,假设一个直播间同时500W人在线,那么1秒钟1000条弹幕,那么弹幕系统的推送频率就是: 500W * 1000条/秒=50亿条/秒 ,想想B站2019跨年晚会那次弹幕系统得是
    2020-07-08
  • golang中import cycle not allowed解决的一种思路

    golang中import cycle not allowed解决的一种思路

    发现问题 项目中碰到了一些问题,使用了指针函数的思路来解决相应问题 在实际项目中,因为两个项目互相引了对方的一些方法,导致了循环引用的错误,原本可以使用http的请求来解
    2019-11-10
  • 从go语言中找&和*区别详解

    从go语言中找&和*区别详解

    *和的区别 : 是取地址符号 , 即取得某个变量的地址 , 如 ; a*是指针运算符 , 可以表示一个变量是指针类型 , 也可以表示一个指针变量所指向的存储单元 , 也就是这个地址所存储的值 . 从
    2020-06-23
  • Go语言中利用http发起Get和Post请求的方法示例

    Go语言中利用http发起Get和Post请求的方法示例

    关于 HTTP 协议 HTTP(即超文本传输协议)是现代网络中最常见和常用的协议之一,设计它的目的是保证客户机和服务器之间的通信。 HTTP 的工作方式是客户机与服务器之间的 “请求-应答
    2019-11-10
  • golang如何实现mapreduce单进程版本详解

    golang如何实现mapreduce单进程版本详解

    前言 MapReduce作为hadoop的编程框架,是工程师最常接触的部分,也是除去了网络环境和集群配 置之外对整个Job执行效率影响很大的部分,所以很有必要深入了解整个过程。元旦放假的第一天
    2019-11-10
  • Go打包二进制文件的实现

    Go打包二进制文件的实现

    背景 众所周知,go语言可打包成目标平台二进制文件是其一大优势,如此go项目在服务器不需要配置go环境和依赖就可跑起来。 操作 需求:打包部署到centos7 笔者打包环境:mac os 方法:
    2020-03-11
  • GO语言实现简单的目录复制功能

    GO语言实现简单的目录复制功能

    本文实例讲述了GO语言实现简单的目录复制功能。分享给大家供大家参考。具体实现方法如下: 创建一个独立的 goroutine 遍历文件,主进程负责写入数据。程序会复制空目录,也可以设
    2019-11-10
  • golang中定时器cpu使用率高的现象详析

    golang中定时器cpu使用率高的现象详析

    前言: 废话少说,上线一个用golang写的高频的任务派发系统,上线跑着很稳定,但有个缺点就是当没有任务的时候,cpu的消耗也在几个百分点。 平均值在3%左右的cpu使用率。你没有任务
    2019-11-10