GRPC使用詳解

一、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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2025-01-04 19:31
下一篇 2025-01-04 19:31

相關推薦

  • eclipse grpc開發指南

    本文將介紹如何使用eclipse進行grpc的開發。包括如何創建grpc項目、定義protobuf文件、生成服務端和客戶端的代碼、實現grpc服務等。通過本篇文章的學習,你將會掌握…

    編程 2025-04-27
  • Linux sync詳解

    一、sync概述 sync是Linux中一個非常重要的命令,它可以將文件系統緩存中的內容,強制寫入磁碟中。在執行sync之前,所有的文件系統更新將不會立即寫入磁碟,而是先緩存在內存…

    編程 2025-04-25
  • 神經網路代碼詳解

    神經網路作為一種人工智慧技術,被廣泛應用於語音識別、圖像識別、自然語言處理等領域。而神經網路的模型編寫,離不開代碼。本文將從多個方面詳細闡述神經網路模型編寫的代碼技術。 一、神經網…

    編程 2025-04-25
  • nginx與apache應用開發詳解

    一、概述 nginx和apache都是常見的web伺服器。nginx是一個高性能的反向代理web伺服器,將負載均衡和緩存集成在了一起,可以動靜分離。apache是一個可擴展的web…

    編程 2025-04-25
  • 詳解eclipse設置

    一、安裝與基礎設置 1、下載eclipse並進行安裝。 2、打開eclipse,選擇對應的工作空間路徑。 File -> Switch Workspace -> [選擇…

    編程 2025-04-25
  • Python安裝OS庫詳解

    一、OS簡介 OS庫是Python標準庫的一部分,它提供了跨平台的操作系統功能,使得Python可以進行文件操作、進程管理、環境變數讀取等系統級操作。 OS庫中包含了大量的文件和目…

    編程 2025-04-25
  • MPU6050工作原理詳解

    一、什麼是MPU6050 MPU6050是一種六軸慣性感測器,能夠同時測量加速度和角速度。它由三個感測器組成:一個三軸加速度計和一個三軸陀螺儀。這個組合提供了非常精細的姿態解算,其…

    編程 2025-04-25
  • Python輸入輸出詳解

    一、文件讀寫 Python中文件的讀寫操作是必不可少的基本技能之一。讀寫文件分別使用open()函數中的’r’和’w’參數,讀取文件…

    編程 2025-04-25
  • Java BigDecimal 精度詳解

    一、基礎概念 Java BigDecimal 是一個用於高精度計算的類。普通的 double 或 float 類型只能精確表示有限的數字,而對於需要高精度計算的場景,BigDeci…

    編程 2025-04-25
  • git config user.name的詳解

    一、為什麼要使用git config user.name? git是一個非常流行的分散式版本控制系統,很多程序員都會用到它。在使用git commit提交代碼時,需要記錄commi…

    編程 2025-04-25

發表回復

登錄後才能評論