msrc

Форк
0
/
HttpService.go 
97 строк · 3.6 Кб
1
package msrc
2

3
import (
4
	"context"
5
	"fmt"
6
	"net/http"
7

8
	"github.com/pkg/errors"
9
	"github.com/sirupsen/logrus"
10
	hh "gitlab.systems-fd.com/packages/golang/helpers/h"
11
)
12

13
// httpService реализует базовый функционал HTTP сервера для приложений
14
// в виде сервиса для библиотеки.
15
type httpService struct {
16
	router http.Handler
17
	server *http.Server
18
	logger *logrus.Entry
19

20
	httpHost string
21
	httpPort string
22
}
23

24
// HttpService реализует фабрику сервиса для библиотеки, реализующего
25
// функционал HTTP сервера. На вход передаются обязательные аргументы
26
// для HTTP сервера, а так же возможна передача конфигурации запуска
27
// сервера.
28
//
29
// Если конфигурация запуска не передана, то будет использоваться конфигурация
30
// `http.Server{}`, при этом в обоих случаях (передано/не передано) будет
31
// происходить переопределение полей Addr и Handler в соответствии с
32
// переданными обязательными аргументами функции.
33
func HttpService(
34
	HttpHost, HttpPort string,
35
	Router http.Handler,
36
	GraceStopPeriodSeconds uint8,
37
	ServerConfig ...*http.Server,
38
) ServiceInterface {
39
	if 0 == len(ServerConfig) {
40
		ServerConfig = append(ServerConfig, &http.Server{})
41
	}
42

43
	if ServerConfig[0] == nil {
44
		ServerConfig[0] = &http.Server{}
45
	}
46

47
	return NewSimpleService(
48
		&httpService{
49
			router:   Router,
50
			server:   ServerConfig[0],
51
			logger:   logrus.WithField("prefix", "msrc/HttpService"),
52
			httpHost: HttpHost,
53
			httpPort: HttpPort,
54
		},
55
		GraceStopPeriodSeconds,
56
	)
57
}
58

59
// Run выполняет запуск упрощенной версии сервиса.
60
// На вход передается контекст, который передаст `<-ctx.Done()` в случае
61
// его остановки. Сам сервис должен обрабатывать его, если он не реализует
62
// своего собственного, отдельного алгоритма остановки.
63
func (h *httpService) Run(ctx context.Context) error {
64
	h.server.Addr = fmt.Sprintf(`%v:%v`, h.httpHost, h.httpPort)
65
	h.server.Handler = h.router
66

67
	h.logger.WithField("type", "tcp").WithField("host", h.server.Addr).Info("Starting HTTP Server")
68

69
	err := h.server.ListenAndServe()
70
	if hh.IsCtxDone(ctx) {
71
		return nil
72
	}
73

74
	if nil != err {
75
		h.logger.
76
			WithError(err).
77
			WithField("code", 500).
78
			WithField("host", h.server.Addr).
79
			Error(`Failed to serve HTTP requests`)
80

81
		return errors.Wrap(err, `[httpService]`)
82
	}
83

84
	return nil
85
}
86

87
// GracefulShutdown выполняет правильную остановку упрощенного
88
// сервиса. В данном случае, если сервис необходимо останавливать
89
// вызовом отдельного функционала остановки, этот метод предоставляет
90
// такую возможность.
91
//
92
// Метод вызывается в процессе остановки сервера и принимает на вход
93
// контекст с deadline, устанавливаемым сверху. За установленное время
94
// сервис либо завершает работу, либо отключается принудительно.
95
func (h *httpService) GracefulShutdown(ctx context.Context) error {
96
	return h.server.Shutdown(ctx)
97
}
98

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.