Как правильно обернуть grpc-клиент за командой кобры?
Я внедряю клиента 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
функционировать?
Весь исходный код находится в этом репо