0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ttrpc tutorial - 1 -

Last updated at Posted at 2024-05-04

ttrpc

問題

無駄なリソースをさらに削減できる点では活用したいですが、公式のマニュアルなどが揃ってない、個人的にはわかりにくいサンプルコードから少しハードルを感じているかと思いました。実際やってみたところ想定以上時間がかかったため、手順など残しておきたいと考えてます。

ゴール

ttrpcのサンプルコードを変形してわかりやすく+すぐ動くようにチュートリアルを作りました。
動作確認と使っているライブラリなど確認できればと思います。

開発環境・ライブラリ

go 1.21.0
github.com/containerd/ttrpc v1.2.3

ttrpcのprotoファイル生成(プラグイン)

protoc-gen-goprotoc-gen-go-grpcはインストール前提とします。
下記のコマンドからrrtpc生成のためのプラグインをインストールします。

go install github.com/containerd/ttrpc/cmd/protoc-gen-go-ttrpc@v1.2.3
go install github.com/containerd/ttrpc/cmd/protoc-gen-gogottrpc@v1.2.3

指定しているv1.2.3は最新バージョンとなります。

サーバーサンプル

ファイル構成

-server
| go.mod
| go.sum
| main.go
+ interfaces
|  example.proto
|  example.pd.go
|  exmaple_ttrpc.pd.go

main.go(一部抜粋)

main.go

func server() error {
	s, err := ttrpc.NewServer(
		ttrpc.WithServerHandshaker(nil),
		ttrpc.WithUnaryServerInterceptor(serverIntercept),
	)
	if err != nil {
		return err
	}
	defer s.Close()
	example.RegisterExampleService(s, &exampleServer{})

	l, err := net.Listen("unix", socket)
	if err != nil {
		return err
	}
        defer func() {
		l.Close()
		os.Remove(socket)
	}()

	return s.Serve(context.Background(), l)
}

基本的な使い方はgRPCと違いないですが、サーバを開始する際に提供ライブラリを使います。
主にhttpサーバーのために記載かと思いますが、今回に関してはローカル環境のことで特別なファイルを扱います。
unixタイプのファイルですが、詳しい説明は割愛あします。Posix関連書籍かマニュアルから確認可能です。
また、ネットワークポートの指定ではないため、ファイルパースを渡すことになります。
そのため、os.Removeから使い終わったファイルを削除いてます。

クライアントサンプル

ファイル構成

-server
| go.mod
| go.sum
| main.go
+ interfaces
|  example.proto
|  example.pd.go
|  exmaple_ttrpc.pd.go

main.go(一部抜粋)

main.go

func client() error {
	conn, err := net.Dial("unix", socket)
	if err != nil {
		return err
	}
	defer conn.Close()

	tc := ttrpc.NewClient(conn, ttrpc.WithUnaryClientInterceptor(clientIntercept))
	client := example.NewExampleClient(tc)

	r := &example.Method1Request{
		Foo: "Foo",
		Bar: "Bar",
	}

	ctx := context.Background()
	md := ttrpc.MD{}
	md.Set("name", "koye")
	ctx = ttrpc.WithMetadata(ctx, md)

	resp, err := client.Method1(ctx, r)
	if err != nil {
		log.Println("error")
		return err
	}
	return json.NewEncoder(os.Stdout).Encode(resp)
}

クライアントもサーバー同様、gRPCと変わらないですが、接続部が異なります。
サーバー側で指定しているインタフェースとファイルパスを入れることで接続ができます。

動作確認

サーバー、クライアントから下記の結果が確認できました。


@iMac server % go run main.go 
2024/05/04 21:05:28 server start
2024/05/04 21:05:34 server interceptor
map[name:[koye]]
{"name":["koye"]}
method1 call

クライアントから受け取ったパラメータを出力してます。



@iMac client % go run main.go 
2024/05/04 21:05:34 client start
2024/05/04 21:05:34 client interceptor
map[name:[koye]]
{"name":["koye"]}
{"foo":"Foo","bar":"Bar"}

サーバー側にパラメータを送り、そのレスポンスを出力してます。

注意

ネットワーク通しのrpcではなく、主にローカルrpcを目的として使われるライブラリとなります。
もし、ネットワーク環境、セキュリティー要件などがある場合には通常のgRPCが適合しているかと思います。
protoインタフェースの全てではないと記載があったかと(確かではない)ので、一部、使えないインタフェースがあるかもです。

終わり

k8sランタイムの役割を行うcontainerdのプロジェクトから作成されたライブラリとなります。
クラウド環境の運用業務を経験した方には見覚えのあるキーワードになるかと。
次は実際にどのぐらいコンピューター資源を軽減できるかも確認してみたいと考えてます。
今回使ったソースは下記のリポジトリとなります。ご参考にできればと思います。
あと、接続については一応、ローカル向けのrpcですが、ネットワーク通しでも使えます。
イントラー環境ならセキュリティー要件をクリアした前提ならアリかなと思います。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?