diff --git a/config/generic_reference_config.go b/config/generic_reference_config.go
new file mode 100644
index 0000000000000000000000000000000000000000..d47cfe355ea91801353557f63412b87cb4611e4c
--- /dev/null
+++ b/config/generic_reference_config.go
@@ -0,0 +1,63 @@
+package config
+
+import (
+	"context"
+	"github.com/apache/dubbo-go/common/logger"
+)
+
+type GenericService struct {
+	Invoke       func(req []interface{}) (interface{}, error) `dubbo:"$invoke"`
+	referenceStr string
+}
+
+func NewGenericService(reference string) *GenericService {
+	return &GenericService{referenceStr: reference}
+}
+
+func (u *GenericService) Reference() string {
+	return u.referenceStr
+}
+
+type GenericConsumerConfig struct {
+	Protocol       string
+	Registry       string
+	Version        string
+	Group          string
+	InterfaceName  string
+	Cluster        string
+	Retries        int64
+	ref            *ReferenceConfig
+	genericService *GenericService
+}
+
+func (gConfig *GenericConsumerConfig) LoadGenericReferenceConfig(key string) {
+	gConfig.genericService = NewGenericService(key)
+	SetConsumerService(gConfig.genericService)
+	gConfig.NewGenericReferenceConfig(key)
+
+	rpcService := GetConsumerService(key)
+	if rpcService == nil {
+		logger.Warnf("%s is not exsist!", key)
+		return
+	}
+
+	gConfig.ref.id = key
+	gConfig.ref.Refer()
+	gConfig.ref.Implement(rpcService)
+
+}
+func (gConfig *GenericConsumerConfig) GetService() *GenericService {
+	return gConfig.genericService
+}
+func (gConfig *GenericConsumerConfig) NewGenericReferenceConfig(id string) {
+	gr := NewReferenceConfig(id, context.TODO())
+	//gr.Filter = "genericConsumer" //todo: add genericConsumer filter
+	gr.Registry = gConfig.Registry
+	gr.Protocol = gConfig.Protocol
+	gr.Version = gConfig.Version
+	gr.Group = gConfig.Group
+	gr.InterfaceName = gConfig.InterfaceName
+	gr.Cluster = gConfig.Cluster
+	gr.Methods = append(gr.Methods, &MethodConfig{Name: "$invoke", Retries: gConfig.Retries})
+	gConfig.ref = gr
+}
diff --git a/config/reference_config.go b/config/reference_config.go
index f76c973ed53d0fec9e92e33ed6dbb8dcfdcd3a6a..0e08180295227260ae6f9e1c65e988fd9bdead7a 100644
--- a/config/reference_config.go
+++ b/config/reference_config.go
@@ -61,8 +61,8 @@ func (c *ReferenceConfig) Prefix() string {
 	return constant.ReferenceConfigPrefix + c.InterfaceName + "."
 }
 
-func NewReferenceConfig(ctx context.Context) *ReferenceConfig {
-	return &ReferenceConfig{context: ctx}
+func NewReferenceConfig(id string, ctx context.Context) *ReferenceConfig {
+	return &ReferenceConfig{id: id, context: ctx}
 }
 
 func (refconfig *ReferenceConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
@@ -109,7 +109,6 @@ func (refconfig *ReferenceConfig) Refer() {
 			regUrl.SubURL = url
 		}
 	}
-
 	if len(refconfig.urls) == 1 {
 		refconfig.invoker = extension.GetProtocol(refconfig.urls[0].Protocol).Refer(*refconfig.urls[0])
 	} else {
diff --git a/examples/dubbo/go-client/app/client.go b/examples/dubbo/go-client/app/client.go
index 0b77e60ceca921f2327a98abbe9540938296a85b..250f2160f84468a98ec411ae9d810f7a1adc7f64 100644
--- a/examples/dubbo/go-client/app/client.go
+++ b/examples/dubbo/go-client/app/client.go
@@ -20,16 +20,14 @@ package main
 import (
 	"context"
 	"fmt"
+	"github.com/apache/dubbo-go/protocol/dubbo"
+	hessian "github.com/dubbogo/hessian2"
 	"os"
 	"os/signal"
 	"syscall"
 	"time"
 )
 
-import (
-	"github.com/dubbogo/hessian2"
-)
-
 import (
 	"github.com/apache/dubbo-go/common/logger"
 	_ "github.com/apache/dubbo-go/common/proxy/proxy_factory"
@@ -53,19 +51,20 @@ var (
 // 		export APP_LOG_CONF_FILE="xxx"
 func main() {
 
-	hessian.RegisterJavaEnum(Gender(MAN))
-	hessian.RegisterJavaEnum(Gender(WOMAN))
-	hessian.RegisterPOJO(&User{})
-
-	config.Load()
-
-	println("\n\ntest")
-	test()
-	println("\n\ntest1")
-	test1()
-	println("\n\ntest2")
-	test2()
-
+	//hessian.RegisterJavaEnum(Gender(MAN))
+	//hessian.RegisterJavaEnum(Gender(WOMAN))
+	//hessian.RegisterPOJO(&User{})
+	//
+	//config.Load()
+
+	//println("\n\ntest")
+	//test()
+	//println("\n\ntest1")
+	//test1()
+	//println("\n\ntest2")
+	//test2()
+	//println("\n\ngeneric")
+	test3()
 	initSignal()
 }
 
@@ -288,3 +287,19 @@ func test2() {
 	}
 	println("error: %v", err)
 }
+func test3() {
+	println("\n\n\nstart to generic invoke")
+	var genericConfig config.GenericConsumerConfig
+	genericConfig.InterfaceName = "com.ikurento.user.UserProvider"
+	genericConfig.Cluster = "failover"
+	genericConfig.Registry = "hangzhouzk"
+	genericConfig.Protocol = dubbo.DUBBO
+	genericConfig.LoadGenericReferenceConfig("getUser-generic")
+	time.Sleep(3 * time.Second)
+	resp, err := genericConfig.GetService().Invoke([]interface{}{"GetUser", []string{"java.lang.String"}, []hessian.Object{"A003"}})
+	if err != nil {
+		panic(err)
+	}
+	fmt.Println("get resp:", resp)
+
+}