This is an automated email from the ASF dual-hosted git repository.

liujun pushed a commit to branch feature-triple
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git


The following commit(s) were added to refs/heads/feature-triple by this push:
     new 9d62f726a Fix #2446, move XxxOption definition in global package to 
separate packages (#2447)
9d62f726a is described below

commit 9d62f726adbadfb63f0cc7a8cfcbd39b7618864f
Author: Ken Liu <[email protected]>
AuthorDate: Thu Oct 26 15:46:00 2023 +0800

    Fix #2446, move XxxOption definition in global package to separate packages 
(#2447)
---
 config/protocol_config.go              |   4 +-
 config_center/dynamic_configuration.go |  27 ------
 config_center/file/impl.go             |  21 ++---
 config_center/nacos/impl.go            |   7 +-
 config_center/options.go               | 159 +++++++++++++++++++++++++++++++++
 config_center/zookeeper/impl.go        |   9 +-
 global/config_center_config.go         |  79 ----------------
 global/custom_config.go                |   6 ++
 global/metadata_report_config.go       |  44 ---------
 global/metric_config.go                | 123 +++----------------------
 global/protocol_config.go              |  38 --------
 global/registry_config.go              |  98 --------------------
 global/tls_config.go                   |   5 ++
 global/tracing_config.go               |  26 ------
 go.mod                                 |   1 +
 {protocol => logger}/options.go        |  76 ++++++----------
 metadata/options.go                    | 104 +++++++++++++++++++++
 metrics/options.go                     | 125 ++++++++++++++++++++++++++
 options.go                             | 111 ++++++++++-------------
 {protocol => otel/trace}/options.go    |  66 +++++---------
 protocol/options.go                    |  17 ++--
 registry/options.go                    |  10 +--
 22 files changed, 529 insertions(+), 627 deletions(-)

diff --git a/config/protocol_config.go b/config/protocol_config.go
index 39cb95f1d..4443aa5ea 100644
--- a/config/protocol_config.go
+++ b/config/protocol_config.go
@@ -27,9 +27,9 @@ import (
 
 // ProtocolConfig is protocol configuration
 type ProtocolConfig struct {
-       Name   string      `default:"dubbo" validate:"required" yaml:"name" 
json:"name,omitempty" property:"name"`
+       Name   string      `default:"tri" validate:"required" yaml:"name" 
json:"name,omitempty" property:"name"`
        Ip     string      `yaml:"ip"  json:"ip,omitempty" property:"ip"`
-       Port   string      `default:"20000" yaml:"port" json:"port,omitempty" 
property:"port"`
+       Port   string      `default:"50051" yaml:"port" json:"port,omitempty" 
property:"port"`
        Params interface{} `yaml:"params" json:"params,omitempty" 
property:"params"`
 
        // MaxServerSendMsgSize max size of server send message, 
1mb=1000kb=1000000b 1mib=1024kb=1048576b.
diff --git a/config_center/dynamic_configuration.go 
b/config_center/dynamic_configuration.go
index 79e93f27b..05d48acf1 100644
--- a/config_center/dynamic_configuration.go
+++ b/config_center/dynamic_configuration.go
@@ -17,10 +17,6 @@
 
 package config_center
 
-import (
-       "time"
-)
-
 import (
        gxset "github.com/dubbogo/gost/container/set"
 )
@@ -62,29 +58,6 @@ type DynamicConfiguration interface {
        GetConfigKeysByGroup(group string) (*gxset.HashSet, error)
 }
 
-// Options ...
-type Options struct {
-       Group   string
-       Timeout time.Duration
-}
-
-// Option ...
-type Option func(*Options)
-
-// WithGroup assigns group to opt.Group
-func WithGroup(group string) Option {
-       return func(opt *Options) {
-               opt.Group = group
-       }
-}
-
-// WithTimeout assigns time to opt.Timeout
-func WithTimeout(time time.Duration) Option {
-       return func(opt *Options) {
-               opt.Timeout = time
-       }
-}
-
 // GetRuleKey The format is '{interfaceName}:[version]:[group]'
 func GetRuleKey(url *common.URL) string {
        return url.ColonSeparatedKey()
diff --git a/config_center/file/impl.go b/config_center/file/impl.go
index 2261eba15..287ca1e10 100644
--- a/config_center/file/impl.go
+++ b/config_center/file/impl.go
@@ -103,35 +103,26 @@ func (fsdc *FileSystemDynamicConfiguration) SetParser(p 
parser.ConfigurationPars
 // AddListener Add listener
 func (fsdc *FileSystemDynamicConfiguration) AddListener(key string, listener 
config_center.ConfigurationListener,
        opts ...config_center.Option) {
-       tmpOpts := &config_center.Options{}
-       for _, opt := range opts {
-               opt(tmpOpts)
-       }
+       tmpOpts := config_center.NewOptions(opts...)
 
-       tmpPath := fsdc.GetPath(key, tmpOpts.Group)
+       tmpPath := fsdc.GetPath(key, tmpOpts.Center.Group)
        fsdc.cacheListener.AddListener(tmpPath, listener)
 }
 
 // RemoveListener Remove listener
 func (fsdc *FileSystemDynamicConfiguration) RemoveListener(key string, 
listener config_center.ConfigurationListener,
        opts ...config_center.Option) {
-       tmpOpts := &config_center.Options{}
-       for _, opt := range opts {
-               opt(tmpOpts)
-       }
+       tmpOpts := config_center.NewOptions(opts...)
 
-       tmpPath := fsdc.GetPath(key, tmpOpts.Group)
+       tmpPath := fsdc.GetPath(key, tmpOpts.Center.Group)
        fsdc.cacheListener.RemoveListener(tmpPath, listener)
 }
 
 // GetProperties get properties file
 func (fsdc *FileSystemDynamicConfiguration) GetProperties(key string, opts 
...config_center.Option) (string, error) {
-       tmpOpts := &config_center.Options{}
-       for _, opt := range opts {
-               opt(tmpOpts)
-       }
+       tmpOpts := config_center.NewOptions(opts...)
 
-       tmpPath := fsdc.GetPath(key, tmpOpts.Group)
+       tmpPath := fsdc.GetPath(key, tmpOpts.Center.Group)
        file, err := ioutil.ReadFile(tmpPath)
        if err != nil {
                return "", perrors.WithStack(err)
diff --git a/config_center/nacos/impl.go b/config_center/nacos/impl.go
index 5b1c50fb8..a6b728f36 100644
--- a/config_center/nacos/impl.go
+++ b/config_center/nacos/impl.go
@@ -162,11 +162,8 @@ func (n *nacosDynamicConfiguration) 
GetConfigKeysByGroup(group string) (*gxset.H
 
 // GetRule Get router rule
 func (n *nacosDynamicConfiguration) GetRule(key string, opts 
...config_center.Option) (string, error) {
-       tmpOpts := &config_center.Options{}
-       for _, opt := range opts {
-               opt(tmpOpts)
-       }
-       resolvedGroup := n.resolvedGroup(tmpOpts.Group)
+       tmpOpts := config_center.NewOptions(opts...)
+       resolvedGroup := n.resolvedGroup(tmpOpts.Center.Group)
        content, err := n.client.Client().GetConfig(vo.ConfigParam{
                DataId: key,
                Group:  resolvedGroup,
diff --git a/config_center/options.go b/config_center/options.go
new file mode 100644
index 000000000..3fa9e1b38
--- /dev/null
+++ b/config_center/options.go
@@ -0,0 +1,159 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package config_center
+
+import (
+       "strconv"
+       "strings"
+       "time"
+)
+
+import (
+       "dubbo.apache.org/dubbo-go/v3/common/constant"
+       "dubbo.apache.org/dubbo-go/v3/common/constant/file"
+       "dubbo.apache.org/dubbo-go/v3/global"
+)
+
+type Options struct {
+       Center *global.CenterConfig
+}
+
+func defaultOptions() *Options {
+       return &Options{Center: global.DefaultCenterConfig()}
+}
+
+func NewOptions(opts ...Option) *Options {
+       centerOptions := defaultOptions()
+       for _, opt := range opts {
+               opt(centerOptions)
+       }
+       return centerOptions
+}
+
+type Option func(*Options)
+
+func WithZookeeper() Option {
+       return func(opts *Options) {
+               opts.Center.Protocol = constant.ZookeeperKey
+       }
+}
+
+func WithNacos() Option {
+       return func(opts *Options) {
+               opts.Center.Protocol = constant.NacosKey
+       }
+}
+
+func WithAddress(address string) Option {
+       return func(opts *Options) {
+               if i := strings.Index(address, "://"); i > 0 {
+                       opts.Center.Protocol = address[0:i]
+               }
+               opts.Center.Address = address
+       }
+}
+
+func WithDataID(id string) Option {
+       return func(opts *Options) {
+               opts.Center.DataId = id
+       }
+}
+
+func WithCluster(cluster string) Option {
+       return func(opts *Options) {
+               opts.Center.Cluster = cluster
+       }
+}
+
+func WithGroup(group string) Option {
+       return func(opts *Options) {
+               opts.Center.Group = group
+       }
+}
+
+func WithUsername(username string) Option {
+       return func(opts *Options) {
+               opts.Center.Username = username
+       }
+}
+
+func WithPassword(password string) Option {
+       return func(opts *Options) {
+               opts.Center.Password = password
+       }
+}
+
+func WithNamespace(namespace string) Option {
+       return func(opts *Options) {
+               opts.Center.Namespace = namespace
+       }
+}
+
+func WithAppID(id string) Option {
+       return func(opts *Options) {
+               opts.Center.AppID = id
+       }
+}
+
+func WithTimeout(timeout time.Duration) Option {
+       return func(opts *Options) {
+               opts.Center.Timeout = strconv.Itoa(int(timeout.Milliseconds()))
+       }
+}
+
+func WithParams(params map[string]string) Option {
+       return func(opts *Options) {
+               opts.Center.Params = params
+       }
+}
+
+func WithFile() Option {
+       return func(opts *Options) {
+               opts.Center.Protocol = constant.FileKey
+       }
+}
+
+func WithFileExtJson() Option {
+       return func(opts *Options) {
+               opts.Center.FileExtension = string(file.JSON)
+       }
+}
+
+func WithFileExtToml() Option {
+       return func(opts *Options) {
+               opts.Center.FileExtension = string(file.TOML)
+       }
+}
+
+func WithFileExtYaml() Option {
+       return func(opts *Options) {
+               opts.Center.FileExtension = string(file.YAML)
+       }
+}
+
+func WithFileExtYml() Option {
+       return func(opts *Options) {
+               opts.Center.FileExtension = string(file.YML)
+       }
+}
+
+func WithFileExtProperties() Option {
+       return func(opts *Options) {
+               opts.Center.FileExtension = string(file.PROPERTIES)
+       }
+}
diff --git a/config_center/zookeeper/impl.go b/config_center/zookeeper/impl.go
index b6c3e6be5..14b529ab6 100644
--- a/config_center/zookeeper/impl.go
+++ b/config_center/zookeeper/impl.go
@@ -123,16 +123,13 @@ func (c *zookeeperDynamicConfiguration) 
RemoveListener(key string, listener conf
 }
 
 func (c *zookeeperDynamicConfiguration) GetProperties(key string, opts 
...config_center.Option) (string, error) {
-       tmpOpts := &config_center.Options{}
-       for _, opt := range opts {
-               opt(tmpOpts)
-       }
+       tmpOpts := config_center.NewOptions(opts...)
        /**
         * when group is not null, we are getting startup configs from Config 
Center, for example:
         * group=dubbo, key=dubbo.properties
         */
-       if len(tmpOpts.Group) != 0 {
-               key = tmpOpts.Group + "/" + key
+       if len(tmpOpts.Center.Group) != 0 {
+               key = tmpOpts.Center.Group + "/" + key
        } else {
                key = c.GetURL().GetParam(constant.ConfigNamespaceKey, 
config_center.DefaultGroup) + "/" + key
        }
diff --git a/global/config_center_config.go b/global/config_center_config.go
index d219b693a..f66c6b687 100644
--- a/global/config_center_config.go
+++ b/global/config_center_config.go
@@ -29,82 +29,3 @@ func DefaultCenterConfig() *CenterConfig {
                Params: make(map[string]string),
        }
 }
-
-type CenterOption func(*CenterConfig)
-
-func WithCenter_Protocol(protocol string) CenterOption {
-       return func(cfg *CenterConfig) {
-               cfg.Protocol = protocol
-       }
-}
-
-func WithCenter_Address(address string) CenterOption {
-       return func(cfg *CenterConfig) {
-               cfg.Address = address
-       }
-}
-
-func WithCenter_DataID(id string) CenterOption {
-       return func(cfg *CenterConfig) {
-               cfg.DataId = id
-       }
-}
-
-func WithCenter_Cluster(cluster string) CenterOption {
-       return func(cfg *CenterConfig) {
-               cfg.Cluster = cluster
-       }
-}
-
-func WithCenter_Group(group string) CenterOption {
-       return func(cfg *CenterConfig) {
-               cfg.Group = group
-       }
-}
-
-func WithCenter_Username(name string) CenterOption {
-       return func(cfg *CenterConfig) {
-               cfg.Username = name
-       }
-}
-
-func WithCenter_Password(password string) CenterOption {
-       return func(cfg *CenterConfig) {
-               cfg.Password = password
-       }
-}
-
-func WithCenter_Namespace(namespace string) CenterOption {
-       return func(cfg *CenterConfig) {
-               cfg.Namespace = namespace
-       }
-}
-
-func WithCenter_AppID(id string) CenterOption {
-       return func(cfg *CenterConfig) {
-               cfg.AppID = id
-       }
-}
-
-func WithCenter_Timeout(timeout string) CenterOption {
-       return func(cfg *CenterConfig) {
-               cfg.Timeout = timeout
-       }
-}
-
-func WithCenter_Params(params map[string]string) CenterOption {
-       return func(cfg *CenterConfig) {
-               if cfg.Params == nil {
-                       cfg.Params = make(map[string]string)
-               }
-               for k, v := range params {
-                       cfg.Params[k] = v
-               }
-       }
-}
-
-func WithCenter_FileExtension(extension string) CenterOption {
-       return func(cfg *CenterConfig) {
-               cfg.FileExtension = extension
-       }
-}
diff --git a/global/custom_config.go b/global/custom_config.go
index e35e4067a..3fcb8927f 100644
--- a/global/custom_config.go
+++ b/global/custom_config.go
@@ -17,6 +17,12 @@
 
 package global
 
+// CustomConfig
+//
+// # Experimental
+//
+// Notice: This struct is EXPERIMENTAL and may be changed or removed in a
+// later release.
 type CustomConfig struct {
        ConfigMap map[string]interface{} `yaml:"config-map" 
json:"config-map,omitempty" property:"config-map"`
 }
diff --git a/global/metadata_report_config.go b/global/metadata_report_config.go
index 65c97f6d1..718ea19f4 100644
--- a/global/metadata_report_config.go
+++ b/global/metadata_report_config.go
@@ -34,47 +34,3 @@ func DefaultMetadataReportConfig() *MetadataReportConfig {
        // return a new config without setting any field means there is not any 
default value for initialization
        return &MetadataReportConfig{}
 }
-
-type MetadataReportOption func(*MetadataReportConfig)
-
-func WithMetadataReport_Protocol(protocol string) MetadataReportOption {
-       return func(cfg *MetadataReportConfig) {
-               cfg.Protocol = protocol
-       }
-}
-
-func WithMetadataReport_Address(address string) MetadataReportOption {
-       return func(cfg *MetadataReportConfig) {
-               cfg.Address = address
-       }
-}
-
-func WithMetadataReport_Username(username string) MetadataReportOption {
-       return func(cfg *MetadataReportConfig) {
-               cfg.Username = username
-       }
-}
-
-func WithMetadataReport_Password(password string) MetadataReportOption {
-       return func(cfg *MetadataReportConfig) {
-               cfg.Password = password
-       }
-}
-
-func WithMetadataReport_Timeout(timeout string) MetadataReportOption {
-       return func(cfg *MetadataReportConfig) {
-               cfg.Timeout = timeout
-       }
-}
-
-func WithMetadataReport_Group(group string) MetadataReportOption {
-       return func(cfg *MetadataReportConfig) {
-               cfg.Group = group
-       }
-}
-
-func WithMetadataReport_Namespace(namespace string) MetadataReportOption {
-       return func(cfg *MetadataReportConfig) {
-               cfg.Namespace = namespace
-       }
-}
diff --git a/global/metric_config.go b/global/metric_config.go
index ce6124c34..eaeec7047 100644
--- a/global/metric_config.go
+++ b/global/metric_config.go
@@ -43,127 +43,24 @@ type Exporter struct {
 }
 
 type PushgatewayConfig struct {
-       Enabled      *bool  `default:"false" yaml:"enabled" 
json:"enabled,omitempty" property:"enabled"`
-       BaseUrl      string `default:"" yaml:"base-url" 
json:"base-url,omitempty" property:"base-url"`
-       Job          string `default:"default_dubbo_job" yaml:"job" 
json:"job,omitempty" property:"job"`
-       Username     string `default:"" yaml:"username" 
json:"username,omitempty" property:"username"`
-       Password     string `default:"" yaml:"password" 
json:"password,omitempty" property:"password"`
-       PushInterval int    `default:"30" yaml:"push-interval" 
json:"push-interval,omitempty" property:"push-interval"`
+       Enabled  *bool  `default:"false" yaml:"enabled" 
json:"enabled,omitempty" property:"enabled"`
+       BaseUrl  string `default:"" yaml:"base-url" json:"base-url,omitempty" 
property:"base-url"`
+       Job      string `default:"default_dubbo_job" yaml:"job" 
json:"job,omitempty" property:"job"`
+       Username string `default:"" yaml:"username" json:"username,omitempty" 
property:"username"`
+       Password string `default:"" yaml:"password" json:"password,omitempty" 
property:"password"`
+       // seconds
+       PushInterval int `default:"30" yaml:"push-interval" 
json:"push-interval,omitempty" property:"push-interval"`
 }
 
 func DefaultMetricConfig() *MetricConfig {
        // return a new config without setting any field means there is not any 
default value for initialization
-       return &MetricConfig{}
+       return &MetricConfig{Prometheus: defaultPrometheusConfig(), 
Aggregation: defaultAggregateConfig()}
 }
 
 func defaultPrometheusConfig() *PrometheusConfig {
        return &PrometheusConfig{Exporter: &Exporter{}, Pushgateway: 
&PushgatewayConfig{}}
 }
 
-type MetricOption func(*MetricConfig)
-
-func WithMetric_AggregateEnabled() MetricOption {
-       return func(cfg *MetricConfig) {
-               if cfg.Aggregation == nil {
-                       cfg.Aggregation = &AggregateConfig{}
-               }
-               enabled := true
-               cfg.Aggregation.Enabled = &enabled
-       }
-}
-
-func WithMetric_AggregateBucketNum(num int) MetricOption {
-       return func(cfg *MetricConfig) {
-               if cfg.Aggregation == nil {
-                       cfg.Aggregation = &AggregateConfig{}
-               }
-               cfg.Aggregation.BucketNum = num
-       }
-}
-
-func WithMetric_AggregateTimeWindowSeconds(seconds int) MetricOption {
-       return func(cfg *MetricConfig) {
-               if cfg.Aggregation == nil {
-                       cfg.Aggregation = &AggregateConfig{}
-               }
-               cfg.Aggregation.TimeWindowSeconds = seconds
-       }
-}
-
-func WithMetric_PrometheusEnabled() MetricOption {
-       return func(cfg *MetricConfig) {
-               if cfg.Prometheus == nil {
-                       cfg.Prometheus.Exporter = &Exporter{}
-               }
-               enabled := true
-               cfg.Prometheus.Exporter.Enabled = &enabled
-       }
-}
-
-func WithMetric_PrometheusGatewayUrl(url string) MetricOption {
-       return func(cfg *MetricConfig) {
-               if cfg.Prometheus == nil {
-                       cfg.Prometheus = defaultPrometheusConfig()
-               }
-               cfg.Prometheus.Pushgateway.BaseUrl = url
-       }
-}
-
-func WithMetric_PrometheusGatewayJob(job string) MetricOption {
-       return func(cfg *MetricConfig) {
-               if cfg.Prometheus == nil {
-                       cfg.Prometheus = defaultPrometheusConfig()
-               }
-               cfg.Prometheus.Pushgateway.Job = job
-       }
-}
-
-func WithMetric_PrometheusGatewayUsername(username string) MetricOption {
-       return func(cfg *MetricConfig) {
-               if cfg.Prometheus == nil {
-                       cfg.Prometheus = defaultPrometheusConfig()
-               }
-               cfg.Prometheus.Pushgateway.Username = username
-       }
-}
-
-func WithMetric_PrometheusGatewayPassword(password string) MetricOption {
-       return func(cfg *MetricConfig) {
-               if cfg.Prometheus == nil {
-                       cfg.Prometheus = defaultPrometheusConfig()
-               }
-               cfg.Prometheus.Pushgateway.Password = password
-       }
-}
-func WithMetric_PrometheusGatewayInterval(interval int) MetricOption {
-       return func(cfg *MetricConfig) {
-               if cfg.Prometheus == nil {
-                       cfg.Prometheus = defaultPrometheusConfig()
-               }
-               cfg.Prometheus.Pushgateway.PushInterval = interval
-       }
-}
-
-func WithMetric_Enable(enable bool) MetricOption {
-       return func(cfg *MetricConfig) {
-               cfg.Enable = &enable
-       }
-}
-
-func WithMetric_Port(port string) MetricOption {
-       return func(cfg *MetricConfig) {
-               cfg.Port = port
-       }
-}
-
-func WithMetric_Path(path string) MetricOption {
-       return func(cfg *MetricConfig) {
-               cfg.Path = path
-       }
-}
-
-func WithMetric_Protocol(protocol string) MetricOption {
-       return func(cfg *MetricConfig) {
-               cfg.Protocol = protocol
-       }
+func defaultAggregateConfig() *AggregateConfig {
+       return &AggregateConfig{}
 }
diff --git a/global/protocol_config.go b/global/protocol_config.go
index 25f1ae2b7..ebfa3dd5e 100644
--- a/global/protocol_config.go
+++ b/global/protocol_config.go
@@ -34,41 +34,3 @@ type ProtocolConfig struct {
 func DefaultProtocolConfig() *ProtocolConfig {
        return &ProtocolConfig{}
 }
-
-type ProtocolOption func(*ProtocolConfig)
-
-func WithProtocol_Name(name string) ProtocolOption {
-       return func(cfg *ProtocolConfig) {
-               cfg.Name = name
-       }
-}
-
-func WithProtocol_Ip(ip string) ProtocolOption {
-       return func(cfg *ProtocolConfig) {
-               cfg.Ip = ip
-       }
-}
-
-func WithProtocol_Port(port string) ProtocolOption {
-       return func(cfg *ProtocolConfig) {
-               cfg.Port = port
-       }
-}
-
-func WithProtocol_Params(params interface{}) ProtocolOption {
-       return func(cfg *ProtocolConfig) {
-               cfg.Params = params
-       }
-}
-
-func WithProtocol_MaxServerSendMsgSize(size string) ProtocolOption {
-       return func(cfg *ProtocolConfig) {
-               cfg.MaxServerSendMsgSize = size
-       }
-}
-
-func WithProtocol_MaxServerRecvMsgSize(size string) ProtocolOption {
-       return func(cfg *ProtocolConfig) {
-               cfg.MaxServerRecvMsgSize = size
-       }
-}
diff --git a/global/registry_config.go b/global/registry_config.go
index f96ff5250..783dccd2b 100644
--- a/global/registry_config.go
+++ b/global/registry_config.go
@@ -44,101 +44,3 @@ type RegistryConfig struct {
 func DefaultRegistryConfig() *RegistryConfig {
        return &RegistryConfig{}
 }
-
-type RegistryOption func(*RegistryConfig)
-
-func WithRegistry_Protocol(protocol string) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.Protocol = protocol
-       }
-}
-
-func WithRegistry_Timeout(timeout string) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.Timeout = timeout
-       }
-}
-
-func WithRegistry_Group(group string) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.Group = group
-       }
-}
-
-func WithRegistry_Namespace(namespace string) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.Namespace = namespace
-       }
-}
-
-func WithRegistry_TTL(ttl string) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.TTL = ttl
-       }
-}
-
-func WithRegistry_Address(address string) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.Address = address
-       }
-}
-
-func WithRegistry_Username(name string) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.Username = name
-       }
-}
-
-func WithRegistry_Password(password string) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.Password = password
-       }
-}
-
-func WithRegistry_Simplified(flag bool) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.Simplified = flag
-       }
-}
-
-func WithRegistry_Preferred(flag bool) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.Preferred = flag
-       }
-}
-
-func WithRegistry_Zone(zone string) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.Zone = zone
-       }
-}
-
-func WithRegistry_Weight(weight int64) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.Weight = weight
-       }
-}
-
-func WithRegistry_Params(params map[string]string) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.Params = params
-       }
-}
-
-func WithRegistry_RegistryType(typ string) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.RegistryType = typ
-       }
-}
-
-func WithRegistry_UseAsMetaReport(flag bool) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.UseAsMetaReport = flag
-       }
-}
-
-func WithRegistry_UseAsConfigCenter(flag bool) RegistryOption {
-       return func(cfg *RegistryConfig) {
-               cfg.UseAsConfigCenter = flag
-       }
-}
diff --git a/global/tls_config.go b/global/tls_config.go
index f6b1e56e7..3b30d199b 100644
--- a/global/tls_config.go
+++ b/global/tls_config.go
@@ -18,6 +18,11 @@
 package global
 
 // TLSConfig tls config
+//
+// # Experimental
+//
+// Notice: This struct is EXPERIMENTAL and may be changed or removed in a
+// later release.
 type TLSConfig struct {
        CACertFile    string `yaml:"ca-cert-file" json:"ca-cert-file" 
property:"ca-cert-file"`
        TLSCertFile   string `yaml:"tls-cert-file" json:"tls-cert-file" 
property:"tls-cert-file"`
diff --git a/global/tracing_config.go b/global/tracing_config.go
index d6d453ffb..1429c8c3c 100644
--- a/global/tracing_config.go
+++ b/global/tracing_config.go
@@ -24,29 +24,3 @@ type TracingConfig struct {
        Address     string `yaml:"address" json:"address,omitempty" 
property:"address"`
        UseAgent    *bool  `default:"false" yaml:"use-agent" 
json:"use-agent,omitempty" property:"use-agent"`
 }
-
-type TracingOption func(*TracingConfig)
-
-func WithTracing_Name(name string) TracingOption {
-       return func(cfg *TracingConfig) {
-               cfg.Name = name
-       }
-}
-
-func WithTracing_ServiceName(name string) TracingOption {
-       return func(cfg *TracingConfig) {
-               cfg.ServiceName = name
-       }
-}
-
-func WithTracing_Address(address string) TracingOption {
-       return func(cfg *TracingConfig) {
-               cfg.Address = address
-       }
-}
-
-func WithTracing_UseAgent(flag bool) TracingOption {
-       return func(cfg *TracingConfig) {
-               cfg.UseAgent = &flag
-       }
-}
diff --git a/go.mod b/go.mod
index 1c6c70545..048d68db7 100644
--- a/go.mod
+++ b/go.mod
@@ -17,6 +17,7 @@ require (
        github.com/dubbogo/go-zookeeper v1.0.4-0.20211212162352-f9d2183d89d5
        github.com/dubbogo/gost v1.14.0
        github.com/dubbogo/grpc-go v1.42.10
+       github.com/dubbogo/tools v1.0.9 // indirect
        github.com/dubbogo/triple v1.2.2-rc3
        github.com/dustin/go-humanize v1.0.1
        github.com/emicklei/go-restful/v3 v3.10.1
diff --git a/protocol/options.go b/logger/options.go
similarity index 50%
copy from protocol/options.go
copy to logger/options.go
index 8741e256c..db80033dd 100644
--- a/protocol/options.go
+++ b/logger/options.go
@@ -15,109 +15,87 @@
  * limitations under the License.
  */
 
-package protocol
-
-import (
-       "fmt"
-       "strconv"
-)
+package logger
 
 import (
        "dubbo.apache.org/dubbo-go/v3/global"
 )
 
 type Options struct {
-       Protocol *global.ProtocolConfig
-
-       ID string
+       Logger *global.LoggerConfig
 }
 
 func defaultOptions() *Options {
-       return &Options{Protocol: global.DefaultProtocolConfig()}
+       return &Options{Logger: global.DefaultLoggerConfig()}
 }
 
 func NewOptions(opts ...Option) *Options {
-       defOpts := defaultOptions()
+       Options := defaultOptions()
        for _, opt := range opts {
-               opt(defOpts)
-       }
-
-       if defOpts.Protocol.Name == "" {
-               panic(fmt.Sprintf("Please specify registry, eg. WithTriple()"))
+               opt(Options)
        }
-       if defOpts.ID == "" {
-               defOpts.ID = defOpts.Protocol.Name
-       }
-
-       return defOpts
+       return Options
 }
 
 type Option func(*Options)
 
-func WithDubbo() Option {
-       return func(opts *Options) {
-               opts.Protocol.Name = "dubbo"
-       }
-}
-
-func WithGRPC() Option {
+func WithLogrus() Option {
        return func(opts *Options) {
-               opts.Protocol.Name = "grpc"
+               opts.Logger.Driver = "logrus"
        }
 }
 
-func WithJSONRPC() Option {
+func WithZap() Option {
        return func(opts *Options) {
-               opts.Protocol.Name = "jsonrpc"
+               opts.Logger.Driver = "zap"
        }
 }
 
-func WithREST() Option {
+func WithLevel(level string) Option {
        return func(opts *Options) {
-               opts.Protocol.Name = "rest"
+               opts.Logger.Level = level
        }
 }
 
-func WithTriple() Option {
+func WithFormat(format string) Option {
        return func(opts *Options) {
-               opts.Protocol.Name = "tri"
+               opts.Logger.Format = format
        }
 }
 
-// WithID specifies the id of protocol.Options. Then you could configure 
server.WithProtocolIDs and
-// server.WithServer_ProtocolIDs to specify which protocol you need to use in 
multi-protocols scenario.
-func WithID(id string) Option {
+func WithAppender(appender string) Option {
        return func(opts *Options) {
-               opts.ID = id
+               opts.Logger.Appender = appender
        }
 }
 
-func WithIp(ip string) Option {
+func WithFileName(name string) Option {
        return func(opts *Options) {
-               opts.Protocol.Ip = ip
+               opts.Logger.File.Name = name
        }
 }
 
-func WithPort(port int) Option {
+func WithFileMaxSize(size int) Option {
        return func(opts *Options) {
-               opts.Protocol.Port = strconv.Itoa(port)
+               opts.Logger.File.MaxSize = size
        }
 }
 
-func WithParams(params interface{}) Option {
+func WithFileMaxBackups(backups int) Option {
        return func(opts *Options) {
-               opts.Protocol.Params = params
+               opts.Logger.File.MaxBackups = backups
        }
 }
 
-func WithMaxServerSendMsgSize(size int) Option {
+func WithFileMaxAge(age int) Option {
        return func(opts *Options) {
-               opts.Protocol.MaxServerSendMsgSize = strconv.Itoa(size)
+               opts.Logger.File.MaxAge = age
        }
 }
 
-func WithMaxServerRecvMsgSize(size int) Option {
+func WithFileCompress() Option {
        return func(opts *Options) {
-               opts.Protocol.MaxServerRecvMsgSize = strconv.Itoa(size)
+               b := true
+               opts.Logger.File.Compress = &b
        }
 }
diff --git a/metadata/options.go b/metadata/options.go
new file mode 100644
index 000000000..bec1fa91a
--- /dev/null
+++ b/metadata/options.go
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package metadata
+
+import (
+       "strconv"
+       "strings"
+       "time"
+)
+
+import (
+       "dubbo.apache.org/dubbo-go/v3/common/constant"
+       "dubbo.apache.org/dubbo-go/v3/global"
+)
+
+type Options struct {
+       Metadata *global.MetadataReportConfig
+}
+
+func defaultOptions() *Options {
+       return &Options{Metadata: global.DefaultMetadataReportConfig()}
+}
+
+func NewOptions(opts ...Option) *Options {
+       metaOptions := defaultOptions()
+       for _, opt := range opts {
+               opt(metaOptions)
+       }
+       return metaOptions
+}
+
+type Option func(*Options)
+
+func WithZookeeper() Option {
+       return func(opts *Options) {
+               opts.Metadata.Protocol = constant.ZookeeperKey
+       }
+}
+
+func WithNacos() Option {
+       return func(opts *Options) {
+               opts.Metadata.Protocol = constant.NacosKey
+       }
+}
+
+func WithEtcdV3() Option {
+       return func(opts *Options) {
+               opts.Metadata.Protocol = constant.EtcdV3Key
+       }
+}
+
+func WithAddress(address string) Option {
+       return func(opts *Options) {
+               if i := strings.Index(address, "://"); i > 0 {
+                       opts.Metadata.Protocol = address[0:i]
+               }
+               opts.Metadata.Address = address
+       }
+}
+
+func WithUsername(username string) Option {
+       return func(opts *Options) {
+               opts.Metadata.Username = username
+       }
+}
+
+func WithPassword(password string) Option {
+       return func(opts *Options) {
+               opts.Metadata.Password = password
+       }
+}
+
+func WithTimeout(timeout time.Duration) Option {
+       return func(opts *Options) {
+               opts.Metadata.Timeout = 
strconv.Itoa(int(timeout.Milliseconds()))
+       }
+}
+
+func WithGroup(group string) Option {
+       return func(opts *Options) {
+               opts.Metadata.Group = group
+       }
+}
+
+func WithNamespace(namespace string) Option {
+       return func(opts *Options) {
+               opts.Metadata.Namespace = namespace
+       }
+}
diff --git a/metrics/options.go b/metrics/options.go
new file mode 100644
index 000000000..e51d56c7d
--- /dev/null
+++ b/metrics/options.go
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package metrics
+
+import (
+       "strconv"
+       "time"
+)
+
+import (
+       "dubbo.apache.org/dubbo-go/v3/global"
+)
+
+type Options struct {
+       Metric *global.MetricConfig
+}
+
+func defaultOptions() *Options {
+       return &Options{Metric: global.DefaultMetricConfig()}
+}
+
+func NewOptions(opts ...Option) *Options {
+       MetricOptions := defaultOptions()
+       for _, opt := range opts {
+               opt(MetricOptions)
+       }
+       return MetricOptions
+}
+
+type Option func(*Options)
+
+func WithAggregationEnabled() Option {
+       return func(opts *Options) {
+               enabled := true
+               opts.Metric.Aggregation.Enabled = &enabled
+       }
+}
+
+func WithAggregationBucketNum(num int) Option {
+       return func(opts *Options) {
+               opts.Metric.Aggregation.BucketNum = num
+       }
+}
+
+func WithAggregationTimeWindowSeconds(seconds int) Option {
+       return func(opts *Options) {
+               opts.Metric.Aggregation.TimeWindowSeconds = seconds
+       }
+}
+
+func WithPrometheus() Option {
+       return func(opts *Options) {
+               opts.Metric.Protocol = "prometheus"
+       }
+}
+
+func WithPrometheusExporterEnabled() Option {
+       return func(opts *Options) {
+               enabled := true
+               opts.Metric.Prometheus.Exporter.Enabled = &enabled
+       }
+}
+
+func WithPrometheusGatewayUrl(url string) Option {
+       return func(opts *Options) {
+               opts.Metric.Prometheus.Pushgateway.BaseUrl = url
+       }
+}
+
+func WithPrometheusGatewayJob(job string) Option {
+       return func(opts *Options) {
+               opts.Metric.Prometheus.Pushgateway.Job = job
+       }
+}
+
+func WithPrometheusGatewayUsername(username string) Option {
+       return func(opts *Options) {
+               opts.Metric.Prometheus.Pushgateway.Username = username
+       }
+}
+
+func WithPrometheusGatewayPassword(password string) Option {
+       return func(opts *Options) {
+               opts.Metric.Prometheus.Pushgateway.Password = password
+       }
+}
+func WithPrometheusGatewayInterval(interval time.Duration) Option {
+       return func(opts *Options) {
+               opts.Metric.Prometheus.Pushgateway.PushInterval = 
int(interval.Seconds())
+       }
+}
+
+func WithEnabled() Option {
+       return func(opts *Options) {
+               b := true
+               opts.Metric.Enable = &b
+       }
+}
+
+func WithPort(port int) Option {
+       return func(opts *Options) {
+               opts.Metric.Port = strconv.Itoa(port)
+       }
+}
+
+func WithPath(path string) Option {
+       return func(opts *Options) {
+               opts.Metric.Path = path
+       }
+}
diff --git a/options.go b/options.go
index 85159e57a..ab839748c 100644
--- a/options.go
+++ b/options.go
@@ -18,14 +18,19 @@
 package dubbo
 
 import (
-       "github.com/dubbogo/gost/log/logger"
+       log "github.com/dubbogo/gost/log/logger"
 )
 
 import (
        "dubbo.apache.org/dubbo-go/v3/common/constant"
        "dubbo.apache.org/dubbo-go/v3/config"
+       "dubbo.apache.org/dubbo-go/v3/config_center"
        "dubbo.apache.org/dubbo-go/v3/global"
        "dubbo.apache.org/dubbo-go/v3/graceful_shutdown"
+       "dubbo.apache.org/dubbo-go/v3/logger"
+       "dubbo.apache.org/dubbo-go/v3/metadata"
+       "dubbo.apache.org/dubbo-go/v3/metrics"
+       "dubbo.apache.org/dubbo-go/v3/otel/trace"
        "dubbo.apache.org/dubbo-go/v3/protocol"
        "dubbo.apache.org/dubbo-go/v3/registry"
 )
@@ -82,8 +87,8 @@ func (rc *InstanceOptions) init(opts ...InstanceOption) error 
{
                return err
        }
        if err := rcCompat.ConfigCenter.Init(rcCompat); err != nil {
-               logger.Infof("[Config Center] Config center doesn't start")
-               logger.Debugf("config center doesn't start because %s", err)
+               log.Infof("[Config Center] Config center doesn't start")
+               log.Debugf("config center doesn't start because %s", err)
        } else {
                if err = rcCompat.Logger.Init(); err != nil { // init logger 
using config from config center again
                        return err
@@ -242,74 +247,48 @@ func WithRegistry(opts ...registry.Option) InstanceOption 
{
        }
 }
 
-//func WithConfigCenter(opts ...global.CenterOption) InstanceOption {
-//     ccCfg := new(global.CenterConfig)
-//     for _, opt := range opts {
-//             opt(ccCfg)
-//     }
-//
-//     return func(cfg *InstanceOptions) {
-//             cfg.ConfigCenter = ccCfg
-//     }
-//}
+func WithTracing(opts ...trace.Option) InstanceOption {
+       traceOpts := trace.NewOptions(opts...)
 
-//func WithMetadataReport(opts ...global.MetadataReportOption) InstanceOption {
-//     mrCfg := new(global.MetadataReportConfig)
-//     for _, opt := range opts {
-//             opt(mrCfg)
-//     }
-//
-//     return func(cfg *InstanceOptions) {
-//             cfg.MetadataReport = mrCfg
-//     }
-//}
+       return func(insOpts *InstanceOptions) {
+               if insOpts.Tracing == nil {
+                       insOpts.Tracing = make(map[string]*global.TracingConfig)
+               }
+               insOpts.Tracing[traceOpts.ID] = traceOpts.Tracing
+       }
+}
 
-//func WithConsumer(opts ...global.ConsumerOption) InstanceOption {
-//     conCfg := new(global.ConsumerConfig)
-//     for _, opt := range opts {
-//             opt(conCfg)
-//     }
-//
-//     return func(cfg *InstanceOptions) {
-//             cfg.Consumer = conCfg
-//     }
-//}
+func WithConfigCenter(opts ...config_center.Option) InstanceOption {
+       configOpts := config_center.NewOptions(opts...)
 
-//func WithMetric(opts ...global.MetricOption) InstanceOption {
-//     meCfg := new(global.MetricConfig)
-//     for _, opt := range opts {
-//             opt(meCfg)
-//     }
-//
-//     return func(cfg *InstanceOptions) {
-//             cfg.Metric = meCfg
-//     }
-//}
+       return func(cfg *InstanceOptions) {
+               cfg.ConfigCenter = configOpts.Center
+       }
+}
 
-//func WithTracing(key string, opts ...global.TracingOption) InstanceOption {
-//     traCfg := new(global.TracingConfig)
-//     for _, opt := range opts {
-//             opt(traCfg)
-//     }
-//
-//     return func(cfg *InstanceOptions) {
-//             if cfg.Tracing == nil {
-//                     cfg.Tracing = make(map[string]*global.TracingConfig)
-//             }
-//             cfg.Tracing[key] = traCfg
-//     }
-//}
+func WithMetadataReport(opts ...metadata.Option) InstanceOption {
+       metadataOpts := metadata.NewOptions(opts...)
 
-//func WithLogger(opts ...global.LoggerOption) InstanceOption {
-//     logCfg := new(global.LoggerConfig)
-//     for _, opt := range opts {
-//             opt(logCfg)
-//     }
-//
-//     return func(cfg *InstanceOptions) {
-//             cfg.Logger = logCfg
-//     }
-//}
+       return func(cfg *InstanceOptions) {
+               cfg.MetadataReport = metadataOpts.Metadata
+       }
+}
+
+func WithMetric(opts ...metrics.Option) InstanceOption {
+       metricOpts := metrics.NewOptions(opts...)
+
+       return func(cfg *InstanceOptions) {
+               cfg.Metric = metricOpts.Metric
+       }
+}
+
+func WithLogger(opts ...logger.Option) InstanceOption {
+       loggerOpts := logger.NewOptions(opts...)
+
+       return func(cfg *InstanceOptions) {
+               cfg.Logger = loggerOpts.Logger
+       }
+}
 
 func WithShutdown(opts ...graceful_shutdown.Option) InstanceOption {
        sdOpts := graceful_shutdown.NewOptions(opts...)
diff --git a/protocol/options.go b/otel/trace/options.go
similarity index 53%
copy from protocol/options.go
copy to otel/trace/options.go
index 8741e256c..6311bf6bb 100644
--- a/protocol/options.go
+++ b/otel/trace/options.go
@@ -15,11 +15,10 @@
  * limitations under the License.
  */
 
-package protocol
+package trace
 
 import (
        "fmt"
-       "strconv"
 )
 
 import (
@@ -27,13 +26,13 @@ import (
 )
 
 type Options struct {
-       Protocol *global.ProtocolConfig
+       Tracing *global.TracingConfig
 
        ID string
 }
 
 func defaultOptions() *Options {
-       return &Options{Protocol: global.DefaultProtocolConfig()}
+       return &Options{Tracing: &global.TracingConfig{}}
 }
 
 func NewOptions(opts ...Option) *Options {
@@ -42,11 +41,11 @@ func NewOptions(opts ...Option) *Options {
                opt(defOpts)
        }
 
-       if defOpts.Protocol.Name == "" {
-               panic(fmt.Sprintf("Please specify registry, eg. WithTriple()"))
+       if defOpts.Tracing.Name == "" {
+               panic(fmt.Sprintf("Please specify the tracing system to use, 
eg. WithZipkin()"))
        }
        if defOpts.ID == "" {
-               defOpts.ID = defOpts.Protocol.Name
+               defOpts.ID = defOpts.Tracing.Name
        }
 
        return defOpts
@@ -54,70 +53,51 @@ func NewOptions(opts ...Option) *Options {
 
 type Option func(*Options)
 
-func WithDubbo() Option {
-       return func(opts *Options) {
-               opts.Protocol.Name = "dubbo"
-       }
-}
-
-func WithGRPC() Option {
-       return func(opts *Options) {
-               opts.Protocol.Name = "grpc"
-       }
-}
-
-func WithJSONRPC() Option {
-       return func(opts *Options) {
-               opts.Protocol.Name = "jsonrpc"
-       }
-}
-
-func WithREST() Option {
+func WithID(id string) Option {
        return func(opts *Options) {
-               opts.Protocol.Name = "rest"
+               opts.ID = id
        }
 }
 
-func WithTriple() Option {
+func WithZipkin() Option {
        return func(opts *Options) {
-               opts.Protocol.Name = "tri"
+               opts.Tracing.Name = "zipkin"
        }
 }
 
-// WithID specifies the id of protocol.Options. Then you could configure 
server.WithProtocolIDs and
-// server.WithServer_ProtocolIDs to specify which protocol you need to use in 
multi-protocols scenario.
-func WithID(id string) Option {
+func WithJaeger() Option {
        return func(opts *Options) {
-               opts.ID = id
+               opts.Tracing.Name = "jaeger"
        }
 }
 
-func WithIp(ip string) Option {
+func WithOltp() Option {
        return func(opts *Options) {
-               opts.Protocol.Ip = ip
+               opts.Tracing.Name = "oltp"
        }
 }
 
-func WithPort(port int) Option {
+func WithStdout() Option {
        return func(opts *Options) {
-               opts.Protocol.Port = strconv.Itoa(port)
+               opts.Tracing.Name = "stdout"
        }
 }
 
-func WithParams(params interface{}) Option {
+func WithServiceName(name string) Option {
        return func(opts *Options) {
-               opts.Protocol.Params = params
+               opts.Tracing.ServiceName = name
        }
 }
 
-func WithMaxServerSendMsgSize(size int) Option {
+func WithAddress(address string) Option {
        return func(opts *Options) {
-               opts.Protocol.MaxServerSendMsgSize = strconv.Itoa(size)
+               opts.Tracing.Address = address
        }
 }
 
-func WithMaxServerRecvMsgSize(size int) Option {
+func WithUseAgent() Option {
        return func(opts *Options) {
-               opts.Protocol.MaxServerRecvMsgSize = strconv.Itoa(size)
+               b := true
+               opts.Tracing.UseAgent = &b
        }
 }
diff --git a/protocol/options.go b/protocol/options.go
index 8741e256c..58683af5b 100644
--- a/protocol/options.go
+++ b/protocol/options.go
@@ -18,7 +18,6 @@
 package protocol
 
 import (
-       "fmt"
        "strconv"
 )
 
@@ -42,11 +41,13 @@ func NewOptions(opts ...Option) *Options {
                opt(defOpts)
        }
 
-       if defOpts.Protocol.Name == "" {
-               panic(fmt.Sprintf("Please specify registry, eg. WithTriple()"))
-       }
        if defOpts.ID == "" {
-               defOpts.ID = defOpts.Protocol.Name
+               if defOpts.Protocol.Name == "" {
+                       // should be the same as default value of 
config.ProtocolConfig.Protocol
+                       defOpts.ID = "tri"
+               } else {
+                       defOpts.ID = defOpts.Protocol.Name
+               }
        }
 
        return defOpts
@@ -60,12 +61,6 @@ func WithDubbo() Option {
        }
 }
 
-func WithGRPC() Option {
-       return func(opts *Options) {
-               opts.Protocol.Name = "grpc"
-       }
-}
-
 func WithJSONRPC() Option {
        return func(opts *Options) {
                opts.Protocol.Name = "jsonrpc"
diff --git a/registry/options.go b/registry/options.go
index 563438a7a..0ff58654f 100644
--- a/registry/options.go
+++ b/registry/options.go
@@ -19,6 +19,7 @@ package registry
 
 import (
        "fmt"
+       "strings"
        "time"
 )
 
@@ -27,8 +28,6 @@ import (
        "dubbo.apache.org/dubbo-go/v3/global"
 )
 
-var defaultIDMap = map[string]string{}
-
 type Options struct {
        Registry *global.RegistryConfig
 
@@ -63,7 +62,6 @@ func WithEtcdV3() Option {
        return func(opts *Options) {
                // todo(DMwangnima): move etcdv3 to constant
                opts.Registry.Protocol = "etcdv3"
-
        }
 }
 
@@ -87,8 +85,7 @@ func WithXDS() Option {
 
 func WithZookeeper() Option {
        return func(opts *Options) {
-               // todo(DMwangnima): move zookeeper to constant
-               opts.Registry.Protocol = "zookeeper"
+               opts.Registry.Protocol = constant.ZookeeperKey
        }
 }
 
@@ -126,6 +123,9 @@ func WithTTL(ttl time.Duration) Option {
 
 func WithAddress(address string) Option {
        return func(opts *Options) {
+               if i := strings.Index(address, "://"); i > 0 {
+                       opts.Registry.Protocol = address[0:i]
+               }
                opts.Registry.Address = address
        }
 }


Reply via email to