Skip to content

Commit

Permalink
Update APIs version from v3 to v4. (#134)
Browse files Browse the repository at this point in the history
* Changes: Update APIs version from v3 to v4.

* Changes: Update APIs version from v3 to v4.

* Changes: Update APIs version from v3 to v4.

* Add idle timeout in http server.

* Bug fixes: Block in shutting down server gracefully.
  • Loading branch information
little-cui authored and asifdxtreme committed Oct 23, 2017
1 parent 5becdea commit 278cb0f
Show file tree
Hide file tree
Showing 33 changed files with 370 additions and 171 deletions.
5 changes: 2 additions & 3 deletions etc/conf/app.conf
@@ -1,12 +1,10 @@
ComponentName = service_center
version = v3
tenant_mode = dedicated
#run mode could be many options to specify the env like prod,dev
runmode = dev
#indicate how many revision you want to keep in etcd
compact_index_delta=100

cipher_plugin =
cipher_plugin = ""

# listen address
httpaddr = 127.0.0.1
Expand Down Expand Up @@ -34,6 +32,7 @@ auto_sync_interval = 30

read_header_timeout = 60s
read_timeout = 60s
idle_timeout = 60s
write_timeout = 60s
max_header_bytes = 32768 # 32K
max_body_bytes = 2097152 # 2M
Expand Down
2 changes: 1 addition & 1 deletion examples/service_center/body/get_instance_response.json
@@ -1,4 +1,4 @@
GET /registry/v3/microservices/349524856cf811e7b7bc286ed488ff40/instances/838942c26cf911e7b7bc286ed488ff40 HTTP/1.1
GET /v4/default/registry/microservices/349524856cf811e7b7bc286ed488ff40/instances/838942c26cf911e7b7bc286ed488ff40 HTTP/1.1
Host: 127.0.0.1:30100
X-tenant-name: default
Content-Type: application/json
Expand Down
2 changes: 1 addition & 1 deletion examples/service_center/request/add_dependecy.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
PUT /registry/v3/dependencies HTTP/1.1
PUT /v4/default/registry/dependencies HTTP/1.1
Host: localhost:30100
Content-Type: application/json
x-domain-name: default
Expand Down
2 changes: 1 addition & 1 deletion examples/service_center/request/create_service.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
POST /registry/v3/microservices HTTP/1.1
POST /v4/default/registry/microservices HTTP/1.1
Host: localhost:30100
Content-Type: application/json
x-domain-name: default
Expand Down
2 changes: 1 addition & 1 deletion examples/service_center/request/delete_instance.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
DELETE /registry/v3/microservices/serviceID/instances/instanceID HTTP/1.1
DELETE /v4/default/registry/microservices/serviceID/instances/instanceID HTTP/1.1
Host: localhost:30100
x-domain-name: default
Cache-Control: no-cache
Expand Down
2 changes: 1 addition & 1 deletion examples/service_center/request/delete_service.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
DELETE /registry/v3/microservices/63cc69716a8f11e79855286ed488ca3e?force=1 HTTP/1.1
DELETE /v4/default/registry/microservices/63cc69716a8f11e79855286ed488ca3e?force=1 HTTP/1.1
Host: localhost:30100
Content-Type: application/json
x-domain-name: default
Expand Down
2 changes: 1 addition & 1 deletion examples/service_center/request/get_consumers.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
GET /registry/v3/microservices/3/consumers HTTP/1.1
GET /v4/default/registry/microservices/3/consumers HTTP/1.1
Host: localhost:30100
x-domain-name: default
Cache-Control: no-cache
Expand Down
2 changes: 1 addition & 1 deletion examples/service_center/request/get_providers.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
GET /registry/v3/microservices/2/providers HTTP/1.1
GET /v4/default/registry/microservices/2/providers HTTP/1.1
Host: localhost:30100
X-Tenant-Name: default
X-Project-Name: default
Expand Down
2 changes: 1 addition & 1 deletion examples/service_center/request/get_service.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
GET /registry/v3/microservices HTTP/1.1
GET /v4/default/registry/microservices HTTP/1.1
Host: localhost:30100
Content-Type: application/json
x-domain-name: default
Expand Down
2 changes: 1 addition & 1 deletion examples/service_center/request/heartbeat.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
PUT /registry/v3/microservices/2/instances/36/heartbeat HTTP/1.1
PUT /v4/default/registry/microservices/2/instances/36/heartbeat HTTP/1.1
Host: localhost:30100
Content-Type: application/json
x-domain-name: default
Expand Down
2 changes: 1 addition & 1 deletion examples/service_center/request/register_intance_json.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
POST /registry/v3/microservices/2/instances HTTP/1.1
POST /v4/default/registry/microservices/2/instances HTTP/1.1
Host: localhost:30100
Content-Type: application/json
x-domain-name: default
Expand Down
2 changes: 1 addition & 1 deletion examples/service_center/request/update_properties.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
PUT /registry/v3/microservices/2/properties HTTP/1.1
PUT /v4/default/registry/microservices/2/properties HTTP/1.1
Host: localhost:30100
Content-Type: application/json
x-domain-name: default
Expand Down
2 changes: 1 addition & 1 deletion examples/service_center/request/update_status.sh
@@ -1,5 +1,5 @@
#!/usr/bin/env bash
PUT /registry/v3/microservices/serviceID/instances/instanceID/status?value=UP HTTP/1.1
PUT /v4/default/registry/microservices/serviceID/instances/instanceID/status?value=UP HTTP/1.1
Host: localhost:30100
Content-Type: application/json
x-domain-name: default
Expand Down
72 changes: 36 additions & 36 deletions integration/apis.go
Expand Up @@ -14,52 +14,52 @@
package integrationtest

// Basic API
var HEALTH = "/health"
var VERSION = "/version"
var HEALTH = "/v4/default/registry/health"
var VERSION = "/v4/default/registry/version"

// Micro-Service API's
var CHECKEXISTENCE = "/registry/v3/existence"
var GETALLSERVICE = "/registry/v3/microservices"
var GETSERVICEBYID = "/registry/v3/microservices/:serviceId"
var REGISTERMICROSERVICE = "/registry/v3/microservices"
var UPDATEMICROSERVICE = "/registry/v3/microservices/:serviceId/properties"
var UNREGISTERMICROSERVICE = "/registry/v3/microservices/:serviceId?force=1"
var GETSCHEMABYID = "/registry/v3/microservices/:serviceId/schemas/:schemaId"
var UPDATESCHEMA = "/registry/v3/microservices/:serviceId/schemas/:schemaId"
var UPDATESCHEMAS = "/registry/v3/microservices/:serviceId/schemas"
var DELETESCHEMA = "/registry/v3/microservices/:serviceId/schemas/:schemaId"
var CREATEDEPENDENCIES = "/registry/v3/dependencies"
var GETCONPRODEPENDENCY = "/registry/v3/microservices/:consumerId/providers"
var GETPROCONDEPENDENCY = "/registry/v3/microservices/:providerId/consumers"
var CHECKEXISTENCE = "/v4/default/registry/existence"
var GETALLSERVICE = "/v4/default/registry/microservices"
var GETSERVICEBYID = "/v4/default/registry/microservices/:serviceId"
var REGISTERMICROSERVICE = "/v4/default/registry/microservices"
var UPDATEMICROSERVICE = "/v4/default/registry/microservices/:serviceId/properties"
var UNREGISTERMICROSERVICE = "/v4/default/registry/microservices/:serviceId?force=1"
var GETSCHEMABYID = "/v4/default/registry/microservices/:serviceId/schemas/:schemaId"
var UPDATESCHEMA = "/v4/default/registry/microservices/:serviceId/schemas/:schemaId"
var UPDATESCHEMAS = "/v4/default/registry/microservices/:serviceId/schemas"
var DELETESCHEMA = "/v4/default/registry/microservices/:serviceId/schemas/:schemaId"
var CREATEDEPENDENCIES = "/v4/default/registry/dependencies"
var GETCONPRODEPENDENCY = "/v4/default/registry/microservices/:consumerId/providers"
var GETPROCONDEPENDENCY = "/v4/default/registry/microservices/:providerId/consumers"

// Instance API's
var FINDINSTANCE = "/registry/v3/instances"
var GETINSTANCE = "/registry/v3/microservices/:serviceId/instances"
var GETINSTANCEBYINSTANCEID = "/registry/v3/microservices/:serviceId/instances/:instanceId"
var REGISTERINSTANCE = "/registry/v3/microservices/:serviceId/instances"
var UNREGISTERINSTANCE = "/registry/v3/microservices/:serviceId/instances/:instanceId"
var UPDATEINSTANCEMETADATA = "/registry/v3/microservices/:serviceId/instances/:instanceId/properties"
var UPDATEINSTANCESTATUS = "/registry/v3/microservices/:serviceId/instances/:instanceId/status"
var INSTANCEHEARTBEAT = "/registry/v3/microservices/:serviceId/instances/:instanceId/heartbeat"
var INSTANCEWATCHER = "/registry/v3/microservices/:serviceId/watcher"
var INSTANCELISTWATCHER = "/registry/v3/microservices/:serviceId/listwatcher"
var FINDINSTANCE = "/v4/default/registry/instances"
var GETINSTANCE = "/v4/default/registry/microservices/:serviceId/instances"
var GETINSTANCEBYINSTANCEID = "/v4/default/registry/microservices/:serviceId/instances/:instanceId"
var REGISTERINSTANCE = "/v4/default/registry/microservices/:serviceId/instances"
var UNREGISTERINSTANCE = "/v4/default/registry/microservices/:serviceId/instances/:instanceId"
var UPDATEINSTANCEMETADATA = "/v4/default/registry/microservices/:serviceId/instances/:instanceId/properties"
var UPDATEINSTANCESTATUS = "/v4/default/registry/microservices/:serviceId/instances/:instanceId/status"
var INSTANCEHEARTBEAT = "/v4/default/registry/microservices/:serviceId/instances/:instanceId/heartbeat"
var INSTANCEWATCHER = "/v4/default/registry/microservices/:serviceId/watcher"
var INSTANCELISTWATCHER = "/v4/default/registry/microservices/:serviceId/listwatcher"

//Governance API's
var GETGOVERNANCESERVICEDETAILS = "/registry/v3/govern/service/:serviceId"
var GETRELATIONGRAPH = "/registry/v3/govern/relation"
var GETALLSERVICEGOVERNANCEINFO = "/registry/v3/govern/services"
var GETGOVERNANCESERVICEDETAILS = "/v4/default/govern/microservices/:serviceId"
var GETRELATIONGRAPH = "/v4/default/govern/relations"
var GETALLSERVICEGOVERNANCEINFO = "/v4/default/govern/microservices"

//Rules API's
var ADDRULE = "/registry/v3/microservices/:serviceId/rules"
var GETRULES = "/registry/v3/microservices/:serviceId/rules"
var UPDATERULES = "/registry/v3/microservices/:serviceId/rules/:rule_id"
var DELETERULES = "/registry/v3/microservices/:serviceId/rules/:rule_id"
var ADDRULE = "/v4/default/registry/microservices/:serviceId/rules"
var GETRULES = "/v4/default/registry/microservices/:serviceId/rules"
var UPDATERULES = "/v4/default/registry/microservices/:serviceId/rules/:rule_id"
var DELETERULES = "/v4/default/registry/microservices/:serviceId/rules/:rule_id"

//Tag API's
var ADDTAGE = "/registry/v3/microservices/:serviceId/tags"
var UPDATETAG = "/registry/v3/microservices/:serviceId/tags/:key"
var GETTAGS = "/registry/v3/microservices/:serviceId/tags"
var DELETETAG = "/registry/v3/microservices/:serviceId/tags/:key"
var ADDTAGE = "/v4/default/registry/microservices/:serviceId/tags"
var UPDATETAG = "/v4/default/registry/microservices/:serviceId/tags/:key"
var GETTAGS = "/v4/default/registry/microservices/:serviceId/tags"
var DELETETAG = "/v4/default/registry/microservices/:serviceId/tags/:key"

// HTTP METHODS
var GET = "GET"
Expand Down
2 changes: 1 addition & 1 deletion integration/health_test.go
Expand Up @@ -47,7 +47,7 @@ var _ = Describe("Basic Api Test", func() {
defer resp.Body.Close()
Expect(resp.StatusCode).To(Equal(http.StatusOK))
respbody, _ := ioutil.ReadAll(resp.Body)
Expect(gojson.Json(string(respbody)).Get("apiVersion").Tostring()).To(Equal("3.0.0"))
Expect(gojson.Json(string(respbody)).Get("apiVersion").Tostring()).To(Equal("4.0.0"))
})
})
})
Expand Down
4 changes: 4 additions & 0 deletions pkg/rest/roa.go
Expand Up @@ -72,3 +72,7 @@ func RegisterServent(servant interface{}) {
util.Logger().Errorf(nil, "<rest.RegisterServent> result of 'URLPatterns' function not []*Route type in servant struct `%s`", name)
}
}

func RegisterFilter(f Filter) {
serverHandler.filters = append(serverHandler.filters, f)
}
35 changes: 31 additions & 4 deletions pkg/rest/route.go
Expand Up @@ -47,11 +47,14 @@ type Route struct {
// 2. redirect not supported
type ROAServerHandler struct {
handlers map[string][]*urlPatternHandler
filters []Filter
}

func NewROAServerHander() *ROAServerHandler {
return &ROAServerHandler{
handlers: make(map[string][]*urlPatternHandler)}
handlers: make(map[string][]*urlPatternHandler),
filters: make([]Filter, 0, 5),
}
}

func (this *ROAServerHandler) addRoute(route *Route) (err error) {
Expand All @@ -69,26 +72,36 @@ func (this *ROAServerHandler) addRoute(route *Route) (err error) {
}

func (this *ROAServerHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
var err error
for _, ph := range this.handlers[r.Method] {
if params, ok := ph.try(r.URL.Path); ok {
if len(params) > 0 {
r.URL.RawQuery = url.Values(params).Encode() + "&" + r.URL.RawQuery
}

if err = this.doFilter(r); err != nil {
break
}

ph.ServeHTTP(w, r)
return
}
}

if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}

allowed := make([]string, 0, len(this.handlers))
for meth, handlers := range this.handlers {
if meth == r.Method {
for method, handlers := range this.handlers {
if method == r.Method {
continue
}

for _, ph := range handlers {
if _, ok := ph.try(r.URL.Path); ok {
allowed = append(allowed, meth)
allowed = append(allowed, method)
}
}
}
Expand All @@ -102,6 +115,15 @@ func (this *ROAServerHandler) ServeHTTP(w http.ResponseWriter, r *http.Request)
http.Error(w, "Method Not Allowed", 405)
}

func (this *ROAServerHandler) doFilter(r *http.Request) error {
for _, f := range this.filters {
if f.IsMatch(r) {
return f.Do(r)
}
}
return nil
}

func (this *urlPatternHandler) try(path string) (p map[string][]string, _ bool) {
var i, j int
for i < len(path) {
Expand Down Expand Up @@ -162,3 +184,8 @@ func isDigit(ch byte) bool {
func isAlnum(ch byte) bool {
return isAlpha(ch) || isDigit(ch)
}

type Filter interface {
IsMatch(r *http.Request) bool
Do(r *http.Request) error
}
7 changes: 6 additions & 1 deletion pkg/rest/server.go
Expand Up @@ -37,6 +37,7 @@ type ServerConfig struct {
Handler http.Handler
ReadTimeout time.Duration
ReadHeaderTimeout time.Duration
IdleTimeout time.Duration
WriteTimeout time.Duration
KeepAliveTimeout time.Duration
GraceTimeout time.Duration
Expand All @@ -48,8 +49,9 @@ func DefaultServerConfig() *ServerConfig {
return &ServerConfig{
ReadTimeout: 60 * time.Second,
ReadHeaderTimeout: 60 * time.Second,
IdleTimeout: 60 * time.Second,
WriteTimeout: 60 * time.Second,
KeepAliveTimeout: 3 * time.Minute,
KeepAliveTimeout: 1 * time.Minute,
GraceTimeout: 3 * time.Second,
MaxHeaderBytes: 16384,
}
Expand All @@ -66,6 +68,7 @@ func NewServer(srvCfg *ServerConfig) *Server {
TLSConfig: srvCfg.TLSConfig,
ReadTimeout: srvCfg.ReadTimeout,
ReadHeaderTimeout: srvCfg.ReadHeaderTimeout,
IdleTimeout: srvCfg.IdleTimeout,
WriteTimeout: srvCfg.WriteTimeout,
MaxHeaderBytes: srvCfg.MaxHeaderBytes,
},
Expand Down Expand Up @@ -243,7 +246,9 @@ func (srv *Server) gracefulStop(d time.Duration) {

if srv.CloseOne() {
n++
continue
}
break
}

if n != 0 {
Expand Down
2 changes: 0 additions & 2 deletions server/bootstrap/bootstrap.go
Expand Up @@ -25,7 +25,6 @@ import (
"github.com/ServiceComb/service-center/server/interceptor"
"github.com/ServiceComb/service-center/server/interceptor/access"
"github.com/ServiceComb/service-center/server/interceptor/cors"
"github.com/ServiceComb/service-center/server/interceptor/domain"
"github.com/ServiceComb/service-center/server/interceptor/maxbody"
"github.com/ServiceComb/service-center/server/interceptor/ratelimiter"
)
Expand All @@ -36,7 +35,6 @@ func init() {
interceptor.InterceptFunc(interceptor.ACCESS_PHASE, ratelimiter.Intercept)
interceptor.InterceptFunc(interceptor.ACCESS_PHASE, access.Intercept)
interceptor.InterceptFunc(interceptor.ACCESS_PHASE, cors.Intercept)
interceptor.InterceptFunc(interceptor.ACCESS_PHASE, domain.Intercept)

interceptor.InterceptFunc(interceptor.CONTENT_PHASE, maxbody.Intercept)

Expand Down

0 comments on commit 278cb0f

Please sign in to comment.