service graceful shutdown
This commit is contained in:
+12
-5
@@ -12,6 +12,7 @@ import (
|
|||||||
"crypto/x509/pkix"
|
"crypto/x509/pkix"
|
||||||
"encoding/pem"
|
"encoding/pem"
|
||||||
"math/big"
|
"math/big"
|
||||||
|
"sync/atomic"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-gost/core/logger"
|
"github.com/go-gost/core/logger"
|
||||||
@@ -20,14 +21,19 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
defaultTLSConfig *tls.Config
|
defaultTLSConfig atomic.Value
|
||||||
)
|
)
|
||||||
|
|
||||||
func DefaultTLSConfig() *tls.Config {
|
func DefaultTLSConfig() *tls.Config {
|
||||||
return defaultTLSConfig
|
v, _ := defaultTLSConfig.Load().(*tls.Config)
|
||||||
|
return v
|
||||||
}
|
}
|
||||||
|
|
||||||
func BuildDefaultTLSConfig(cfg *config.TLSConfig) {
|
func SetDefaultTLSConfig(cfg *tls.Config) {
|
||||||
|
defaultTLSConfig.Store(cfg)
|
||||||
|
}
|
||||||
|
|
||||||
|
func BuildDefaultTLSConfig(cfg *config.TLSConfig) (*tls.Config, error) {
|
||||||
log := logger.Default()
|
log := logger.Default()
|
||||||
|
|
||||||
if cfg == nil {
|
if cfg == nil {
|
||||||
@@ -43,7 +49,7 @@ func BuildDefaultTLSConfig(cfg *config.TLSConfig) {
|
|||||||
// generate random self-signed certificate.
|
// generate random self-signed certificate.
|
||||||
cert, err := genCertificate(cfg.Validity, cfg.Organization, cfg.CommonName)
|
cert, err := genCertificate(cfg.Validity, cfg.Organization, cfg.CommonName)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatal(err)
|
return nil, err
|
||||||
}
|
}
|
||||||
tlsConfig = &tls.Config{
|
tlsConfig = &tls.Config{
|
||||||
Certificates: []tls.Certificate{cert},
|
Certificates: []tls.Certificate{cert},
|
||||||
@@ -52,7 +58,8 @@ func BuildDefaultTLSConfig(cfg *config.TLSConfig) {
|
|||||||
} else {
|
} else {
|
||||||
log.Debug("load global TLS certificate files OK")
|
log.Debug("load global TLS certificate files OK")
|
||||||
}
|
}
|
||||||
defaultTLSConfig = tlsConfig
|
|
||||||
|
return tlsConfig, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func genCertificate(validity time.Duration, org string, cn string) (cert tls.Certificate, err error) {
|
func genCertificate(validity time.Duration, org string, cn string) (cert tls.Certificate, err error) {
|
||||||
|
|||||||
+6
-1
@@ -84,9 +84,14 @@ func NewLogger(opts ...Option) logger.Logger {
|
|||||||
log.SetLevel(logrus.InfoLevel)
|
log.SetLevel(logrus.InfoLevel)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &logrusLogger{
|
l := &logrusLogger{
|
||||||
logger: logrus.NewEntry(log),
|
logger: logrus.NewEntry(log),
|
||||||
}
|
}
|
||||||
|
if options.Name != "" {
|
||||||
|
l.logger = l.logger.WithField("logger", options.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
return l
|
||||||
}
|
}
|
||||||
|
|
||||||
// WithFields adds new fields to log.
|
// WithFields adds new fields to log.
|
||||||
|
|||||||
+2
-2
@@ -3,7 +3,7 @@ package recorder
|
|||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"errors"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
@@ -80,7 +80,7 @@ func (r *httpRecorder) Record(ctx context.Context, b []byte, opts ...recorder.Re
|
|||||||
defer resp.Body.Close()
|
defer resp.Body.Close()
|
||||||
|
|
||||||
if resp.StatusCode >= http.StatusBadRequest {
|
if resp.StatusCode >= http.StatusBadRequest {
|
||||||
return fmt.Errorf(resp.Status)
|
return errors.New(resp.Status)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
+13
-1
@@ -2,11 +2,13 @@ package service
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/go-gost/core/admission"
|
"github.com/go-gost/core/admission"
|
||||||
@@ -157,6 +159,9 @@ func (s *defaultService) Serve() error {
|
|||||||
defer v.Dec()
|
defer v.Dec()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var wg sync.WaitGroup
|
||||||
|
defer wg.Wait()
|
||||||
|
|
||||||
var tempDelay time.Duration
|
var tempDelay time.Duration
|
||||||
for {
|
for {
|
||||||
conn, e := s.listener.Accept()
|
conn, e := s.listener.Accept()
|
||||||
@@ -179,7 +184,10 @@ func (s *defaultService) Serve() error {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
s.setState(StateClosed)
|
s.setState(StateClosed)
|
||||||
s.options.logger.Errorf("accept: %v", e)
|
|
||||||
|
if !errors.Is(e, net.ErrClosed) {
|
||||||
|
s.options.logger.Errorf("accept: %v", e)
|
||||||
|
}
|
||||||
|
|
||||||
return e
|
return e
|
||||||
}
|
}
|
||||||
@@ -224,7 +232,11 @@ func (s *defaultService) Serve() error {
|
|||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
|
wg.Add(1)
|
||||||
|
|
||||||
go func() {
|
go func() {
|
||||||
|
defer wg.Done()
|
||||||
|
|
||||||
if v := xmetrics.GetCounter(xmetrics.MetricServiceRequestsCounter,
|
if v := xmetrics.GetCounter(xmetrics.MetricServiceRequestsCounter,
|
||||||
metrics.Labels{"service": s.name, "client": clientIP}); v != nil {
|
metrics.Labels{"service": s.name, "client": clientIP}); v != nil {
|
||||||
v.Inc()
|
v.Inc()
|
||||||
|
|||||||
Reference in New Issue
Block a user