Как правильно обернуть 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

Эта реализация работает, но я не уверен, что это хорошая практика. конкретно

  1. Разве плохо создавать соединение в одной функции и закрывать его в другой функции?
  2. Имеет ли смысл сохранять клиента в viper или лучше создать новый в каждой подкоманде Run функционировать?

Весь исходный код находится в этом репо

0 ответов

Другие вопросы по тегам