|
@@ -5,8 +5,11 @@ import (
|
|
|
"context"
|
|
|
"encoding/json"
|
|
|
"errors"
|
|
|
+ "fmt"
|
|
|
"git.nspix.com/golang/micro/helper/httpclient"
|
|
|
+ "git.nspix.com/golang/micro/helper/utils"
|
|
|
"io"
|
|
|
+ "io/ioutil"
|
|
|
"net/http"
|
|
|
"time"
|
|
|
)
|
|
@@ -18,6 +21,7 @@ const (
|
|
|
type (
|
|
|
Discovery struct {
|
|
|
baseUrl string
|
|
|
+ Timeout time.Duration
|
|
|
}
|
|
|
|
|
|
discoveryResponse struct {
|
|
@@ -57,41 +61,75 @@ func (r *Discovery) sendRequest(ctx context.Context, method, path string, body i
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func (r *Discovery) Register(instance *ServiceNode) (err error) {
|
|
|
+func (r *Discovery) Register(ctx context.Context, instance *ServiceNode) (err error) {
|
|
|
var (
|
|
|
buf []byte
|
|
|
)
|
|
|
if buf, err = json.Marshal(instance); err != nil {
|
|
|
return
|
|
|
}
|
|
|
- ctx, _ := context.WithTimeout(context.Background(), time.Second*2)
|
|
|
- return r.sendRequest(ctx, "POST", "/register", bytes.NewReader(buf), nil)
|
|
|
+ if ctx == nil{
|
|
|
+ ctx = context.Background()
|
|
|
+ }
|
|
|
+ cc, cancelFunc := context.WithTimeout(ctx, r.Timeout)
|
|
|
+ defer func() {
|
|
|
+ cancelFunc()
|
|
|
+ }()
|
|
|
+ return r.sendRequest(cc, "POST", "/register", bytes.NewReader(buf), nil)
|
|
|
}
|
|
|
|
|
|
-func (r *Discovery) Deregister(instance *ServiceNode) (err error) {
|
|
|
- ctx, _ := context.WithTimeout(context.Background(), time.Second*2)
|
|
|
- return r.sendRequest(ctx, "DELETE", "/deregister/"+instance.ID, nil, nil)
|
|
|
+func (r *Discovery) Deregister(ctx context.Context, instance *ServiceNode) (err error) {
|
|
|
+ cc, cancelFunc := context.WithTimeout(ctx, r.Timeout)
|
|
|
+ if ctx == nil{
|
|
|
+ ctx = context.Background()
|
|
|
+ }
|
|
|
+ defer func() {
|
|
|
+ cancelFunc()
|
|
|
+ }()
|
|
|
+ return r.sendRequest(cc, "DELETE", "/deregister/"+instance.ID, nil, nil)
|
|
|
}
|
|
|
|
|
|
-func (r *Discovery) Get(name string) (instances []*ServiceNode, err error) {
|
|
|
+func (r *Discovery) Get(ctx context.Context, name string) (instances []*ServiceNode, err error) {
|
|
|
instances = make([]*ServiceNode, 0)
|
|
|
- ctx, _ := context.WithTimeout(context.Background(), time.Second*2)
|
|
|
- err = r.sendRequest(ctx, "GET", "/service?name="+name, nil, &instances)
|
|
|
+ if ctx == nil{
|
|
|
+ ctx = context.Background()
|
|
|
+ }
|
|
|
+ cc, cancelFunc := context.WithTimeout(ctx, r.Timeout)
|
|
|
+ defer func() {
|
|
|
+ cancelFunc()
|
|
|
+ }()
|
|
|
+ err = r.sendRequest(cc, "GET", "/service?name="+name, nil, &instances)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func (r *Discovery) Fetch() (instances []*ServiceNode, err error) {
|
|
|
+func (r *Discovery) Fetch(ctx context.Context) (instances []*ServiceNode, err error) {
|
|
|
instances = make([]*ServiceNode, 0)
|
|
|
- ctx, _ := context.WithTimeout(context.Background(), time.Second*2)
|
|
|
- err = r.sendRequest(ctx, "GET", "/services", nil, &instances)
|
|
|
+ if ctx == nil{
|
|
|
+ ctx = context.Background()
|
|
|
+ }
|
|
|
+ cc, cancelFunc := context.WithTimeout(ctx, r.Timeout)
|
|
|
+ defer func() {
|
|
|
+ cancelFunc()
|
|
|
+ }()
|
|
|
+ err = r.sendRequest(cc, "GET", "/services", nil, &instances)
|
|
|
return
|
|
|
}
|
|
|
|
|
|
func NewDiscovery(uri string) *Discovery {
|
|
|
+ if uri == "" {
|
|
|
+ //兼容k8s的情况
|
|
|
+ namespaceFile := "/var/run/secrets/kubernetes.io/serviceaccount/namespace"
|
|
|
+ if utils.FileExists(namespaceFile) {
|
|
|
+ if buf, err := ioutil.ReadFile(namespaceFile); err == nil {
|
|
|
+ uri = fmt.Sprintf("http://discovery.%s.svc.cluster.local", string(buf))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
if uri == "" {
|
|
|
uri = DefaultDiscoveryUrl
|
|
|
}
|
|
|
return &Discovery{
|
|
|
baseUrl: uri,
|
|
|
+ Timeout: time.Second * 10,
|
|
|
}
|
|
|
}
|