一、GRPC使用JS
通過`grpc`的`@grpc/proto-loader`包,我們可以方便地將`.proto`文件生成的`service`數據結構轉換為`service`的構造函數。並且可以使用`@grpc/grpc-js`包直接連接`grpc`服務並調用服務方法,使用起來非常便捷。
下面是一個簡單的使用示例:
// 定義message和service
syntax = "proto3";
package proto;
message HelloRequest {
string name = 1;
}
message HelloResponse {
string message = 1;
}
service Greeter {
rpc SayHello (HelloRequest) returns (HelloResponse);
}
// 載入proto文件
const PROTO_PATH = path.join(__dirname, '../proto/helloworld.proto');
const packageDefinition = protoLoader.loadSync(PROTO_PATH, {
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true
});
const hello_proto = grpc.loadPackageDefinition(packageDefinition).helloworld;
// 創建客戶端連接
const client = new hello_proto.Greeter('localhost:50051', grpc.credentials.createInsecure());
// 調用服務方法
client.SayHello({name: 'world'}, (err, response) => {
console.log(response);
});
二、GRPC使用Msgpack
默認情況下,`grpc`使用`Protobuf`作為序列化/反序列化協議,但是用戶可以通過實現自定義`serializer`替換默認的`serializer`。
這裡我們介紹使用`msgpack`替代`protobuf`的示例:
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
const msgpack = require('msgpack5')();
// 定義序列化、反序列化函數
const serialize = (value) => {
return msgpack.encode(value).toString('binary');
};
const deserialize = (bytes) => {
return msgpack.decode(bytes);
};
// 載入proto文件
const protoDef = protoLoader.loadSync('example.proto');
const protoPackage = grpc.loadPackageDefinition(protoDef);
// 替換默認的protobuf serializer/deserializer
const options = {
binaryAsBase64: false,
serialize: serialize,
deserialize: deserialize
};
const client = new protoPackage.example.ExampleService('localhost:8888', grpc.credentials.createInsecure(), options);
// 調用服務方法
client.exampleMethod({}, (err, response) => {
console.log(response);
});
三、GRPC使用C++
使用`grpc`的C++實現非常方便簡單,只需要安裝`grpc`的C++依賴庫,然後使用C++代碼即可調用服務方法。
下面是一個簡單的使用示例:
void RunService() {
echo::EchoImpl service;
ServerBuilder builder;
builder.AddListeningPort("0.0.0.0:50051", grpc::InsecureServerCredentials());
builder.RegisterService(&service);
std::unique_ptr<Server> server(builder.BuildAndStart());
std::cout << "Server listening on " << server_address <Wait();
}
int main(int argc, char* argv[]) {
grpc::EnableDefaultHealthCheckService(true);
grpc::reflection::InitProtoReflectionServerBuilderPlugin();
RunService();
return 0;
}
四、GRPC使用什麼協議
`grpc`默認使用`protobuf`作為序列化/反序列化協議,但是用戶可以通過自定義`serializer`替換默認的協議。
五、GRPC使用域名
可以通過域名進行`grpc`服務的調用,只需要在客戶端的`new Client`語句中指定域名即可。
const client = new helloworld.Greeter('localhost:50051', grpc.credentials.createInsecure());
六、GRPC使用教程
推薦閱讀grpc的官方文檔https://grpc.io/docs/languages/js/basics/
七、GRPC使用場景
`grpc`適合分散式系統、微服務架構以及數據通信頻繁的場景。`grpc`優勢在於使用`protobuf`進行序列化和反序列化,效率非常高。
八、GRPC使用案例
實時在線教育
在線教育需要考慮實時性,`grpc`可以通過雙向流式RPC解決請求間數據傳輸的實時性問題,並且使用高效的`protobuf`序列化協議,可以優化數據傳輸效率。
金融數據傳輸
金融行業數據量大、傳輸頻繁、高效穩定的通信方式,非常適合使用`grpc`。
九、GO使用GRPC
Go語言作為Google開發的語言,支持grpc,非常適合使用grpc進行分散式服務的開發。
下面是一個簡單的示例,在Go中調用`grpc`服務:
package main
import (
"context"
"fmt"
"google.golang.org/grpc"
"net"
pb "path/to/proto"
)
type server struct{}
func (s *server) Hello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloResponse, error) {
return &pb.HelloResponse{Message: "Hello " + in.Name}, nil
}
func main() {
lis, err := net.Listen("tcp", "localhost:50051")
if err != nil {
fmt.Printf("failed to listen: %v", err)
}
s := grpc.NewServer()
pb.RegisterGreeterServer(s, &server{})
if err := s.Serve(lis); err != nil {
fmt.Printf("failed to serve: %v", err)
}
}
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/309517.html