This is an automated email from the ASF dual-hosted git repository.
asifdxtreme pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-service-center.git
The following commit(s) were added to refs/heads/master by this push:
new e2ae9db SCB-1032 Support compress the response (#496)
e2ae9db is described below
commit e2ae9db26bb2d5ae202fca83d1ddd8616768865f
Author: little-cui <[email protected]>
AuthorDate: Wed Nov 28 17:30:41 2018 +0800
SCB-1032 Support compress the response (#496)
* SCB-1032 Support compress the response
* SCB-1032 Bug fixes
* SCB-1053 Update the LICENSE
---
glide.yaml | 3 ++
go.mod | 1 +
pkg/client/sc/config.go | 1 +
pkg/rest/client.go | 43 +++++++++++++++++++---
pkg/rest/common.go | 2 +
pkg/rest/server.go | 13 ++++++-
scripts/release/LICENSE | 1 +
.../pkg/discovery/servicecenter/aggregate.go | 4 +-
server/plugin/pkg/registry/common.go | 2 +-
server/plugin/pkg/registry/config.go | 2 +-
server/rest/server.go | 2 +-
11 files changed, 63 insertions(+), 11 deletions(-)
diff --git a/glide.yaml b/glide.yaml
index 16133dc..21b66d6 100644
--- a/glide.yaml
+++ b/glide.yaml
@@ -289,6 +289,9 @@ import:
- package: github.com/natefinch/lumberjack
version: a96e63847dc3c67d17befa69c303767e2f84e54f
repo: https://github.com/natefinch/lumberjack
+- package: github.com/NYTimes/gziphandler
+ version: 253f1acb9d9f896d86c313a3dc994c0b114f0e12
+ repo: https://github.com/NYTimes/gziphandler
# k8s 1.10.4 deps
- package: k8s.io/client-go
diff --git a/go.mod b/go.mod
index bf3d4b3..238ba93 100644
--- a/go.mod
+++ b/go.mod
@@ -16,6 +16,7 @@ replace (
)
require (
+ github.com/NYTimes/gziphandler v1.0.2-0.20180820182813-253f1acb9d9f
github.com/Shopify/sarama v1.18.0 // indirect
github.com/apache/thrift v0.0.0-20180125231006-3d556248a8b9 // indirect
github.com/astaxie/beego v1.8.0
diff --git a/pkg/client/sc/config.go b/pkg/client/sc/config.go
index 128df5c..1a8e4bb 100644
--- a/pkg/client/sc/config.go
+++ b/pkg/client/sc/config.go
@@ -43,5 +43,6 @@ func (cfg *Config) Merge() rest.URLClientOption {
if cfg.RequestTimeout == 0 {
cfg.RequestTimeout = defaultRequestTimeout
}
+ cfg.Compressed = true
return cfg.URLClientOption
}
diff --git a/pkg/rest/client.go b/pkg/rest/client.go
index 4a2d2f6..8250637 100644
--- a/pkg/rest/client.go
+++ b/pkg/rest/client.go
@@ -17,12 +17,15 @@ package rest
import (
"bytes"
+ "compress/gzip"
"crypto/tls"
"errors"
"fmt"
"github.com/apache/servicecomb-service-center/pkg/tlsutil"
"github.com/apache/servicecomb-service-center/pkg/util"
"golang.org/x/net/context"
+ "io"
+ "io/ioutil"
"net/http"
"net/url"
"os"
@@ -57,6 +60,24 @@ type URLClientOption struct {
ConnsPerHost int
}
+type gzipBodyReader struct {
+ *gzip.Reader
+ Body io.ReadCloser
+}
+
+func (w *gzipBodyReader) Close() error {
+ w.Reader.Close()
+ return w.Body.Close()
+}
+
+func NewGZipBodyReader(body io.ReadCloser) (io.ReadCloser, error) {
+ reader, err := gzip.NewReader(body)
+ if err != nil {
+ return nil, err
+ }
+ return &gzipBodyReader{reader, body}, nil
+}
+
type URLClient struct {
*http.Client
@@ -76,18 +97,18 @@ func (client *URLClient) HttpDoWithContext(ctx
context.Context, method string, r
headers = make(http.Header)
}
- if _, ok := headers["Host"]; !ok {
+ if _, ok := headers[HEADER_HOST]; !ok {
parsedURL, err := url.Parse(rawURL)
if err != nil {
return nil, err
}
- headers.Set("Host", parsedURL.Host)
+ headers.Set(HEADER_HOST, parsedURL.Host)
}
- if _, ok := headers["Accept"]; !ok {
- headers.Set("Accept", "*/*")
+ if _, ok := headers[HEADER_ACCEPT]; !ok {
+ headers.Set(HEADER_ACCEPT, ACCEPT_ANY)
}
- if _, ok := headers["Accept-Encoding"]; !ok && client.Cfg.Compressed {
- headers.Set("Accept-Encoding", "deflate, gzip")
+ if _, ok := headers[HEADER_ACCEPT_ENCODING]; !ok &&
client.Cfg.Compressed {
+ headers.Set(HEADER_ACCEPT_ENCODING, "deflate, gzip")
}
req, err := http.NewRequest(method, rawURL, bytes.NewBuffer(body))
@@ -101,6 +122,16 @@ func (client *URLClient) HttpDoWithContext(ctx
context.Context, method string, r
if err != nil {
return nil, err
}
+ switch resp.Header.Get(HEADER_CONTENT_ENCODING) {
+ case "gzip":
+ reader, err := NewGZipBodyReader(resp.Body)
+ if err != nil {
+ io.Copy(ioutil.Discard, resp.Body)
+ resp.Body.Close()
+ return nil, err
+ }
+ resp.Body = reader
+ }
if os.Getenv("DEBUG_MODE") == "1" {
fmt.Println("--- BEGIN ---")
diff --git a/pkg/rest/common.go b/pkg/rest/common.go
index 7185838..1d99ffc 100644
--- a/pkg/rest/common.go
+++ b/pkg/rest/common.go
@@ -36,12 +36,14 @@ const (
HEADER_RESPONSE_STATUS = "X-Response-Status"
HEADER_ALLOW = "Allow"
+ HEADER_HOST = "Host"
HEADER_SERVER = "Server"
HEADER_CONTENT_TYPE = "Content-Type"
HEADER_CONTENT_ENCODING = "Content-Encoding"
HEADER_ACCEPT = "Accept"
HEADER_ACCEPT_ENCODING = "Accept-Encoding"
+ ACCEPT_ANY = "*/*"
ACCEPT_JSON = "application/json"
CONTENT_TYPE_JSON = "application/json; charset=UTF-8"
diff --git a/pkg/rest/server.go b/pkg/rest/server.go
index 8f33573..37daacc 100644
--- a/pkg/rest/server.go
+++ b/pkg/rest/server.go
@@ -17,7 +17,9 @@
package rest
import (
+ "compress/gzip"
"crypto/tls"
+ "github.com/NYTimes/gziphandler"
"github.com/apache/servicecomb-service-center/pkg/grace"
"github.com/apache/servicecomb-service-center/pkg/log"
"net"
@@ -46,6 +48,8 @@ type ServerConfig struct {
GraceTimeout time.Duration
MaxHeaderBytes int
TLSConfig *tls.Config
+ Compressed bool
+ CompressMinBytes int
}
func DefaultServerConfig() *ServerConfig {
@@ -57,6 +61,8 @@ func DefaultServerConfig() *ServerConfig {
KeepAliveTimeout: 1 * time.Minute,
GraceTimeout: 3 * time.Second,
MaxHeaderBytes: 16384,
+ Compressed: true,
+ CompressMinBytes: 1400, // 1.4KB
}
}
@@ -64,7 +70,7 @@ func NewServer(srvCfg *ServerConfig) *Server {
if srvCfg == nil {
srvCfg = DefaultServerConfig()
}
- return &Server{
+ s := &Server{
Server: &http.Server{
Addr: srvCfg.Addr,
Handler: srvCfg.Handler,
@@ -80,6 +86,11 @@ func NewServer(srvCfg *ServerConfig) *Server {
state: serverStateInit,
Network: "tcp",
}
+ if srvCfg.Compressed && srvCfg.CompressMinBytes > 0 && srvCfg.Handler
!= nil {
+ wrapper, _ :=
gziphandler.NewGzipLevelAndMinSize(gzip.DefaultCompression,
srvCfg.CompressMinBytes)
+ s.Handler = wrapper(srvCfg.Handler)
+ }
+ return s
}
type Server struct {
diff --git a/scripts/release/LICENSE b/scripts/release/LICENSE
index e723ef0..abdb96a 100644
--- a/scripts/release/LICENSE
+++ b/scripts/release/LICENSE
@@ -247,6 +247,7 @@ github.com/google/gofuzz
(24818f796faf91cd76ec7bddd72458fbced7a6c1)
gopkg.in/inf.v0 (v0.9.1)
github.com/modern-go/concurrent (1.0.3)
github.com/modern-go/reflect2 (1.0.0)
+github.com/NYTimes/gziphandler (253f1acb9d9f896d86c313a3dc994c0b114f0e12)
================================================================
For beorn7/perks (4c0e84591b9aa9e6dcfdf3e020114cd81f89d5f9)
diff --git a/server/plugin/pkg/discovery/servicecenter/aggregate.go
b/server/plugin/pkg/discovery/servicecenter/aggregate.go
index bafa296..b9fd9c8 100644
--- a/server/plugin/pkg/discovery/servicecenter/aggregate.go
+++ b/server/plugin/pkg/discovery/servicecenter/aggregate.go
@@ -76,7 +76,9 @@ func (c *SCClientAggregate) GetScCache(ctx context.Context)
(*model.Cache, map[s
func (c *SCClientAggregate) cacheAppend(name string, setter model.Setter,
getter model.Getter) {
getter.ForEach(func(_ int, v *model.KV) bool {
- v.ClusterName = name
+ if len(v.ClusterName) == 0 || v.ClusterName ==
registry.DefaultClusterName {
+ v.ClusterName = name
+ }
setter.SetValue(v)
return true
})
diff --git a/server/plugin/pkg/registry/common.go
b/server/plugin/pkg/registry/common.go
index 6509c71..0c41e35 100644
--- a/server/plugin/pkg/registry/common.go
+++ b/server/plugin/pkg/registry/common.go
@@ -59,7 +59,7 @@ const (
defaultDialTimeout = 10 * time.Second
defaultRequestTimeout = 30 * time.Second
- defaultClusterName = "default"
+ DefaultClusterName = "default"
)
func WithTimeout(ctx context.Context) (context.Context, context.CancelFunc) {
diff --git a/server/plugin/pkg/registry/config.go
b/server/plugin/pkg/registry/config.go
index 60f1701..6113cce 100644
--- a/server/plugin/pkg/registry/config.go
+++ b/server/plugin/pkg/registry/config.go
@@ -84,7 +84,7 @@ func (c *Config) RegistryAddresses() []string {
func Configuration() *Config {
configOnce.Do(func() {
var err error
- defaultRegistryConfig.ClusterName =
beego.AppConfig.DefaultString("manager_name", defaultClusterName)
+ defaultRegistryConfig.ClusterName =
beego.AppConfig.DefaultString("manager_name", DefaultClusterName)
defaultRegistryConfig.ManagerAddress =
beego.AppConfig.String("manager_addr")
defaultRegistryConfig.ClusterAddresses =
beego.AppConfig.DefaultString("manager_cluster", "http://127.0.0.1:2379")
defaultRegistryConfig.InitClusters()
diff --git a/server/rest/server.go b/server/rest/server.go
index 6a4d74a..0bd5587 100644
--- a/server/rest/server.go
+++ b/server/rest/server.go
@@ -44,6 +44,7 @@ func LoadConfig() (srvCfg *rest.ServerConfig, err error) {
srvCfg.WriteTimeout = writeTimeout
srvCfg.MaxHeaderBytes = maxHeaderBytes
srvCfg.TLSConfig = tlsConfig
+ srvCfg.Handler = DefaultServerMux
return
}
@@ -54,7 +55,6 @@ func NewServer(ipAddr string) (srv *rest.Server, err error) {
}
srvCfg.Addr = ipAddr
srv = rest.NewServer(srvCfg)
- srv.Handler = DefaultServerMux
if srvCfg.TLSConfig == nil {
err = srv.Listen()