service graceful shutdown

This commit is contained in:
ginuerzh
2025-01-08 23:12:06 +08:00
parent eef3bd7f25
commit 489a762811
4 changed files with 33 additions and 9 deletions
+12 -5
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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()