Proto ファイルの探索: 解析定義とパラメータが明らかに

まえがき: 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()
}

おすすめ

転載: blog.csdn.net/weixin_43233219/article/details/133300199