Skip to content

Commit

Permalink
sidecar httpserver keepalive config by spec (#626)
Browse files Browse the repository at this point in the history
* sidecar httpserver keepalive config by spec

* adjust variable names
  • Loading branch information
sodaRyCN authored and localvar committed Jun 13, 2022
1 parent d882747 commit 146490d
Show file tree
Hide file tree
Showing 4 changed files with 48 additions and 18 deletions.
44 changes: 37 additions & 7 deletions pkg/object/meshcontroller/spec/spec.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,8 @@ const (

// ServiceCanaryHeaderKey is the http header key of service canary.
ServiceCanaryHeaderKey = "X-Mesh-Service-Canary"

defaultKeepAliveTimeout = "60s"
)

var (
Expand Down Expand Up @@ -131,6 +133,25 @@ type (
Log4jConfigName string `yaml:"log4jConfigName" jsonschema:"omitempty"`

MonitorMTLS *MonitorMTLS `yaml:"monitorMTLS" jsonschema:"omitempty"`
WorkerSpec *WorkerSpec `yaml:"workerSpec" jsonschema:"omitempty"`
}

// WorkerSpec is the spec of worker
WorkerSpec struct {
Ingress IngressServerSpec `yaml:"ingress" jsonschema:"omitempty"`
Egress EgressServerSpec `yaml:"egress" jsonschema:"omitempty"`
}

// IngressServerSpec is the spec of ingress httpserver in worker
IngressServerSpec struct {
KeepAlive bool `yaml:"keepAlive" jsonschema:"omitempty"`
KeepAliveTimeout string `yaml:"keepAliveTimeout" jsonschema:"omitempty,format=duration"`
}

// EgressServerSpec is the spec of egress httpserver in worker
EgressServerSpec struct {
KeepAlive bool `yaml:"keepAlive" jsonschema:"omitempty"`
KeepAliveTimeout string `yaml:"keepAliveTimeout" jsonschema:"omitempty,format=duration"`
}

// MonitorMTLS is the spec of mTLS specification of monitor.
Expand Down Expand Up @@ -889,12 +910,13 @@ func (s *Service) IngressControllerPipelineSpec(instanceSpecs []*ServiceInstance
}

// SidecarIngressHTTPServerSpec generates a spec for sidecar ingress HTTP server
func (s *Service) SidecarIngressHTTPServerSpec(cert, rootCert *Certificate) (*supervisor.Spec, error) {
func (s *Service) SidecarIngressHTTPServerSpec(keepalive bool, timeout string, cert, rootCert *Certificate) (*supervisor.Spec, error) {
ingressHTTPServerFormat := `
kind: HTTPServer
name: %s
port: %d
keepAlive: false
keepAlive: %v
keepAliveTimeout: %s
https: %s
certBase64: %s
keyBase64: %s
Expand All @@ -913,8 +935,11 @@ rules:
rootCertBaser64 = rootCert.CertBase64
needHTTPS = "true"
}
if timeout == "" {
timeout = defaultKeepAliveTimeout
}
yamlConfig := fmt.Sprintf(ingressHTTPServerFormat, name,
s.Sidecar.IngressPort, needHTTPS, certBase64, keyBase64, rootCertBaser64, pipelineName)
s.Sidecar.IngressPort, keepalive, timeout, needHTTPS, certBase64, keyBase64, rootCertBaser64, pipelineName)

superSpec, err := supervisor.NewSpec(yamlConfig)
if err != nil {
Expand Down Expand Up @@ -987,18 +1012,23 @@ func (s *Service) BackendName() string {
}

// SidecarEgressHTTPServerSpec returns a spec for egress HTTP server
func (s *Service) SidecarEgressHTTPServerSpec() (*supervisor.Spec, error) {
func (s *Service) SidecarEgressHTTPServerSpec(keepalive bool, timeout string) (*supervisor.Spec, error) {
egressHTTPServerFormat := `
kind: HTTPServer
name: %s
port: %d
keepAlive: false
keepAlive: %v
keepAliveTimeout: %s
https: false
`

if timeout == "" {
timeout = defaultKeepAliveTimeout
}
yamlConfig := fmt.Sprintf(egressHTTPServerFormat,
s.EgressHTTPServerName(),
s.Sidecar.EgressPort)
s.Sidecar.EgressPort,
keepalive,
timeout)

superSpec, err := supervisor.NewSpec(yamlConfig)
if err != nil {
Expand Down
8 changes: 4 additions & 4 deletions pkg/object/meshcontroller/spec/spec_test.tmpgo
Original file line number Diff line number Diff line change
Expand Up @@ -1042,14 +1042,14 @@ func TestSidecarIngressPipelineSpecCert(t *testing.T) {
SignTime: "2021-10-13 12:33:10",
}

superSpec, err := s.SidecarIngressHTTPServerSpec(cert, rootCert)
superSpec, err := s.SidecarIngressHTTPServerSpec(false, defaultKeepAliveTimeout, cert, rootCert)

if err != nil {
t.Fatalf("ingress http server spec failed: %v", err)
}
fmt.Println(superSpec.YAMLConfig())

superSpec, err = s.SidecarEgressHTTPServerSpec()
superSpec, err = s.SidecarEgressHTTPServerSpec(true, defaultKeepAliveTimeout)

if err != nil {
t.Fatalf("egress http server spec failed: %v", err)
Expand All @@ -1072,14 +1072,14 @@ func TestSidecarIngressPipelineSpec(t *testing.T) {
},
}

superSpec, err := s.SidecarIngressHTTPServerSpec(nil, nil)
superSpec, err := s.SidecarIngressHTTPServerSpec(true, "", nil, nil)

if err != nil {
t.Fatalf("ingress http server spec failed: %v", err)
}
fmt.Println(superSpec.YAMLConfig())

superSpec, err = s.SidecarEgressHTTPServerSpec()
superSpec, err = s.SidecarEgressHTTPServerSpec(false, "")

if err != nil {
t.Fatalf("egress http server spec failed: %v", err)
Expand Down
4 changes: 2 additions & 2 deletions pkg/object/meshcontroller/worker/egress.go
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,8 @@ func (egs *EgressServer) InitEgress(service *spec.Service) error {
}

egs.egressServerName = service.EgressHTTPServerName()
superSpec, err := service.SidecarEgressHTTPServerSpec()
admSpec := egs.superSpec.ObjectSpec().(*spec.Admin)
superSpec, err := service.SidecarEgressHTTPServerSpec(admSpec.WorkerSpec.Egress.KeepAlive, admSpec.WorkerSpec.Egress.KeepAliveTimeout)
if err != nil {
return err
}
Expand All @@ -148,7 +149,6 @@ func (egs *EgressServer) InitEgress(service *spec.Service) error {
}
}

admSpec := egs.superSpec.ObjectSpec().(*spec.Admin)
if admSpec.EnablemTLS() {
logger.Infof("egress in mtls mode, start listen ID: %s's cert", egs.instanceID)
if err := egs.inf.OnServerCert(egs.serviceName, egs.instanceID, egs.reloadByCert); err != nil {
Expand Down
10 changes: 5 additions & 5 deletions pkg/object/meshcontroller/worker/ingress.go
Original file line number Diff line number Diff line change
Expand Up @@ -132,7 +132,7 @@ func (ings *IngressServer) InitIngress(service *spec.Service, port uint32) error
logger.Infof("ingress enable TLS, init httpserver with cert: %#v", cert)
}

superSpec, err := service.SidecarIngressHTTPServerSpec(cert, rootCert)
superSpec, err := service.SidecarIngressHTTPServerSpec(admSpec.WorkerSpec.Ingress.KeepAlive, admSpec.WorkerSpec.Ingress.KeepAliveTimeout, cert, rootCert)
if err != nil {
return err
}
Expand Down Expand Up @@ -174,14 +174,14 @@ func (ings *IngressServer) reloadHTTPServer(event informer.Event, value *spec.Ce
return false
}

spec := ings.service.GetServiceSpec(ings.serviceName)
if spec == nil {
serviceSpec := ings.service.GetServiceSpec(ings.serviceName)
if serviceSpec == nil {
logger.Infof("ingress can't find its service: %s", ings.serviceName)
return false
}

admSpec := ings.superSpec.ObjectSpec().(*spec.Admin)
rootCert := ings.service.GetRootCert()
superSpec, err := spec.SidecarIngressHTTPServerSpec(value, rootCert)
superSpec, err := serviceSpec.SidecarIngressHTTPServerSpec(admSpec.WorkerSpec.Ingress.KeepAlive, admSpec.WorkerSpec.Ingress.KeepAliveTimeout, value, rootCert)
if err != nil {
logger.Errorf("BUG: update ingress pipeline spec: %s new super spec failed: %v",
superSpec.YAMLConfig(), err)
Expand Down

0 comments on commit 146490d

Please sign in to comment.