msrc

Форк
0
/
HttpServiceUnix.go 
101 строка · 3.7 Кб
1
package msrc
2

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

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

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

21
	addr string
22
}
23

24
// HttpServiceUnix реализует фабрику сервиса для библиотеки, реализующего
25
// функционал HTTP сервера, через unix socket. На вход передаются обязательные аргументы
26
// для HTTP сервера, а так же возможна передача конфигурации запуска
27
// сервера.
28
//
29
// Если конфигурация запуска не передана, то будет использоваться конфигурация
30
// `http.Server{}`, при этом в обоих случаях (передано/не передано) будет
31
// происходить переопределение полей Addr и Handler в соответствии с
32
// переданными обязательными аргументами функции.
33
func HttpServiceUnix(
34
	addr 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
		&httpServiceUnix{
49
			router: Router,
50
			server: ServerConfig[0],
51
			logger: logrus.WithField("prefix", "msrc/HttpServiceUnix"),
52
			addr:   addr,
53
		},
54
		GraceStopPeriodSeconds,
55
	)
56
}
57

58
// Run выполняет запуск упрощенной версии сервиса.
59
// На вход передается контекст, который передаст `<-ctx.Done()` в случае
60
// его остановки. Сам сервис должен обрабатывать его, если он не реализует
61
// своего собственного, отдельного алгоритма остановки.
62
func (h *httpServiceUnix) Run(ctx context.Context) (err error) {
63
	defer func() { err = errors.Wrap(err, "[httpServiceUnix:Run]") }()
64

65
	h.server.Addr = h.addr
66
	h.server.Handler = h.router
67

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

70
	ln, err := net.Listen("unix", h.addr)
71
	if err != nil {
72
		return errors.Wrap(err, "failed starting HTTP Server")
73
	}
74

75
	err = h.server.Serve(ln)
76
	if hh.IsCtxDone(ctx) {
77
		return nil
78
	}
79

80
	if err != nil {
81
		return err
82
	}
83

84
	return nil
85
}
86

87
// GracefulShutdown выполняет правильную остановку упрощенного
88
// сервиса. В данном случае, если сервис необходимо останавливать
89
// вызовом отдельного функционала остановки, этот метод предоставляет
90
// такую возможность.
91
//
92
// Метод вызывается в процессе остановки сервера и принимает на вход
93
// контекст с deadline, устанавливаемым сверху. За установленное время
94
// сервис либо завершает работу, либо отключается принудительно.
95
func (h *httpServiceUnix) GracefulShutdown(ctx context.Context) (err error) {
96
	defer func() { err = errors.Wrap(err, "[httpServiceUnix:GracefulShutdown]") }()
97
	return errors.Wrap(
98
		h.server.Shutdown(ctx),
99
		os.Remove(h.addr).Error(),
100
	)
101
}
102

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

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

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

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