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