gRPC服务器开发入门
gRPC是什么?
这是由Google开发的协议之一,主要用于微服务之间(服务器之间)的通信。它基于远程过程调用(RPC)技术。
优点
常见的RESTful API与其不同之处如下所示,其优点如下:
常見的RESTful API与其不同之处如下所示,其优点如下:
– RESTful API与其常见之处不同之处在于以下方面:
常见的RESTful API与其不同之处包括以下方面,其优点如下:
常见的RESTful API与其不同之处如下所列,其优点如下:
常见的RESTful API与其不同之处在以下方面,其优点如下:
使用Protocol Buffers进行二进制数据传输
基于HTTP/2的快速传输
双向通信(类似于WebSocket)
Protocol Buffers(简称为ProtoBuf)是一种用于序列化结构化数据的语言无关、平台无关、可扩展且高效的机制。
在gRPC中,使用Protocol Buffers格式进行数据序列化和交换。由于是基于二进制的,与基于文本的协议相比,在通信中可以大大减少传输量。编写.proto文件并执行编译器将生成适用于任何语言的客户端和服务器代码。
实践篇
最终的目录结构如下。
各种设置。
进行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。如果有時間的話,我們也打算實現這一點,謝謝。