Repository navigation
Conversation
| // создаём сертификат x.509 | ||
| certBytes, err := x509.CreateCertificate(rand.Reader, cert, cert, &privateKey.PublicKey, privateKey) | ||
| if err != nil { | ||
| log.Fatal(err) |
There was a problem hiding this comment.
К каждой подобной ошибке стоит добавить информацию о том, что именно пошло не так:
| log.Fatal(err) | |
| log.Fatalf("failed to create a certificate: %v", err) |
|
|
||
| out := make(chan os.Signal, 1) | ||
| signal.Notify(out, syscall.SIGINT, syscall.SIGTERM) | ||
| signal.Notify(out, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) |
There was a problem hiding this comment.
Для реализации graceful shutdown правильнее использовать https://pkg.go.dev/os/signal#NotifyContext: это позволяет получать сигнал о завершении программы не по каналу, а через контекст, что более идиоматично
| // Run запускает HTTP-сервер. | ||
| func (a *App) Run() error { | ||
| if a.enableTLS { | ||
| return a.server.ListenAndServeTLS("cert.pem", "key.pem") |
There was a problem hiding this comment.
Не хардкодь пути к файлам сертификата, лучше сделай их конфигурируемыми
|
|
||
| cfg := &ServerConfig{} | ||
| // Определяем, какие флаги были явно переданы | ||
| flagSet := make(map[string]bool) |
There was a problem hiding this comment.
Твое решение, в принципе, жизнеспособно. На реальных проектах для получения конфигурации из разных источников обычно используется один из следующих подходов:
- использование пакета https://github.com/spf13/viper: с его помощью можно удобно считывать конфигуарцию из флагов, переменных окружения и файла одновременно
- создание трех объектов конфигурации -- из флагов, из переменных окружения и из файла -- и их слияние при помощи например, пакета, https://github.com/darccio/mergo
Первый способ встречается чаще. Кроме того на реальных пректах зачастую кофнигурации получается только одним каким-то способом (через переменные оркужения, например), но это не касается учебного проекта.
Если будешь чувствовать в себе силы, то используй один из описанных подходов
| cfg.AddrServer = envAddr | ||
| } else { | ||
| // Загружаем JSON-конфиг, если путь задан | ||
| var jcfg *JSONFileConfig |
There was a problem hiding this comment.
Если сервис может использовать получать конфигурацию через файл, то хорошей практикой будет добавить в репозиторий config.example.json, чтобы было понятно, какие параметры можно в нем определить. Естественно, там должны быть только дефолтные значения параметров
added graceful shutdown