diff --git a/cluster/directory.go b/cluster/directory.go new file mode 100644 index 0000000000000000000000000000000000000000..d8e3be40d5948af5474da4736d062af6d73c2c5a --- /dev/null +++ b/cluster/directory.go @@ -0,0 +1,6 @@ +package cluster + +// Extension - Directory +type Directory interface { + List() +} diff --git a/cluster/directory/.gitkeep b/cluster/directory/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/cluster/loadbalance.go b/cluster/loadbalance.go new file mode 100644 index 0000000000000000000000000000000000000000..1af94b461ee740245d192c0264a7ebdfb47e502f --- /dev/null +++ b/cluster/loadbalance.go @@ -0,0 +1,6 @@ +package cluster + +// Extension - LoadBalance +type LoadBalance interface { + Select() +} diff --git a/cluster/loadbalance/.gitkeep b/cluster/loadbalance/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/cluster/router.go b/cluster/router.go new file mode 100644 index 0000000000000000000000000000000000000000..4792edbc276b925cdb34856835b33c2a5289bfb9 --- /dev/null +++ b/cluster/router.go @@ -0,0 +1,6 @@ +package cluster + +// Extension - Router +type Router interface { + Route() +} diff --git a/cluster/router/.gitkeep b/cluster/router/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/common/constant/env.go b/common/constant/env.go new file mode 100644 index 0000000000000000000000000000000000000000..ac2783103aa921916b7549db53030a625c0b744a --- /dev/null +++ b/common/constant/env.go @@ -0,0 +1,6 @@ +package constant + +const ( + CONF_CONSUMER_FILE_PATH = "CONF_CONSUMER_FILE_PATH" + CONF_PROVIDER_FILE_PATH = "CONF_PROVIDER_FILE_PATH" +) diff --git a/common/extension/config.go b/common/extension/config.go new file mode 100644 index 0000000000000000000000000000000000000000..210949917b2fd64be0c970f147cb7b01034a8f79 --- /dev/null +++ b/common/extension/config.go @@ -0,0 +1,45 @@ +package extension + +import ( + "github.com/dubbo/dubbo-go/config" +) + +var ( + serviceConfig map[string]func() config.ServiceConfig + url map[string]func(string) config.URL +) + +func init() { + // init map + serviceConfig = make(map[string]func() config.ServiceConfig) + url = make(map[string]func(string) config.URL) +} + +func SetServiceConfig(name string, v func() config.ServiceConfig) { + serviceConfig[name] = v +} + +func SetURL(name string, v func(string) config.URL) { + url[name] = v +} + +func GetServiceConfigExtension(name string) config.ServiceConfig { + if name == "" { + name = "default" + } + return serviceConfig[name]() +} + +func GetDefaultServiceConfigExtension() config.ServiceConfig { + return serviceConfig["default"]() +} + +func GetURLExtension(name string, urlString string) config.URL { + if name == "" { + name = "default" + } + return url[name](urlString) +} +func GetDefaultURLExtension(urlString string) config.URL { + return url["default"](urlString) +} diff --git a/common/extension/filter.go b/common/extension/filter.go new file mode 100644 index 0000000000000000000000000000000000000000..48cb91f5a836a014beb9f1e78f3bca548f0aafa8 --- /dev/null +++ b/common/extension/filter.go @@ -0,0 +1 @@ +package extension diff --git a/common/extension/protocol.go b/common/extension/protocol.go new file mode 100644 index 0000000000000000000000000000000000000000..295e9c19252a9d16ac96f6de66be89c3660f98e4 --- /dev/null +++ b/common/extension/protocol.go @@ -0,0 +1,11 @@ +package extension + +import protocolmod "github.com/dubbo/dubbo-go/protocol" + +var ( + protocols map[string]func() protocolmod.Protocol +) + +func init() { + protocols = make(map[string]func() protocolmod.Protocol) +} diff --git a/common/extension/registry.go b/common/extension/registry.go new file mode 100644 index 0000000000000000000000000000000000000000..249b29fd465d7207406bea7c2d4ce4413ad4d126 --- /dev/null +++ b/common/extension/registry.go @@ -0,0 +1,36 @@ +package extension + +import ( + "github.com/dubbo/dubbo-go/config" + "github.com/dubbo/dubbo-go/registry" +) + +var ( + registrys map[string]func(config.RegisterConfig) registry.Registry + registryConfigs map[string]func(string, map[string]string) config.RegisterConfig +) + +/* +it must excute first +*/ +func init() { + // init map + registrys = make(map[string]func(config.RegisterConfig) registry.Registry) + registryConfigs = make(map[string]func(string, map[string]string) config.RegisterConfig) +} + +func SetRegistry(name string, v func(config.RegisterConfig) registry.Registry) { + registrys[name] = v +} + +func SetRegistryConfig(name string, v func(string, map[string]string) config.RegisterConfig) { + registryConfigs[name] = v +} + +func GetRegistryExtension(name string, config config.RegisterConfig) registry.Registry { + return registrys[name](config) +} + +func GetRegistryConfigExtension(name string, src map[string]string) config.RegisterConfig { + return registryConfigs[name](name, src) +} diff --git a/common/proxy/.gitkeep b/common/proxy/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/config/config.go b/config/config.go new file mode 100644 index 0000000000000000000000000000000000000000..e2c4002a257269bf59fb474aa42616837a673ac2 --- /dev/null +++ b/config/config.go @@ -0,0 +1,24 @@ +package config + +// Extension - ServiceConfig +type ServiceConfig interface { + Key() string + String() string + ServiceEqual(url URL) bool + // your service config implements must contain properties below + Service() string + Protocol() string + Version() string + Group() string + SetProtocol(string) + SetService(string) + SetVersion(string) + SetGroup(string) + // export + Export() +} + +// Extension - RegisterConfig +type RegisterConfig interface { + IsValid() bool +} diff --git a/config/configloader.go b/config/configloader.go new file mode 100644 index 0000000000000000000000000000000000000000..e1691ce1a85d9d6269f933b9f71ca36bf2e068c6 --- /dev/null +++ b/config/configloader.go @@ -0,0 +1,88 @@ +package config + +import ( + "gopkg.in/yaml.v2" + "io/ioutil" + "os" +) + +import ( + "github.com/dubbo/dubbo-go/common/constant" +) + +var ( + consumerConfig ConsumerConfig + providerConfig ProviderConfig +) + +// loaded comsumer & provider config from xxx.yml +// Namely: dubbo.comsumer.xml & dubbo.provider.xml +func init() { + // consumer + path := os.Getenv(constant.CONF_CONSUMER_FILE_PATH) + if path == "" { + return + } + + file, err := ioutil.ReadFile(path) + if err != nil { + panic(err) + } + + con := &ConsumerConfig{} + err = yaml.Unmarshal(file, con) + if err != nil { + panic(err) + } + + consumerConfig = *con + + // provider + path = os.Getenv(constant.CONF_PROVIDER_FILE_PATH) + if path == "" { + return + } + + file, err = ioutil.ReadFile(path) + if err != nil { + panic(err) + } + + pro := &ProviderConfig{} + err = yaml.Unmarshal(file, pro) + if err != nil { + panic(err) + } + + providerConfig = *pro +} + +///////////////////////// +// consumerConfig +///////////////////////// + +type ConsumerConfig struct { + RegistryConfigs []map[string]string `yaml:"registryConfigs" json:"registryConfigs"` +} + +func SetConsumerConfig(c ConsumerConfig) { + consumerConfig = c +} +func GetConsumerConfig() ConsumerConfig { + return consumerConfig +} + +///////////////////////// +// providerConfig +///////////////////////// + +type ProviderConfig struct { + RegistryConfigs []map[string]string `yaml:"registryConfigs" json:"registryConfigs"` +} + +func SetProviderConfig(p ProviderConfig) { + providerConfig = p +} +func GetProviderConfig() ProviderConfig { + return providerConfig +} diff --git a/config/default/serviceconfig.go b/config/default/serviceconfig.go new file mode 100644 index 0000000000000000000000000000000000000000..22f26cf964feeac57cf4711ca34382f5b22c77a0 --- /dev/null +++ b/config/default/serviceconfig.go @@ -0,0 +1,240 @@ +package _default + +import ( + "fmt" + "net" + "net/url" + "strconv" + "strings" + "time" +) + +import ( + log "github.com/AlexStocks/log4go" + jerrors "github.com/juju/errors" +) + +import ( + "github.com/dubbo/dubbo-go/common/extension" + "github.com/dubbo/dubbo-go/config" +) + +func init() { + extension.SetServiceConfig("default", GetServiceConfig) + extension.SetURL("default", GetURL) +} + +type DefaultServiceConfig struct { + Protocol_ string `required:"true",default:"dubbo" yaml:"protocol" json:"protocol,omitempty"` + Service_ string `required:"true" yaml:"service" json:"service,omitempty"` + Group_ string `yaml:"group" json:"group,omitempty"` + Version_ string `yaml:"version" json:"version,omitempty"` +} + +func NewDefaultServiceConfig() DefaultServiceConfig { + return DefaultServiceConfig{} +} + +func (c *DefaultServiceConfig) Key() string { + return fmt.Sprintf("%s@%s", c.Service_, c.Protocol_) +} + +func (c *DefaultServiceConfig) String() string { + return fmt.Sprintf("%s@%s-%s-%s", c.Service_, c.Protocol_, c.Group_, c.Version_) +} + +func (c *DefaultServiceConfig) ServiceEqual(url config.URL) bool { + if c.Protocol_ != url.Protocol() { + return false + } + + if c.Service_ != url.Query().Get("interface") { + return false + } + + if c.Group_ != url.Group() { + return false + } + + if c.Version_ != url.Version() { + return false + } + + return true +} + +func (c *DefaultServiceConfig) Service() string { + return c.Service_ +} + +func (c *DefaultServiceConfig) Protocol() string { + return c.Protocol_ +} + +func (c *DefaultServiceConfig) Version() string { + return c.Version_ +} + +func (c *DefaultServiceConfig) Group() string { + return c.Group_ +} +func (c *DefaultServiceConfig) SetProtocol(s string) { + c.Protocol_ = s +} + +func (c *DefaultServiceConfig) SetService(s string) { + c.Service_ = s +} +func (c *DefaultServiceConfig) SetVersion(s string) { + c.Version_ = s +} + +func (c *DefaultServiceConfig) SetGroup(s string) { + c.Group_ = s +} + +func (c *DefaultServiceConfig) Export() { + //todo:export +} + +func GetServiceConfig() config.ServiceConfig { + s := NewDefaultServiceConfig() + return &s +} + +///////////////////////////////////// +// url +///////////////////////////////////// + +type DefaultServiceURL struct { + Protocol_ string + Location_ string // ip+port + Path_ string // like /com.ikurento.dubbo.UserProvider3 + Ip_ string + Port_ string + Timeout_ time.Duration + Version_ string + Group_ string + Query_ url.Values + Weight_ int32 + PrimitiveURL_ string +} + +func NewDefaultServiceURL(urlString string) (config.URL, error) { + var ( + err error + rawUrlString string + serviceUrl *url.URL + s = &DefaultServiceURL{} + ) + + rawUrlString, err = url.QueryUnescape(urlString) + if err != nil { + return nil, jerrors.Errorf("url.QueryUnescape(%s), error{%v}", urlString, err) + } + + serviceUrl, err = url.Parse(rawUrlString) + if err != nil { + return nil, jerrors.Errorf("url.Parse(url string{%s}), error{%v}", rawUrlString, err) + } + + s.Query_, err = url.ParseQuery(serviceUrl.RawQuery) + if err != nil { + return nil, jerrors.Errorf("url.ParseQuery(raw url string{%s}), error{%v}", serviceUrl.RawQuery, err) + } + + s.PrimitiveURL_ = urlString + s.Protocol_ = serviceUrl.Scheme + s.Location_ = serviceUrl.Host + s.Path_ = serviceUrl.Path + if strings.Contains(s.Location_, ":") { + s.Ip_, s.Port_, err = net.SplitHostPort(s.Location_) + if err != nil { + return nil, jerrors.Errorf("net.SplitHostPort(Url.Host{%s}), error{%v}", s.Location_, err) + } + } + s.Group_ = s.Query_.Get("group") + s.Version_ = s.Query_.Get("version") + timeoutStr := s.Query_.Get("timeout") + if len(timeoutStr) == 0 { + timeoutStr = s.Query_.Get("default.timeout") + } + if len(timeoutStr) != 0 { + timeout, err := strconv.Atoi(timeoutStr) + if err == nil && timeout != 0 { + s.Timeout_ = time.Duration(timeout * 1e6) // timeout unit is millisecond + } + } + + return s, nil +} + +func (s DefaultServiceURL) String() string { + return fmt.Sprintf( + "DefaultServiceURL{Protocol:%s, Location:%s, Path:%s, Ip:%s, Port:%s, "+ + "Timeout:%s, Version:%s, Group:%s, Weight_:%d, Query:%+v}", + s.Protocol_, s.Location_, s.Path_, s.Ip_, s.Port_, + s.Timeout_, s.Version_, s.Group_, s.Weight_, s.Query_) +} + +func (s *DefaultServiceURL) CheckMethod(method string) bool { + var ( + methodArray []string + ) + + methodArray = strings.Split(s.Query_.Get("methods"), ",") + for _, m := range methodArray { + if m == method { + return true + } + } + + return false +} + +func (s *DefaultServiceURL) PrimitiveURL() string { + return s.PrimitiveURL_ +} + +func (s *DefaultServiceURL) Timeout() time.Duration { + return s.Timeout_ +} +func (s *DefaultServiceURL) Location() string { + return s.Location_ +} + +func (s *DefaultServiceURL) Query() url.Values { + return s.Query_ +} + +func (s *DefaultServiceURL) Group() string { + return s.Group_ +} + +func (s *DefaultServiceURL) Protocol() string { + return s.Protocol_ +} + +func (s *DefaultServiceURL) Version() string { + return s.Version_ +} + +func (s *DefaultServiceURL) Ip() string { + return s.Ip_ +} + +func (s *DefaultServiceURL) Port() string { + return s.Port_ +} + +func (s *DefaultServiceURL) Path() string { + return s.Path_ +} + +func GetURL(urlString string) config.URL { + url, err := NewDefaultServiceURL(urlString) + if err != nil { + log.Error(jerrors.Trace(err)) + } + return url +} diff --git a/config/url.go b/config/url.go new file mode 100644 index 0000000000000000000000000000000000000000..63acf9d0fe8d446129add220a38ebb6ace9c25f2 --- /dev/null +++ b/config/url.go @@ -0,0 +1,21 @@ +package config + +import ( + "net/url" + "time" +) + +// Extension - URL +type URL interface { + CheckMethod(string) bool + PrimitiveURL() string + Query() url.Values + Location() string + Timeout() time.Duration + Group() string + Protocol() string + Version() string + Ip() string + Port() string + Path() string +} diff --git a/filter/.gitkeep b/filter/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/protocol/dubbo/.gitkeep b/protocol/dubbo/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/protocol/jsonrpc/.gitkeep b/protocol/jsonrpc/.gitkeep new file mode 100644 index 0000000000000000000000000000000000000000..d3f5a12faa99758192ecc4ed3fc22c9249232e86 --- /dev/null +++ b/protocol/jsonrpc/.gitkeep @@ -0,0 +1 @@ + diff --git a/protocol/protocol.go b/protocol/protocol.go new file mode 100644 index 0000000000000000000000000000000000000000..2285ab55fd02596dd46956b3d56b81e7f28fc256 --- /dev/null +++ b/protocol/protocol.go @@ -0,0 +1,8 @@ +package protocol + +// Extension - Protocol +type Protocol interface { + Export() + Refer() + Destroy() +} diff --git a/registry/registry.go b/registry/registry.go index 8408b14e0a2cf5339901d0b954b6854f9d01233a..7ebe55559beb4f81f2ace4c0086978f20d323a44 100644 --- a/registry/registry.go +++ b/registry/registry.go @@ -1,10 +1,6 @@ package registry -////////////////////////////////////////////// -// Registry Interface -////////////////////////////////////////////// - -// for service discovery/registry +// Extension - Registry type Registry interface { //used for service provider calling , register services to registry