转载

golang工程组件之网关grpc-gateway

一、概述

在现代的微服务架构中,网关是一个非常重要的组件。它负责接收和处理客户端请求,并将它们转发给相应的服务。而gRPC Gateway则是一个Golang工程组件,它可以将RESTful API转换为gRPC API,从而方便我们使用gRPC协议进行服务之间的通信。本文将介绍gRPC Gateway的基本概念、安装和使用方法。

二、什么是gRPC Gateway

gRPC Gateway是一个Golang开源项目,它可以将标准的HTTP/1.1 RESTful API转换为gRPC API,以便于使用gRPC协议进行服务之间的通信。它支持多种后端实现方式,包括gRPC、OpenAPI/Swagger和自定义HTTP后端。

三、gRPC Gateway的安装

在使用gRPC Gateway之前,需要先安装它。在Golang中,可以使用go get命令轻松安装gRPC Gateway:

go get -u github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway

同时,还需要安装protoc和protoc-gen-go插件:

go get -u github.com/golang/protobuf/protoc-gen-go

四、使用gRPC Gateway

4.1 生成gRPC代码和Gateway代码

在使用gRPC Gateway之前,需要先生成gRPC代码和Gateway代码。通过protoc命令可以完成这个工作:

# 生成gRPC代码
protoc --go_out=plugins=grpc:. *.proto

# 生成Gateway代码
protoc \
  --grpc-gateway_out=logtostderr=true:. \
  --swagger_out=logtostderr=true:. \
  *.proto

在上面的例子中,我们首先使用--go_out=plugins=grpc:参数生成gRPC代码。这个命令会根据.proto文件生成对应的.go文件。

接着,我们使用--grpc-gateway_out=logtostderr=true:参数生成Gateway代码。同时,还使用了--swagger_out=logtostderr=true:参数生成Swagger API文档。这些命令会根据.proto文件生成对应的.gw.go和.swagger.json文件。

4.2 编写Gateway服务

编写Gateway服务非常简单,只需要引入包并创建一个新的Server即可:

import (
    "context"
    "log"
    "net/http"

    gw "path/to/your/service/proto" // 替换为实际的.proto文件路径
    "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
    "google.golang.org/grpc"
)

func run() error {
    ctx := context.Background()
    ctx, cancel := context.WithCancel(ctx)
    defer cancel()

    mux := runtime.NewServeMux()

    opts := []grpc.DialOption{grpc.WithInsecure()}
    grpcEndpoint := "localhost:50051" // gRPC server地址

    err := gw.RegisterYourServiceHandlerFromEndpoint(ctx, mux, grpcEndpoint, opts)
    if err != nil {
        log.Fatalf("Failed to register gateway: %v", err)
    }

    return http.ListenAndServe(":8080", mux)
}

func main() {
    if err := run(); err != nil {
        log.Fatalf("Failed to start gateway: %v", err)
    }
}

在上面的例子中,我们引入了runtimegrpc包,并创建了一个新的Server对象。然后,我们定义了一些参数,如gRPC server地址、Dial选项等。接着,我们使用gw.RegisterYourServiceHandlerFromEndpoint方法将Gateway服务注册到gRPC server上。

最后,我们启动http server并将其绑定到8080端口。

4.3 编写RESTful API

RESTful API定义在.proto文件中,它们会被gRPC Gateway自动转换为gRPC API。下面是一个示例:

syntax = "proto3";

package your.package;

option go_package = "your/package;your_service";

import "google/api/annotations.proto"; // 引入标注库

service YourService {
  rpc GetBook(GetBookRequest) returns (GetBookResponse) {
    option (google.api.http) = {
      get: "/books/{id}"
    };
  }
}

message GetBookRequest {
  string id = 1;
}

message GetBookResponse {
  string name = 1;
  string author = 2;
  string description = 3;
}

在上面的例子中,我们定义了一个名为YourService的服务,并在其中定义了一个名为GetBook的rpc方法,并使用google.api.http标注库指定了对应的RESTful API地址。

同时,我们定义了两个消息类型GetBookRequest和GetBookResponse。

4.4 启动服务

在完成以上步骤后,我们就可以启动Gateway服务了:

go run main.go

然后,我们可以使用curl或其他HTTP客户端访问RESTful API:

curl http://localhost:8080/books/123

在上面的例子中,我们使用curl访问http://localhost:8080/books/123地址,该地址对应了GetBook方法的GET请求,并将id参数设置为123。

五、总结

本文简要介绍了Golang工程组件之一的网关gRPC Gateway的概念、安装和使用方法。通过gRPC Gateway,我们可以轻松地将标准的HTTP/1.1 RESTful API转换为gRPC API,从而方便我们使用gRPC协议进行服务之间的通信。同时,gRPC Gateway还支持多种后端实现方式,包括gRPC、OpenAPI/Swagger和自定义HTTP后端等。

最后,更多Golang文档资料,面试资料,往期课件资料、学习路线图+Q群:793221798

Golang公开课学习地址:https://ke.qq.com/course/422970?flowToken=1044587(免费订阅,永久学习)

正文到此结束
该篇文章的评论功能已被站长关闭