gRPC服务器开发入门

gRPC是什么?

スクリーンショット 2021-12-10 12.53.29.png

这是由Google开发的协议之一,主要用于微服务之间(服务器之间)的通信。它基于远程过程调用(RPC)技术。

image.png

优点

常见的RESTful API与其不同之处如下所示,其优点如下:
常見的RESTful API与其不同之处如下所示,其优点如下:
– RESTful API与其常见之处不同之处在于以下方面:

常见的RESTful API与其不同之处包括以下方面,其优点如下:

常见的RESTful API与其不同之处如下所列,其优点如下:

常见的RESTful API与其不同之处在以下方面,其优点如下:

使用Protocol Buffers进行二进制数据传输
基于HTTP/2的快速传输
双向通信(类似于WebSocket)

Protocol Buffers(简称为ProtoBuf)是一种用于序列化结构化数据的语言无关、平台无关、可扩展且高效的机制。

image.png

在gRPC中,使用Protocol Buffers格式进行数据序列化和交换。由于是基于二进制的,与基于文本的协议相比,在通信中可以大大减少传输量。编写.proto文件并执行编译器将生成适用于任何语言的客户端和服务器代码。

实践篇

最终的目录结构如下。

スクリーンショット 2021-12-09 21.54.05.png

各种设置。

进行Protocol Buffers的安装。前提是已经安装了Homebrew。

$ brew install protobuf

进行go mod init操作。 设置从外部导入当前目录中的模块时的路径。

$ go mod init example.com

进行gRPC和Protocol Buffers的Go插件安装。

$ go get -u google.golang.org/grpc
$ go get -u github.com/golang/protobuf/protoc-gen-go

在使用Protocol Buffers进行开发时,首先需要将结构化数据定义在.proto文件中。

// protoのバージョン
syntax = "proto3";

// パッケージ名を指定
package code;

// コードが自動生成されるディレクトリを指定しています。
option go_package = "/code";

// APIにおけるサービス定義
service CodeService {
    rpc GetResult (Request) returns (Response) {}
}

// リクエストのメッセージ型を定義
message Request {
    string code = 1;
}

// レスポンスのメッセージ型を定義
message Response {
    string result = 1;
}

使用以下命令,通过protoc生成Go特定的gRPC代码。
在当前目录下创建一个code文件夹,并在其中生成code.pb.go文件。

$ protoc --go_out=plugins=grpc:. code.proto

服务器端的实现

package main

import (
    "google.golang.org/grpc"
    "fmt"
    "net"
    "example.com/code"
)

func main() {

    fmt.Println("Hello gRPC API Server !")

    // listenするportを設定します
    lis, err := net.Listen("tcp",":9000")

    // エラーハンドリング
    if err != nil {
        fmt.Println(err)
    }

    s := code.Server{}

    grpcServer := grpc.NewServer()

    code.RegisterCodeServiceServer(grpcServer, &s)

    // エラーハンドリング
    if err := grpcServer.Serve(lis); err != nil {
        fmt.Println(err)
    }
}
package code

import (
    "fmt"
    "golang.org/x/net/context"
)

type Server struct {
}

func (s *Server) GetResult(ctx context.Context, in *Request) (*Response, error) {
    // クライアントからリクエストを受け取る
    fmt.Println(in.Code)
    // ここでサーバーがクライアントにレスポンスを返す
    return &Response{Result: result}, nil
}

在客户端发送请求

package main

import (
    "fmt"
    "example.com/code"
    "golang.org/x/net/context"
    "google.golang.org/grpc"
)


func main() {

    var conn *grpc.ClientConn

    conn, err := grpc.Dial(":9000", grpc.WithInsecure())

    if err != nil {
        fmt.Println(err)
    }

    defer conn.Close()

    c := code.NewCodeServiceClient(conn)

    // リクエストを送信する
    response, err := c.GetResult(context.Background(), &code.Request{Code: text})

    if err != nil {
        fmt.Println(err)
    }

    // サーバーからのレスポンスを表示
    fmt.Println(response.Result)
}




最后

這次考慮了從Go(客戶端)向Go(服務器)發送請求的情況,但在與客戶端進行通信時,我們將使用gRPC-Web,例如Vue.js和React。如果有時間的話,我們也打算實現這一點,謝謝。

可以根据以下文献进行参考。

广告
将在 10 秒后关闭
bannerAds