1

コブラを使用して GRPC クライアントを実装しています。サブコマンドの背後には、さまざまなサービス コールがあります。

viperコードの重複を避けるために、シングルトンには単一の接続と単一のクライアントを保持します。しかし、それが適切な方法であるかどうかはわかりません。

今、 でcmd/root.go::initConfig()、接続とクライアントを作成して保存します。

conn, err := grpc.Dial(address, grpc.WithInsecure())
if err != nil {
    log.Fatalf("did not connect: %v", err)
}
c := pb.NewCommandClient(conn)

viper.SetDefault("Client", c)
viper.SetDefault("Connection", conn)

接続は で閉じられ、同じファイルrootCmd.PersistentPostRun()で定義されています。root.go

PersistentPostRun: func(cmd *cobra.Command, args []string) {
    conn := viper.Get("Connection").(*grpc.ClientConn)
    conn.Close()
},

viperクライアントは、サブコマンドのファイルから取得され、使用されRunます。たとえば、

c := viper.Get("Client").(pb.CommandClient)
c.DoSomething() // call the service functions on c

この実装は機能しますが、それが良い習慣であるかどうかはわかりません。具体的には

  1. ある関数で接続を作成し、別の関数で閉じるのは悪いことですか?
  2. クライアントを保存するのは理にかなっていますか、viperそれとも各サブコマンドのRun関数で新しいクライアントを作成する方が良いですか?

すべてのソースコードはこのリポジトリにあります

4

0 に答える 0