まえがき: bct の適用って
service
何度もあるproto
のですが、よくわかりません、勉強しましょう~
ここにフラグを立てて、年末にネットワーク技術者検定か組込み技術者検定を取りましょう。
NOTICE 2023-09-26 10:56:46.336009+0800: Stopping tcpdump since packet capture is not required by the remaining tests
NOTICE 2023-09-26 10:56:46.336774+0800: Terminating BCT.
*** Beginning Network Interoperability Test ***
Please enter the device's service type in the form
"_<service>._<proto>.local.", e.g. "_printer._tcp.local."
(or try again with "-M"):
Proto ファイルは、データ構造とサービス インターフェイスを定義するために Google によって開発された言語で、さまざまなプラットフォーム間のデータ交換や通信によく使用されます。
Proto ファイルは、メッセージ、サービス、列挙という 3 つの主要コンポーネントで構成されます。
メッセージは、オブジェクト指向プログラミングのクラスと同様に、データ構造を定義する主な方法です。メッセージ内のフィールドを定義し、フィールドのタイプと名前を指定し、コメントなどのメタデータを追加できます。
サービスは、リモートで呼び出すことができる一連のメソッドを定義します。各メソッドには入力パラメータと出力パラメータがあり、サービス内に複数のメソッドを定義できます。
列挙は、メッセージ フィールドの値の範囲またはサービス メソッドのオプションとして使用できる、一連の名前付き整定定数を定義します。
上記の基本コンポーネントに加えて、Proto ファイルは他の Proto ファイルをインポートするためのインポート ステートメントもサポートしており、モジュール化と再利用を実現できます。
Proto ファイルは、簡潔な構文を使用してデータ構造とインターフェイスを定義し、拡張機能やカスタム オプションなどの高度な機能もサポートしているため、クロスプラットフォームのデータ交換や通信シナリオに非常に適しています。
Proto ファイルは単なる定義言語であり、特定の実装コードに直接対応しているわけではないことに注意してください。Proto ファイルをターゲット プラットフォームの特定のコードに変換するには、対応するコンパイラーまたはツールを使用する必要があります。
Proto ファイル定義とパラメータの説明を最適化する
1. Proto ファイルの命名規則:
パッケージ名.サービス名.proto
2. プロト構文のキーワード:
- 構文: プロトコル タイプ。現在、proto3 と proto2 の 2 つのプロトコル セットがあります。proto3 を使用することをお勧めします。proto ファイルの最初の行に配置する必要があります。
- package: パッケージ名。2 行目に配置する必要があります。
- service: メソッド インターフェイスと同様に、Proto ファイル内のメソッドのコレクションを定義します。
- message: Go 言語の構造と同様に、メソッドの受信パラメーターと戻りパラメーターが定義されるメッセージ構造を定義します。
- returns: サービスで使用される戻り応答を定義します。
- rpc: サービスで使用されるメソッドを定義します。
変数の型:
- オプション: メッセージと一緒に使用され、フィールドがオプションであり、渡される場合と渡されない場合があることを示します。
- 繰り返し: メッセージとともに使用され、フィールドが配列として受信されるか返されることを示します。
3. 例:
syntax = "proto3";
package user;
service HelloService {
rpc SayHello (HelloRequest) returns (HelloResponse){}
}
message HelloRequest {}
message HelloResponse {
string msg = 1;
}
コンパイルコマンド:
protoc --go_out=plugins=grpc:. server.hello.proto
サーバー側の例:
package main
import (
"flag"
"fmt"
"log"
"net"
user "grpc.zozoo.net/protos"
"grpc.zozoo.net/impl"
"google.golang.org/grpc"
)
func main() {
flag.Parse()
lis, err := net.Listen("tcp", fmt.Sprintf(":%d", 9000))
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
log.Println("端口监听成功:9000")
grpcServer := grpc.NewServer()
user.RegisterHelloServiceServer(grpcServer, &impl.HelloService{
})
grpcServer.Serve(lis)
}
クライアントの例:
package main
import (
"context"
"log"
"google.golang.org/grpc"
user "grpc.zozoo.net/protos"
)
func main() {
conn, err := grpc.Dial(":9000", grpc.WithInsecure())
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
// 调用RPC方法
hello := user.NewHelloServiceClient(conn)
rsp, err := hello.SayHello(context.TODO(), &user.HelloRequest{
})
if err != nil {
log.Fatalf("方法调用失败 err %v", err)
}
log.Println(rsp.Msg)
defer conn.Close()
}