コブラを使用して 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
この実装は機能しますが、それが良い習慣であるかどうかはわかりません。具体的には
- ある関数で接続を作成し、別の関数で閉じるのは悪いことですか?
- クライアントを保存するのは理にかなっていますか、
viper
それとも各サブコマンドのRun
関数で新しいクライアントを作成する方が良いですか?
すべてのソースコードはこのリポジトリにあります