You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2026/06/25 01:29:28 UTC
(dubbo-go) branch develop updated: [config] Decouple config reader and remove config package (#3449)
This is an automated email from the ASF dual-hosted git repository.
AlexStocks pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
The following commit(s) were added to refs/heads/develop by this push:
new 8b5bbcf19 [config] Decouple config reader and remove config package (#3449)
8b5bbcf19 is described below
commit 8b5bbcf192aaac782e2fcf1ea2a6c7c90d9e3e1c
Author: Xuetao Li <m1...@163.com>
AuthorDate: Thu Jun 25 01:29:23 2026 +0000
[config] Decouple config reader and remove config package (#3449)
* decouple config reader
* complete delete config package
---
common/extension/config_reader.go | 14 +-
config/application_config.go | 131 -----
config/application_config_test.go | 68 ---
config/client_protocol_config.go | 26 -
config/config_center_config.go | 244 ---------
config/config_loader.go | 123 -----
config/config_loader_options.go | 227 --------
config/config_loader_options_test.go | 110 ----
config/config_resolver.go | 112 ----
config/config_resolver_test.go | 49 --
config/config_setter.go | 22 -
config/config_utils.go | 122 -----
config/config_utils_test.go | 83 ---
config/consumer_config.go | 279 ----------
config/custom_config.go | 80 ---
config/custom_config_test.go | 90 ---
config/doc.go | 21 -
config/generic/generic_service.go | 32 --
config/graceful_shutdown.go | 243 ---------
config/graceful_shutdown_config.go | 79 ---
config/graceful_shutdown_config_test.go | 104 ----
config/graceful_shutdown_signal_darwin.go | 38 --
config/graceful_shutdown_signal_linux.go | 38 --
config/graceful_shutdown_signal_windows.go | 35 --
config/graceful_shutdown_test.go | 205 -------
config/http3_config.go | 38 --
config/interfaces/config_post_processor.go | 32 --
config/interfaces/config_reader.go | 28 -
config/logger_config.go | 223 --------
config/logger_config_test.go | 176 ------
config/metadata_config.go | 237 --------
config/metadata_config_test.go | 48 --
config/method_config.go | 112 ----
config/metric_config.go | 175 ------
config/metric_config_test.go | 40 --
config/mock_rpcservice.go | 40 --
config/mock_rpcservice_test.go | 40 --
config/options.go | 123 -----
config/otel_config.go | 120 ----
config/otel_config_test.go | 40 --
config/profiles_config.go | 44 --
config/profiles_config_test.go | 76 ---
config/protocol_config.go | 100 ----
config/protocol_config_test.go | 53 --
config/provider_config.go | 279 ----------
config/provider_config_test.go | 87 ---
config/reference_config.go | 547 -------------------
config/reference_config_test.go | 483 ----------------
config/registry_config.go | 491 -----------------
config/registry_config_test.go | 150 -----
config/remote_config.go | 154 ------
config/remote_config_test.go | 78 ---
config/root_config.go | 429 ---------------
config/root_config_test.go | 142 -----
config/router_config.go | 214 --------
config/router_config_test.go | 87 ---
config/service.go | 148 -----
config/service_config.go | 606 ---------------------
config/service_config_test.go | 231 --------
config/service_discovery_config.go | 74 ---
config/service_discovery_config_test.go | 45 --
config/service_test.go | 118 ----
config/ssl_config.go | 49 --
config/ssl_config_test.go | 47 --
config/testdata/application.yaml | 50 --
.../testdata/config/active/application-local.yaml | 31 --
config/testdata/config/active/application.yaml | 22 -
config/testdata/config/app/application.yaml | 36 --
.../testdata/config/application/application.yaml | 19 -
.../testdata/config/center/conf-application.yaml | 28 -
config/testdata/config/custom/custom.yaml | 28 -
config/testdata/config/custom/empty.yaml | 26 -
config/testdata/config/logger/empty_log.yaml | 26 -
config/testdata/config/logger/file_log.yaml | 37 --
config/testdata/config/logger/log.yaml | 51 --
.../config/properties/application.properties | 13 -
config/testdata/config/protocol/application.yaml | 27 -
.../config/protocol/empty_application.yaml | 22 -
config/testdata/config/provider/application.yaml | 32 --
.../provider/empty_registry_application.yaml | 23 -
.../config/provider/registry_application.yaml | 28 -
config/testdata/config/registry/application.yaml | 25 -
.../config/registry/empty_application.yaml | 17 -
config/testdata/config/resolver/application.yaml | 51 --
config/testdata/consumer_config.properties | 52 --
config/testdata/consumer_config.yml | 111 ----
.../testdata/consumer_config_with_configcenter.yml | 58 --
.../testdata/consumer_config_withoutProtocol.yml | 96 ----
config/testdata/provider_config.properties | 58 --
config/testdata/provider_config.yml | 114 ----
.../testdata/provider_config_withoutProtocol.yml | 94 ----
config/testdata/root_config_test.yml | 38 --
config/testdata/router_config_dest_rule.yml | 32 --
config/testdata/router_config_virtual_service.yml | 185 -------
config/tls_config.go | 146 -----
config/tls_config_test.go | 45 --
config/tracing_config.go | 47 --
config/tracing_config_test.go | 41 --
config/triple_config.go | 32 --
protocol/rest/config/reader/rest_config_reader.go | 3 +-
100 files changed, 11 insertions(+), 10512 deletions(-)
diff --git a/common/extension/config_reader.go b/common/extension/config_reader.go
index e493d3c3f..2670adf37 100644
--- a/common/extension/config_reader.go
+++ b/common/extension/config_reader.go
@@ -18,21 +18,27 @@
package extension
import (
- "dubbo.apache.org/dubbo-go/v3/config/interfaces"
+ "bytes"
)
+// ConfigReader is used to read config from consumer or provider.
+type ConfigReader interface {
+ ReadConsumerConfig(reader *bytes.Buffer) error
+ ReadProviderConfig(reader *bytes.Buffer) error
+}
+
var (
- configReaders = NewRegistry[func() interfaces.ConfigReader]("config reader")
+ configReaders = NewRegistry[func() ConfigReader]("config reader")
defaults = NewRegistry[string]("default config reader")
)
// SetConfigReaders sets a creator of config reader with @name
-func SetConfigReaders(name string, v func() interfaces.ConfigReader) {
+func SetConfigReaders(name string, v func() ConfigReader) {
configReaders.Register(name, v)
}
// GetConfigReaders gets a config reader with @name
-func GetConfigReaders(name string) interfaces.ConfigReader {
+func GetConfigReaders(name string) ConfigReader {
return configReaders.MustGet(name)()
}
diff --git a/config/application_config.go b/config/application_config.go
deleted file mode 100644
index c245c8a5e..000000000
--- a/config/application_config.go
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * 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
-
-import (
- "strconv"
-)
-
-import (
- "github.com/creasty/defaults"
-
- "github.com/pkg/errors"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-// ApplicationConfig is a configuration for current applicationConfig, whether the applicationConfig is a provider or a consumer
-type ApplicationConfig struct {
- Organization string `default:"dubbo-go" yaml:"organization" json:"organization,omitempty" property:"organization"`
- Name string `yaml:"name" json:"name,omitempty" property:"name"`
- Module string `default:"sample" yaml:"module" json:"module,omitempty" property:"module"`
- Group string `yaml:"group" json:"group,omitempty" property:"module"`
- Version string `yaml:"version" json:"version,omitempty" property:"version"`
- Owner string `default:"dubbo-go" yaml:"owner" json:"owner,omitempty" property:"owner"`
- Environment string `yaml:"environment" json:"environment,omitempty" property:"environment"`
- // the metadata type. remote or local
- MetadataType string `default:"local" yaml:"metadata-type" json:"metadataType,omitempty" property:"metadataType"`
- Tag string `yaml:"tag" json:"tag,omitempty" property:"tag"`
- MetadataServicePort string `yaml:"metadata-service-port" json:"metadata-service-port,omitempty" property:"metadata-service-port"`
- MetadataServiceProtocol string `yaml:"metadata-service-protocol" json:"metadata-service-protocol,omitempty" property:"metadata-service-protocol"`
-}
-
-// Prefix dubbo.application
-func (ac *ApplicationConfig) Prefix() string {
- return constant.ApplicationConfigPrefix
-}
-
-// Init application config and set default value
-func (ac *ApplicationConfig) Init() error {
- if ac == nil {
- return errors.New("application is null")
- }
- if err := ac.check(); err != nil {
- return err
- }
- if ac.Name == "" {
- ac.Name = constant.DefaultDubboApp
- }
- return nil
-}
-
-func (ac *ApplicationConfig) check() error {
- if err := defaults.Set(ac); err != nil {
- return err
- }
- return verify(ac)
-}
-
-func NewApplicationConfigBuilder() *ApplicationConfigBuilder {
- return &ApplicationConfigBuilder{application: &ApplicationConfig{}}
-}
-
-type ApplicationConfigBuilder struct {
- application *ApplicationConfig
-}
-
-func (acb *ApplicationConfigBuilder) SetOrganization(organization string) *ApplicationConfigBuilder {
- acb.application.Organization = organization
- return acb
-}
-
-func (acb *ApplicationConfigBuilder) SetName(name string) *ApplicationConfigBuilder {
- acb.application.Name = name
- return acb
-}
-
-func (acb *ApplicationConfigBuilder) SetModule(module string) *ApplicationConfigBuilder {
- acb.application.Module = module
- return acb
-}
-
-func (acb *ApplicationConfigBuilder) SetVersion(version string) *ApplicationConfigBuilder {
- acb.application.Version = version
- return acb
-}
-
-func (acb *ApplicationConfigBuilder) SetOwner(owner string) *ApplicationConfigBuilder {
- acb.application.Owner = owner
- return acb
-}
-
-func (acb *ApplicationConfigBuilder) SetEnvironment(environment string) *ApplicationConfigBuilder {
- acb.application.Environment = environment
- return acb
-}
-
-func (acb *ApplicationConfigBuilder) SetMetadataType(metadataType string) *ApplicationConfigBuilder {
- acb.application.MetadataType = metadataType
- return acb
-}
-
-func (acb *ApplicationConfigBuilder) SetMetadataServicePort(port int) *ApplicationConfigBuilder {
- acb.application.MetadataServicePort = strconv.Itoa(port)
- return acb
-}
-
-func (acb *ApplicationConfigBuilder) SetMetadataServiceProtocol(protocol string) *ApplicationConfigBuilder {
- acb.application.MetadataServiceProtocol = protocol
- return acb
-}
-
-func (acb *ApplicationConfigBuilder) Build() *ApplicationConfig {
- return acb.application
-}
diff --git a/config/application_config_test.go b/config/application_config_test.go
deleted file mode 100644
index adbc51b8a..000000000
--- a/config/application_config_test.go
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- _ "dubbo.apache.org/dubbo-go/v3/metadata/report/nacos"
-)
-
-func TestApplicationConfig(t *testing.T) {
-
- err := Load(WithPath("./testdata/config/application/application.yaml"))
- require.NoError(t, err)
-
- center := GetRootConfig().Registries
- assert.NotNil(t, center)
-}
-
-func TestApplicationConfigBuilder(t *testing.T) {
-
- application := NewApplicationConfigBuilder().
- SetOrganization("organization").
- SetName("name").
- SetModule("module").
- SetVersion("version").
- SetOwner("owner").
- SetEnvironment("environment").
- SetMetadataType("metadataType").
- Build()
-
- err := application.check()
- require.NoError(t, err)
- err = application.Init()
-
- require.NoError(t, err)
- assert.Equal(t, "name", application.Name)
- assert.Equal(t, "organization", application.Organization)
- assert.Equal(t, "module", application.Module)
- assert.Equal(t, "version", application.Version)
- assert.Equal(t, "owner", application.Owner)
- assert.Equal(t, "environment", application.Environment)
- assert.Equal(t, "metadataType", application.MetadataType)
- assert.Equal(t, constant.ApplicationConfigPrefix, application.Prefix())
-}
diff --git a/config/client_protocol_config.go b/config/client_protocol_config.go
deleted file mode 100644
index e801a0f78..000000000
--- a/config/client_protocol_config.go
+++ /dev/null
@@ -1,26 +0,0 @@
-/*
- * 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
-
-// ClientProtocolConfig represents the config of client's protocol
-type ClientProtocolConfig struct {
- // TODO: maybe we could use this field
- Name string `yaml:"name" json:"name,omitempty" property:"name"`
-
- TripleConfig *TripleConfig `yaml:"triple" json:"triple,omitempty" property:"triple"`
-}
diff --git a/config/config_center_config.go b/config/config_center_config.go
deleted file mode 100644
index 0c82a97db..000000000
--- a/config/config_center_config.go
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * 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
-
-import (
- "net/url"
- "strings"
-)
-
-import (
- "github.com/creasty/defaults"
-
- "github.com/dubbogo/gost/log/logger"
-
- "github.com/knadh/koanf"
-
- "github.com/pkg/errors"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
- conf "dubbo.apache.org/dubbo-go/v3/common/config"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/common/extension"
- "dubbo.apache.org/dubbo-go/v3/config_center"
- "dubbo.apache.org/dubbo-go/v3/metrics"
- metricsConfigCenter "dubbo.apache.org/dubbo-go/v3/metrics/config_center"
- "dubbo.apache.org/dubbo-go/v3/remoting"
-)
-
-// CenterConfig is configuration for config center
-//
-// ConfigCenter also introduced concepts of namespace and group to better manage Key-Value pairs by group,
-// those configs are already built-in in many professional third-party configuration centers.
-// In most cases, namespace is used to isolate different tenants, while group is used to divide the key set from one tenant into groups.
-//
-// CenterConfig has currently supported Zookeeper, Nacos, Etcd, Consul, Apollo
-type CenterConfig struct {
- Protocol string `validate:"required" yaml:"protocol" json:"protocol,omitempty"`
- Address string `validate:"required" yaml:"address" json:"address,omitempty"`
- DataId string `yaml:"data-id" json:"data-id,omitempty"`
- Cluster string `yaml:"cluster" json:"cluster,omitempty"`
- Group string `yaml:"group" json:"group,omitempty"`
- Username string `yaml:"username" json:"username,omitempty"`
- Password string `yaml:"password" json:"password,omitempty"`
- Namespace string `yaml:"namespace" json:"namespace,omitempty"`
- AppID string `default:"dubbo" yaml:"app-id" json:"app-id,omitempty"`
- Timeout string `default:"10s" yaml:"timeout" json:"timeout,omitempty"`
- Params map[string]string `yaml:"params" json:"parameters,omitempty"`
-
- //FileExtension the suffix of config dataId, also the file extension of config content
- FileExtension string `default:"yaml" yaml:"file-extension" json:"file-extension" `
-}
-
-// Prefix dubbo.config-center
-func (CenterConfig) Prefix() string {
- return constant.ConfigCenterPrefix
-}
-
-func (c *CenterConfig) check() error {
- if err := defaults.Set(c); err != nil {
- return err
- }
- c.translateConfigAddress()
- return verify(c)
-}
-
-func (c *CenterConfig) Init(rc *RootConfig) error {
- if c == nil {
- return nil
- }
- if err := c.check(); err != nil {
- return err
- }
- return startConfigCenter(rc)
-}
-
-// GetUrlMap gets url map from ConfigCenterConfig
-func (c *CenterConfig) GetUrlMap() url.Values {
- urlMap := url.Values{}
- urlMap.Set(constant.ConfigNamespaceKey, c.Namespace)
- urlMap.Set(constant.ConfigGroupKey, c.Group)
- urlMap.Set(constant.ConfigClusterKey, c.Cluster)
- urlMap.Set(constant.ConfigAppIDKey, c.AppID)
- urlMap.Set(constant.ConfigTimeoutKey, c.Timeout)
- urlMap.Set(constant.ClientNameKey, clientNameID(c, c.Protocol, c.Address))
-
- for key, val := range c.Params {
- urlMap.Set(key, val)
- }
- return urlMap
-}
-
-// translateConfigAddress translate config address
-//
-// eg:address=nacos://127.0.0.1:8848 will return 127.0.0.1:8848 and protocol will set nacos
-func (c *CenterConfig) translateConfigAddress() string {
- if strings.Contains(c.Address, "://") {
- translatedUrl, err := url.Parse(c.Address)
- if err != nil {
- logger.Errorf("The config address:%s is invalid, error: %#v", c.Address, err)
- panic(err)
- }
- c.Protocol = translatedUrl.Scheme
- c.Address = strings.ReplaceAll(c.Address, translatedUrl.Scheme+"://", "")
- }
- return c.Address
-}
-
-// toURL will compatible with baseConfig.ShutdownConfig.Address and baseConfig.ShutdownConfig.RemoteRef before 1.6.0
-// After 1.6.0 will not compatible, only baseConfig.ShutdownConfig.RemoteRef
-func (c *CenterConfig) toURL() (*common.URL, error) {
- return common.NewURL(c.Address,
- common.WithProtocol(c.Protocol),
- common.WithParams(c.GetUrlMap()),
- common.WithUsername(c.Username),
- common.WithPassword(c.Password),
- )
-
-}
-
-// startConfigCenter will start the config center.
-// it will prepare the environment
-func startConfigCenter(rc *RootConfig) error {
- cc := rc.ConfigCenter
- dynamicConfig, err := cc.GetDynamicConfiguration()
- if err != nil {
- logger.Errorf("[Config Center] Start dynamic configuration center error, error message is %v", err)
- return err
- }
-
- strConf, err := dynamicConfig.GetProperties(cc.DataId, config_center.WithGroup(cc.Group))
- if err != nil {
- logger.Warnf("[Config Center] Dynamic config center has started, but config may not be initialized, because: %s", err)
- return nil
- }
- defer metrics.Publish(metricsConfigCenter.NewIncMetricEvent(cc.DataId, cc.Group, remoting.EventTypeAdd, cc.Protocol))
- if len(strConf) == 0 {
- logger.Warnf("[Config Center] Dynamic config center has started, but got empty config with config-center configuration %+v\n"+
- "Please check if your config-center config is correct.", cc)
- return nil
- }
- config := NewLoaderConf(WithDelim("."), WithGenre(cc.FileExtension), WithBytes([]byte(strConf)))
- koan := GetConfigResolver(config)
- if err = koan.UnmarshalWithConf(rc.Prefix(), rc, koanf.UnmarshalConf{Tag: "yaml"}); err != nil {
- return err
- }
-
- dynamicConfig.AddListener(cc.DataId, rc, config_center.WithGroup(cc.Group))
- return nil
-}
-
-func (c *CenterConfig) CreateDynamicConfiguration() (config_center.DynamicConfiguration, error) {
- configCenterUrl, err := c.toURL()
- if err != nil {
- return nil, err
- }
- factory, err := extension.GetConfigCenterFactory(configCenterUrl.Protocol)
- if err != nil {
- return nil, err
- }
- return factory.GetDynamicConfiguration(configCenterUrl)
-}
-
-func (c *CenterConfig) GetDynamicConfiguration() (config_center.DynamicConfiguration, error) {
- envInstance := conf.GetEnvInstance()
- if envInstance.GetDynamicConfiguration() != nil {
- return envInstance.GetDynamicConfiguration(), nil
- }
- dynamicConfig, err := c.CreateDynamicConfiguration()
- if err != nil {
- return nil, errors.WithStack(err)
- }
- envInstance.SetDynamicConfiguration(dynamicConfig)
- return dynamicConfig, nil
-}
-
-func NewConfigCenterConfigBuilder() *ConfigCenterConfigBuilder {
- return &ConfigCenterConfigBuilder{configCenterConfig: newEmptyConfigCenterConfig()}
-}
-
-type ConfigCenterConfigBuilder struct {
- configCenterConfig *CenterConfig
-}
-
-func (ccb *ConfigCenterConfigBuilder) SetProtocol(protocol string) *ConfigCenterConfigBuilder {
- ccb.configCenterConfig.Protocol = protocol
- return ccb
-}
-
-func (ccb *ConfigCenterConfigBuilder) SetUserName(userName string) *ConfigCenterConfigBuilder {
- ccb.configCenterConfig.Username = userName
- return ccb
-}
-
-func (ccb *ConfigCenterConfigBuilder) SetAddress(address string) *ConfigCenterConfigBuilder {
- ccb.configCenterConfig.Address = address
- return ccb
-}
-
-func (ccb *ConfigCenterConfigBuilder) SetPassword(password string) *ConfigCenterConfigBuilder {
- ccb.configCenterConfig.Password = password
- return ccb
-}
-
-func (ccb *ConfigCenterConfigBuilder) SetNamespace(namespace string) *ConfigCenterConfigBuilder {
- ccb.configCenterConfig.Namespace = namespace
- return ccb
-}
-
-func (ccb *ConfigCenterConfigBuilder) SetDataID(dataID string) *ConfigCenterConfigBuilder {
- ccb.configCenterConfig.DataId = dataID
- return ccb
-}
-
-func (ccb *ConfigCenterConfigBuilder) SetGroup(group string) *ConfigCenterConfigBuilder {
- ccb.configCenterConfig.Group = group
- return ccb
-}
-
-func (ccb *ConfigCenterConfigBuilder) Build() *CenterConfig {
- return ccb.configCenterConfig
-}
-
-func newEmptyConfigCenterConfig() *CenterConfig {
- return &CenterConfig{
- Params: make(map[string]string),
- }
-}
diff --git a/config/config_loader.go b/config/config_loader.go
deleted file mode 100644
index c232cc894..000000000
--- a/config/config_loader.go
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * 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
-
-import (
- "errors"
- "sync/atomic"
-)
-
-import (
- gostLogger "github.com/dubbogo/gost/log/logger"
-
- "github.com/knadh/koanf"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
- dubboLogger "dubbo.apache.org/dubbo-go/v3/logger"
- _ "dubbo.apache.org/dubbo-go/v3/logger/core/logrus"
- "dubbo.apache.org/dubbo-go/v3/logger/core/zap"
-)
-
-var (
- rootConfigStore = func() *atomic.Pointer[RootConfig] {
- store := &atomic.Pointer[RootConfig]{}
- store.Store(NewRootConfigBuilder().Build())
- return store
- }()
-)
-
-func setRootConfigInternal(rc *RootConfig) {
- rootConfigStore.Store(rc)
-}
-
-func init() {
- log := zap.NewDefault()
- dubboLogger.SetLogger(log)
- gostLogger.SetLogger(log)
-}
-
-func Load(opts ...LoaderConfOption) error {
- // conf
- conf := NewLoaderConf(opts...)
- loadConfig := conf.rc
-
- if conf.rc == nil {
- loadConfig = NewRootConfigBuilder().Build()
- koan := GetConfigResolver(conf)
- koan = conf.MergeConfig(koan)
- if err := koan.UnmarshalWithConf(loadConfig.Prefix(),
- loadConfig, koanf.UnmarshalConf{Tag: "yaml"}); err != nil {
- return err
- }
- }
-
- if err := loadConfig.Init(); err != nil {
- return err
- }
- return nil
-}
-
-func check() error {
- if GetRootConfig() == nil {
- return errors.New("execute the config.Load() method first")
- }
- return nil
-}
-
-// GetRPCService get rpc service for consumer
-func GetRPCService(name string) common.RPCService {
- return GetRootConfig().Consumer.References[name].GetRPCService()
-}
-
-// RPCService create rpc service for consumer
-func RPCService(service common.RPCService) {
- ref := common.GetReference(service)
- GetRootConfig().Consumer.References[ref].Implement(service)
-}
-
-// GetMetricConfig find the MetricsConfig
-// if it is nil, create a new one
-// we use double-check to reduce race condition
-// In general, it will be locked 0 or 1 time.
-// So you don't need to worry about the race condition
-func GetMetricConfig() *MetricsConfig {
- // todo
- //if GetBaseConfig().Metrics == nil {
- // configAccessMutex.Lock()
- // defer configAccessMutex.Unlock()
- // if GetBaseConfig().Metrics == nil {
- // GetBaseConfig().Metrics = &metric.Metrics{}
- // }
- //}
- //return GetBaseConfig().Metrics
- return GetRootConfig().Metrics
-}
-
-func GetTracingConfig(tracingKey string) *TracingConfig {
- return GetRootConfig().Tracing[tracingKey]
-}
-
-func GetMetadataReportConfg() *MetadataReportConfig {
- return GetRootConfig().MetadataReport
-}
-
-func IsProvider() bool {
- return len(GetRootConfig().Provider.Services) > 0
-}
diff --git a/config/config_loader_options.go b/config/config_loader_options.go
deleted file mode 100644
index 4f2899baf..000000000
--- a/config/config_loader_options.go
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * 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
-
-import (
- "os"
- "path/filepath"
- "runtime"
- "strings"
-)
-
-import (
- "github.com/dubbogo/gost/log/logger"
-
- "github.com/knadh/koanf"
-
- "github.com/pkg/errors"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/common/constant/file"
-)
-
-type loaderConf struct {
- suffix string // loaderConf file extension default yaml
- path string // loaderConf file path default ./conf/dubbogo.yaml
- delim string // loaderConf file delim default .
- bytes []byte // config bytes
- rc *RootConfig // user provide rootConfig built by config api
- name string // config file name
-}
-
-func NewLoaderConf(opts ...LoaderConfOption) *loaderConf {
- configFilePath := "../conf/dubbogo.yaml"
- if configFilePathFromEnv := os.Getenv(constant.ConfigFileEnvKey); configFilePathFromEnv != "" {
- configFilePath = configFilePathFromEnv
- }
- name, suffix := resolverFilePath(configFilePath)
- conf := &loaderConf{
- suffix: suffix,
- path: absolutePath(configFilePath),
- delim: ".",
- name: name,
- }
- for _, opt := range opts {
- opt.apply(conf)
- }
- if conf.rc != nil {
- return conf
- }
- if len(conf.bytes) <= 0 {
- if bytes, err := os.ReadFile(conf.path); err != nil {
- panic(err)
- } else {
- conf.bytes = bytes
- }
- }
- return conf
-}
-
-type LoaderConfOption interface {
- apply(vc *loaderConf)
-}
-
-type loaderConfigFunc func(*loaderConf)
-
-func (fn loaderConfigFunc) apply(vc *loaderConf) {
- fn(vc)
-}
-
-// WithGenre set load config file suffix
-// Deprecated: replaced by WithSuffix
-func WithGenre(suffix string) LoaderConfOption {
- return loaderConfigFunc(func(conf *loaderConf) {
- g := strings.ToLower(suffix)
- if err := checkFileSuffix(g); err != nil {
- panic(err)
- }
- conf.suffix = g
- })
-}
-
-// WithSuffix set load config file suffix
-func WithSuffix(suffix file.Suffix) LoaderConfOption {
- return loaderConfigFunc(func(conf *loaderConf) {
- conf.suffix = string(suffix)
- })
-}
-
-// WithPath set load config path
-func WithPath(path string) LoaderConfOption {
- return loaderConfigFunc(func(conf *loaderConf) {
- conf.path = absolutePath(path)
- if bytes, err := os.ReadFile(conf.path); err != nil {
- panic(err)
- } else {
- conf.bytes = bytes
- }
- name, suffix := resolverFilePath(path)
- conf.suffix = suffix
- conf.name = name
- })
-}
-
-func WithRootConfig(rc *RootConfig) LoaderConfOption {
- return loaderConfigFunc(func(conf *loaderConf) {
- conf.rc = rc
- })
-}
-
-func WithDelim(delim string) LoaderConfOption {
- return loaderConfigFunc(func(conf *loaderConf) {
- conf.delim = delim
- })
-}
-
-// WithBytes set load config bytes
-func WithBytes(bytes []byte) LoaderConfOption {
- return loaderConfigFunc(func(conf *loaderConf) {
- conf.bytes = bytes
- })
-}
-
-// absolutePath get absolut path
-func absolutePath(inPath string) string {
-
- if inPath == "$HOME" || strings.HasPrefix(inPath, "$HOME"+string(os.PathSeparator)) {
- inPath = userHomeDir() + inPath[5:]
- }
-
- if filepath.IsAbs(inPath) {
- return filepath.Clean(inPath)
- }
-
- p, err := filepath.Abs(inPath)
- if err == nil {
- return filepath.Clean(p)
- }
-
- return ""
-}
-
-// userHomeDir get gopath
-func userHomeDir() string {
- if runtime.GOOS == "windows" {
- home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
- if home == "" {
- home = os.Getenv("USERPROFILE")
- }
- return home
- }
- return os.Getenv("HOME")
-}
-
-// checkFileSuffix check file suffix
-func checkFileSuffix(suffix string) error {
- for _, g := range []string{"json", "toml", "yaml", "yml", "properties"} {
- if g == suffix {
- return nil
- }
- }
- return errors.Errorf("no support file suffix: %s", suffix)
-}
-
-// resolverFilePath resolver file path
-// eg: give a ./conf/dubbogo.yaml return dubbogo and yaml
-func resolverFilePath(path string) (name, suffix string) {
- paths := strings.Split(path, "/")
- fileName := strings.Split(paths[len(paths)-1], ".")
- if len(fileName) < 2 {
- return fileName[0], string(file.YAML)
- }
- return fileName[0], fileName[1]
-}
-
-// MergeConfig merge config file
-func (conf *loaderConf) MergeConfig(koan *koanf.Koanf) *koanf.Koanf {
- var (
- activeKoan *koanf.Koanf
- activeConf *loaderConf
- )
- active := koan.String("dubbo.profiles.active")
- active = getLegalActive(active)
- logger.Infof("The following profiles are active: %s", active)
- if defaultActive != active {
- path := conf.getActiveFilePath(active)
- if !pathExists(path) {
- logger.Debugf("Config file:%s not exist skip config merge", path)
- return koan
- }
- activeConf = NewLoaderConf(WithPath(path))
- activeKoan = GetConfigResolver(activeConf)
- if err := koan.Merge(activeKoan); err != nil {
- logger.Debugf("Config merge err %s", err)
- }
- }
- return koan
-}
-
-func (conf *loaderConf) getActiveFilePath(active string) string {
- suffix := constant.DotSeparator + conf.suffix
- return strings.ReplaceAll(conf.path, suffix, "") + "-" + active + suffix
-}
-
-func pathExists(path string) bool {
- if _, err := os.Stat(path); err == nil {
- return true
- } else {
- return !os.IsNotExist(err)
- }
-}
diff --git a/config/config_loader_options_test.go b/config/config_loader_options_test.go
deleted file mode 100644
index 501579c2e..000000000
--- a/config/config_loader_options_test.go
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * 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
-
-import (
- "strings"
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant/file"
-)
-
-func TestCheckGenre(t *testing.T) {
-
- err := checkFileSuffix("abc")
- require.Error(t, err)
-
- err = checkFileSuffix("zc")
- require.Error(t, err)
-
- err = checkFileSuffix("json")
- assert.NoError(t, err)
-}
-
-func TestFileGenre(t *testing.T) {
- conf := NewLoaderConf(WithPath("../config/testdata/config/properties/application.properties"))
- assert.Equal(t, "properties", conf.suffix)
-}
-
-func TestRootConfig(t *testing.T) {
- rc := NewRootConfigBuilder().SetApplication(NewApplicationConfigBuilder().SetName("test-app").Build()).Build()
- conf := NewLoaderConf(WithRootConfig(rc))
- assert.Equal(t, "test-app", conf.rc.Application.Name)
-}
-
-func TestNewLoaderConf_WithBytes(t *testing.T) {
- str := `dubbo.application.name=dubbo-go
-dubbo.application.module=local
-dubbo.services.HelloService.registry=nacos,zk`
-
- conf := NewLoaderConf(WithBytes([]byte(str)), WithGenre("properties"))
-
- assert.NotNil(t, conf)
- assert.NotEmpty(t, conf.bytes)
-}
-
-func TestNewLoaderConf_WithSuffix(t *testing.T) {
- conf := NewLoaderConf(
- WithSuffix(file.JSON),
- WithPath("../config/testdata/config/properties/application.properties"),
- )
-
- assert.Equal(t, conf.suffix, string(file.PROPERTIES))
-}
-
-func TestResolverFilePath(t *testing.T) {
- name, suffix := resolverFilePath("../config/application.properties")
- assert.Equal(t, "application", name)
- assert.Equal(t, "properties", suffix)
-}
-
-func TestResolverFilePath_Illegal_Path(t *testing.T) {
- name, suffix := resolverFilePath("application.properties")
- assert.Equal(t, "application", name)
- assert.Equal(t, "properties", suffix)
-}
-
-func TestResolverFilePath_Illegal_Path_Name(t *testing.T) {
- name, suffix := resolverFilePath("application")
- assert.Equal(t, "application", name)
- assert.Equal(t, suffix, string(file.YAML))
-}
-
-func Test_getActiveFilePath(t *testing.T) {
- conf := NewLoaderConf(
- WithSuffix(file.JSON),
- WithPath("../config/testdata/config/properties/application.properties"),
- )
-
- filePath := conf.getActiveFilePath("dev")
-
- assert.True(t, strings.HasSuffix(filePath, "application-dev.properties"))
-
- exists := pathExists(filePath)
- assert.False(t, exists)
- exists = pathExists("application.properties")
- assert.False(t, exists)
-
-}
diff --git a/config/config_resolver.go b/config/config_resolver.go
deleted file mode 100644
index 7da6485b6..000000000
--- a/config/config_resolver.go
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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
-
-import (
- "strings"
-)
-
-import (
- log "github.com/dubbogo/gost/log/logger"
-
- "github.com/knadh/koanf"
- "github.com/knadh/koanf/parsers/json"
- "github.com/knadh/koanf/parsers/yaml"
- "github.com/knadh/koanf/providers/confmap"
- "github.com/knadh/koanf/providers/rawbytes"
-
- "github.com/pkg/errors"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant/file"
-)
-
-// GetConfigResolver get config resolver
-func GetConfigResolver(conf *loaderConf) *koanf.Koanf {
- var (
- k *koanf.Koanf
- err error
- )
- if len(conf.suffix) <= 0 {
- conf.suffix = string(file.YAML)
- }
- if len(conf.delim) <= 0 {
- conf.delim = "."
- }
- bytes := conf.bytes
- if len(bytes) <= 0 {
- panic(errors.New("bytes is nil,please set bytes or file path"))
- }
- k = koanf.New(conf.delim)
-
- switch conf.suffix {
- case "yaml", "yml":
- err = k.Load(rawbytes.Provider(bytes), yaml.Parser())
- case "json":
- err = k.Load(rawbytes.Provider(bytes), json.Parser())
- default:
- err = errors.Errorf("no support %s file suffix", conf.suffix)
- }
-
- if err != nil {
- panic(err)
- }
- return resolvePlaceholder(k)
-}
-
-// resolvePlaceholder replace ${xx} with real value
-func resolvePlaceholder(resolver *koanf.Koanf) *koanf.Koanf {
- m := make(map[string]any)
- for k, v := range resolver.All() {
- s, ok := v.(string)
- if !ok {
- continue
- }
- newKey, defaultValue := checkPlaceholder(s)
- if newKey == "" {
- continue
- }
- m[k] = resolver.Get(newKey)
- if m[k] == nil {
- m[k] = defaultValue
- }
- }
- err := resolver.Load(confmap.Provider(m, resolver.Delim()), nil)
- if err != nil {
- log.Errorf("resolvePlaceholder error %s", err)
- }
- return resolver
-}
-
-func checkPlaceholder(s string) (newKey, defaultValue string) {
- s = strings.TrimSpace(s)
- if !strings.HasPrefix(s, file.PlaceholderPrefix) || !strings.HasSuffix(s, file.PlaceholderSuffix) {
- return
- }
- s = s[len(file.PlaceholderPrefix) : len(s)-len(file.PlaceholderSuffix)]
- indexColon := strings.Index(s, ":")
- if indexColon == -1 {
- newKey = strings.TrimSpace(s)
- return
- }
- newKey = strings.TrimSpace(s[0:indexColon])
- defaultValue = strings.TrimSpace(s[indexColon+1:])
-
- return
-}
diff --git a/config/config_resolver_test.go b/config/config_resolver_test.go
deleted file mode 100644
index 2f5a0823a..000000000
--- a/config/config_resolver_test.go
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
-)
-
-import (
- "github.com/knadh/koanf"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-func TestResolvePlaceHolder(t *testing.T) {
- t.Run("test resolver", func(t *testing.T) {
- conf := NewLoaderConf(WithPath("./testdata/config/resolver/application.yaml"))
- koan := GetConfigResolver(conf)
- assert.Equal(t, koan.Get("dubbo.config-center.address"), koan.Get("dubbo.registries.nacos.address"))
- assert.Equal(t, koan.Get("localhost"), koan.Get("dubbo.protocols.dubbo.ip"))
- assert.Empty(t, koan.Get("dubbo.registries.nacos.group"))
- assert.Equal(t, "dev", koan.Get("dubbo.registries.zk.group"))
-
- rc := NewRootConfigBuilder().Build()
- err := koan.UnmarshalWithConf(rc.Prefix(), rc, koanf.UnmarshalConf{Tag: "yaml"})
- require.NoError(t, err)
- assert.Equal(t, rc.ConfigCenter.Address, rc.Registries["nacos"].Address)
- //not exist, default
- assert.Empty(t, rc.Registries["nacos"].Group)
- assert.Equal(t, "dev", rc.Registries["zk"].Group)
-
- })
-}
diff --git a/config/config_setter.go b/config/config_setter.go
deleted file mode 100644
index c92a2af2a..000000000
--- a/config/config_setter.go
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * 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
-
-type Setter interface {
- Set(name string, config any)
-}
diff --git a/config/config_utils.go b/config/config_utils.go
deleted file mode 100644
index 8a3c8a60f..000000000
--- a/config/config_utils.go
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * 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
-
-import (
- "fmt"
- "regexp"
- "strings"
-)
-
-import (
- "github.com/go-playground/validator/v10"
-
- "github.com/pkg/errors"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/common/extension"
-)
-
-var validate *validator.Validate
-
-func init() {
- validate = validator.New()
-}
-
-func mergeValue(str1, str2, def string) string {
- if str1 == "" && str2 == "" {
- return def
- }
- s1 := strings.Split(str1, ",")
- s2 := strings.Split(str2, ",")
- str := "," + strings.Join(append(s1, s2...), ",")
- defKey := strings.Contains(str, ","+constant.DefaultKey)
- if !defKey {
- str = "," + constant.DefaultKey + str
- }
- str = strings.TrimPrefix(strings.ReplaceAll(str, ","+constant.DefaultKey, ","+def), ",")
- return removeMinus(strings.Split(str, ","))
-}
-
-func removeMinus(strArr []string) string {
- if len(strArr) == 0 {
- return ""
- }
- var normalStr string
- var minusStrArr []string
- for _, v := range strArr {
- if strings.HasPrefix(v, "-") {
- minusStrArr = append(minusStrArr, v[1:])
- } else {
- normalStr += fmt.Sprintf(",%s", v)
- }
- }
- normalStr = strings.Trim(normalStr, ",")
- for _, v := range minusStrArr {
- normalStr = strings.Replace(normalStr, v, "", 1)
- }
- reg := regexp.MustCompile("[,]+")
- normalStr = reg.ReplaceAllString(strings.Trim(normalStr, ","), ",")
- return normalStr
-}
-
-// removeDuplicateElement remove duplicate element
-func removeDuplicateElement(items []string) []string {
- result := make([]string, 0, len(items))
- temp := map[string]struct{}{}
- for _, item := range items {
- if _, ok := temp[item]; !ok && item != "" {
- temp[item] = struct{}{}
- result = append(result, item)
- }
- }
- return result
-}
-
-// translateIds string "nacos,zk" => ["nacos","zk"]
-func translateIds(registryIds []string) []string {
- ids := make([]string, 0)
- for _, id := range registryIds {
-
- ids = append(ids, strings.Split(id, ",")...)
- }
- return removeDuplicateElement(ids)
-}
-
-func verify(s any) error {
- if err := validate.Struct(s); err != nil {
- errs := err.(validator.ValidationErrors)
- var slice []string
- for _, msg := range errs {
- slice = append(slice, msg.Error())
- }
- return errors.New(strings.Join(slice, ","))
- }
- return nil
-}
-
-// clientNameID unique identifier id for client
-func clientNameID(config extension.Config, protocol, address string) string {
- return strings.Join([]string{config.Prefix(), protocol, address}, "-")
-}
-
-func isValid(addr string) bool {
- return addr != "" && addr != constant.NotAvailable
-}
diff --git a/config/config_utils_test.go b/config/config_utils_test.go
deleted file mode 100644
index 184d7be76..000000000
--- a/config/config_utils_test.go
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
-)
-
-func TestMergeValue(t *testing.T) {
- str := mergeValue("", "", "a,b")
- assert.Equal(t, "a,b", str)
-
- str = mergeValue("c,d", "e,f", "a,b")
- assert.Equal(t, "a,b,c,d,e,f", str)
-
- str = mergeValue("c,d", "e,d,f", "a,b")
- assert.Equal(t, "a,b,c,d,e,d,f", str)
-
- str = mergeValue("c,default,d", "-c,-a,e,f", "a,b")
- assert.Equal(t, "b,d,e,f", str)
-
- str = mergeValue("", "default,-b,e,f", "a,b")
- assert.Equal(t, "a,e,f", str)
-}
-
-func TestRemoveMinus(t *testing.T) {
- strList := removeMinus([]string{})
- assert.Empty(t, strList)
-
- strList = removeMinus([]string{"a", "b", "c", "d", "-a"})
- assert.Equal(t, "b,c,d", strList)
-
- strList = removeMinus([]string{"a", "b", "c", "d", "-a", "-b"})
- assert.Equal(t, "c,d", strList)
-
- strList = removeMinus([]string{"a", "b", "c", "-c", "-a", "-b"})
- assert.Empty(t, strList)
-
- strList = removeMinus([]string{"b", "a", "-c", "c"})
- assert.Equal(t, "b,a", strList)
-
- strList = removeMinus([]string{"c", "b", "a", "d", "c", "-c", "-a", "e", "f"})
- assert.Equal(t, "b,d,c,e,f", strList)
-}
-
-type mockConfig struct {
- protocol string
- address string
-}
-
-func (m *mockConfig) Prefix() string {
- return "mock"
-}
-
-func TestClientNameID(t *testing.T) {
- t.Run("normal", func(t *testing.T) {
- m := &mockConfig{"nacos", "127.0.0.1:8848"}
- assert.Equal(t, "mock-nacos-127.0.0.1:8848", clientNameID(m, m.protocol, m.address))
- })
- t.Run("protocolIsNil", func(t *testing.T) {
- m := &mockConfig{}
- assert.Equal(t, "mock--", clientNameID(m, m.protocol, m.address))
- })
-}
diff --git a/config/consumer_config.go b/config/consumer_config.go
deleted file mode 100644
index e7902cf8d..000000000
--- a/config/consumer_config.go
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * 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
-
-import (
- "fmt"
- "strings"
- "time"
-)
-
-import (
- "github.com/creasty/defaults"
-
- "github.com/dubbogo/gost/log/logger"
-
- tripleConstant "github.com/dubbogo/triple/pkg/common/constant"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-// ConsumerConfig is Consumer default configuration
-type ConsumerConfig struct {
- Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"`
- RegistryIDs []string `yaml:"registry-ids" json:"registry-ids,omitempty" property:"registry-ids"`
- Protocol string `yaml:"protocol" json:"protocol,omitempty" property:"protocol"`
- RequestTimeout string `default:"3s" yaml:"request-timeout" json:"request-timeout,omitempty" property:"request-timeout"`
- ProxyFactory string `default:"default" yaml:"proxy" json:"proxy,omitempty" property:"proxy"`
- Check bool `yaml:"check" json:"check,omitempty" property:"check"`
- AdaptiveService bool `default:"false" yaml:"adaptive-service" json:"adaptive-service" property:"adaptive-service"`
- References map[string]*ReferenceConfig `yaml:"references" json:"references,omitempty" property:"references"`
- TracingKey string `yaml:"tracing-key" json:"tracing-key" property:"tracing-key"`
- FilterConf any `yaml:"filter-conf" json:"filter-conf,omitempty" property:"filter-conf"`
- MaxWaitTimeForServiceDiscovery string `default:"3s" yaml:"max-wait-time-for-service-discovery" json:"max-wait-time-for-service-discovery,omitempty" property:"max-wait-time-for-service-discovery"`
- MeshEnabled bool `yaml:"mesh-enabled" json:"mesh-enabled,omitempty" property:"mesh-enabled"`
- rootConfig *RootConfig
-}
-
-// Prefix dubbo.consumer
-func (ConsumerConfig) Prefix() string {
- return constant.ConsumerConfigPrefix
-}
-
-func (cc *ConsumerConfig) Init(rc *RootConfig) error {
- if cc == nil {
- return nil
- }
-
- buildDebugMsg := func() string {
- if len(cc.References) == 0 {
- return "empty"
- }
- consumerNames := make([]string, 0, len(cc.References))
- for k := range cc.References {
- consumerNames = append(consumerNames, k)
- }
- return strings.Join(consumerNames, ", ")
- }
- logger.Debugf("Registered consumer clients are %v", buildDebugMsg())
-
- cc.RegistryIDs = translateIds(cc.RegistryIDs)
- if len(cc.RegistryIDs) <= 0 {
- cc.RegistryIDs = rc.getRegistryIds()
- }
- if cc.TracingKey == "" && len(rc.Tracing) > 0 {
- for k := range rc.Tracing {
- cc.TracingKey = k
- break
- }
- }
- for key, referenceConfig := range cc.References {
- if referenceConfig.InterfaceName == "" {
- reference := GetConsumerService(key)
- // try to use interface name defined by pb
- triplePBService, ok := reference.(common.TriplePBService)
- if !ok {
- logger.Errorf("Dubbo-go cannot get interface name with reference = %s."+
- "Please run the command 'go install github.com/dubbogo/dubbogo-cli/cmd/protoc-gen-go-triple@latest' to get the latest "+
- "protoc-gen-go-triple, and then re-generate your pb file again by this tool."+
- "If you are not using pb serialization, please set 'interfaceName' field in reference config to let dubbogo get the interface name.", key)
- continue
- } else {
- // use interface name defined by pb
- referenceConfig.InterfaceName = triplePBService.XXX_InterfaceName()
- }
- }
- if err := referenceConfig.Init(rc); err != nil {
- return err
- }
- }
- if err := defaults.Set(cc); err != nil {
- return err
- }
- if err := verify(cc); err != nil {
- return err
- }
-
- cc.rootConfig = rc
- return nil
-}
-
-func (cc *ConsumerConfig) Load() {
- for registeredTypeName, refRPCService := range GetConsumerServiceMap() {
- refConfig, ok := cc.References[registeredTypeName]
- if !ok {
- // not found configuration, now new a configuration with default.
- refConfig = NewReferenceConfigBuilder().SetProtocol(tripleConstant.TRIPLE).Build()
- triplePBService, ok := refRPCService.(common.TriplePBService)
- if !ok {
- logger.Errorf("Dubbo-go cannot get interface name with registeredTypeName = %s."+
- "Please run the command 'go install github.com/dubbogo/dubbogo-cli/cmd/protoc-gen-go-triple@latest' to get the latest "+
- "protoc-gen-go-triple, and then re-generate your pb file again by this tool."+
- "If you are not using pb serialization, please set 'interfaceName' field in reference config to let dubbogo get the interface name.", registeredTypeName)
- continue
- } else {
- // use interface name defined by pb
- refConfig.InterfaceName = triplePBService.XXX_InterfaceName()
- }
- if err := refConfig.Init(GetRootConfig()); err != nil {
- logger.Errorf(fmt.Sprintf("reference with registeredTypeName = %s init failed! err: %#v", registeredTypeName, err))
- continue
- }
- }
- refConfig.id = registeredTypeName
- refConfig.Refer(refRPCService)
- refConfig.Implement(refRPCService)
- }
-
- var maxWait int
-
- if maxWaitDuration, err := time.ParseDuration(cc.MaxWaitTimeForServiceDiscovery); err != nil {
- logger.Warnf("Invalid consumer max wait time for service discovery: %s, fallback to 3s", cc.MaxWaitTimeForServiceDiscovery)
- maxWait = 3
- } else {
- maxWait = int(maxWaitDuration.Seconds())
- }
-
- // wait for invoker is available, if wait over default 3s, then panic
- var count int
- for {
- checkok := true
- for key, ref := range cc.References {
- if (ref.Check != nil && *ref.Check && GetProviderService(key) == nil) ||
- (ref.Check == nil && cc.Check && GetProviderService(key) == nil) ||
- (ref.Check == nil && GetProviderService(key) == nil) { // default to true
-
- if ref.invoker != nil && !ref.invoker.IsAvailable() {
- checkok = false
- count++
- if count > maxWait {
- errMsg := fmt.Sprintf("No provider available of the service %v.please check configuration.", ref.InterfaceName)
- logger.Error(errMsg)
- panic(errMsg)
- }
- time.Sleep(time.Second * 1)
- break
- }
- if ref.invoker == nil {
- logger.Warnf("The interface %s invoker not exist, may you should check your interface config.", ref.InterfaceName)
- }
- }
- }
- if checkok {
- break
- }
- }
-}
-
-// SetConsumerConfig sets consumerConfig by @c
-func SetConsumerConfig(c ConsumerConfig) {
- rc := GetRootConfig()
- if rc == nil {
- rc = NewRootConfigBuilder().Build()
- }
- next := *rc
- next.Consumer = &c
- SetRootConfig(next)
-}
-
-func newEmptyConsumerConfig() *ConsumerConfig {
- newConsumerConfig := &ConsumerConfig{
- References: make(map[string]*ReferenceConfig, 8),
- RequestTimeout: "3s",
- Check: true,
- }
- return newConsumerConfig
-}
-
-type ConsumerConfigBuilder struct {
- consumerConfig *ConsumerConfig
-}
-
-func NewConsumerConfigBuilder() *ConsumerConfigBuilder {
- return &ConsumerConfigBuilder{consumerConfig: newEmptyConsumerConfig()}
-}
-
-func (ccb *ConsumerConfigBuilder) SetFilter(filter string) *ConsumerConfigBuilder {
- ccb.consumerConfig.Filter = filter
- return ccb
-}
-
-func (ccb *ConsumerConfigBuilder) SetRegistryIDs(RegistryIDs ...string) *ConsumerConfigBuilder {
- ccb.consumerConfig.RegistryIDs = RegistryIDs
- return ccb
-}
-
-func (ccb *ConsumerConfigBuilder) SetRequestTimeout(requestTimeout string) *ConsumerConfigBuilder {
- ccb.consumerConfig.RequestTimeout = requestTimeout
- return ccb
-}
-
-func (ccb *ConsumerConfigBuilder) SetMaxWaitTimeForServiceDiscovery(maxWaitTimeForServiceDiscovery string) *ConsumerConfigBuilder {
- ccb.consumerConfig.MaxWaitTimeForServiceDiscovery = maxWaitTimeForServiceDiscovery
- return ccb
-}
-
-func (ccb *ConsumerConfigBuilder) SetProxyFactory(proxyFactory string) *ConsumerConfigBuilder {
- ccb.consumerConfig.ProxyFactory = proxyFactory
- return ccb
-}
-
-func (ccb *ConsumerConfigBuilder) SetCheck(check bool) *ConsumerConfigBuilder {
- ccb.consumerConfig.Check = check
- return ccb
-}
-
-func (ccb *ConsumerConfigBuilder) AddReference(referenceKey string, referenceConfig *ReferenceConfig) *ConsumerConfigBuilder {
- ccb.consumerConfig.References[referenceKey] = referenceConfig
- return ccb
-}
-
-func (ccb *ConsumerConfigBuilder) SetReferences(references map[string]*ReferenceConfig) *ConsumerConfigBuilder {
- ccb.consumerConfig.References = references
- return ccb
-}
-
-func (ccb *ConsumerConfigBuilder) SetFilterConf(filterConf any) *ConsumerConfigBuilder {
- ccb.consumerConfig.FilterConf = filterConf
- return ccb
-}
-
-func (ccb *ConsumerConfigBuilder) SetMeshEnabled(meshEnabled bool) *ConsumerConfigBuilder {
- ccb.consumerConfig.MeshEnabled = meshEnabled
- return ccb
-}
-
-func (ccb *ConsumerConfigBuilder) SetRootConfig(rootConfig *RootConfig) *ConsumerConfigBuilder {
- ccb.consumerConfig.rootConfig = rootConfig
- return ccb
-}
-
-func (ccb *ConsumerConfigBuilder) Build() *ConsumerConfig {
- return ccb.consumerConfig
-}
-
-// DynamicUpdateProperties dynamically update properties.
-func (cc *ConsumerConfig) DynamicUpdateProperties(newConsumerConfig *ConsumerConfig) {
- if newConsumerConfig != nil && newConsumerConfig.RequestTimeout != cc.RequestTimeout {
- cc.RequestTimeout = newConsumerConfig.RequestTimeout
- logger.Infof("ConsumerConfig's RequestTimeout was dynamically updated, new value:%v", cc.RequestTimeout)
- }
-}
diff --git a/config/custom_config.go b/config/custom_config.go
deleted file mode 100644
index eb247defc..000000000
--- a/config/custom_config.go
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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
-
-import (
- "github.com/creasty/defaults"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-type CustomConfig struct {
- ConfigMap map[string]any `yaml:"config-map" json:"config-map,omitempty" property:"config-map"`
-}
-
-func (*CustomConfig) Prefix() string {
- return constant.CustomConfigPrefix
-}
-
-func (c *CustomConfig) Init() error {
- return c.check()
-}
-
-func (c *CustomConfig) check() error {
- if err := defaults.Set(c); err != nil {
- return err
- }
- return verify(c)
-}
-
-func (c *CustomConfig) GetDefineValue(key string, default_value any) any {
- if define_value, ok := c.ConfigMap[key]; ok {
- return define_value
- }
- return default_value
-}
-
-func GetDefineValue(key string, default_value any) any {
- rt := GetRootConfig()
- if rt.Custom == nil {
- return default_value
- }
- return rt.Custom.GetDefineValue(key, default_value)
-}
-
-type CustomConfigBuilder struct {
- customConfig *CustomConfig
-}
-
-func NewCustomConfigBuilder() *CustomConfigBuilder {
- return &CustomConfigBuilder{customConfig: &CustomConfig{}}
-}
-
-func (ccb *CustomConfigBuilder) SetDefineConfig(key string, val any) *CustomConfigBuilder {
- if ccb.customConfig.ConfigMap == nil {
- ccb.customConfig.ConfigMap = make(map[string]any)
- }
- ccb.customConfig.ConfigMap[key] = val
- return ccb
-}
-
-func (ccb *CustomConfigBuilder) Build() *CustomConfig {
- return ccb.customConfig
-}
diff --git a/config/custom_config_test.go b/config/custom_config_test.go
deleted file mode 100644
index af412c3d7..000000000
--- a/config/custom_config_test.go
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * 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
-
-import (
- "strings"
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- _ "dubbo.apache.org/dubbo-go/v3/metadata/report/zookeeper"
-)
-
-func TestCustomInit(t *testing.T) {
- t.Run("empty use default", func(t *testing.T) {
- err := Load(WithPath("./testdata/config/custom/empty.yaml"))
- require.NoError(t, err)
- assert.NotNil(t, GetRootConfig())
- customConfig := GetRootConfig().Custom
- assert.NotNil(t, customConfig)
- assert.Equal(t, customConfig.ConfigMap, map[string]any(nil))
- assert.Equal(t, "test", customConfig.GetDefineValue("test", "test"))
- assert.Equal(t, "test", GetDefineValue("test", "test"))
- })
-
- t.Run("use config", func(t *testing.T) {
- err := Load(WithPath("./testdata/config/custom/custom.yaml"))
- require.NoError(t, err)
- assert.NotNil(t, GetRootConfig())
- customConfig := GetRootConfig().Custom
- assert.NotNil(t, customConfig)
- assert.Equal(t, map[string]any{"test-config": true}, customConfig.ConfigMap)
- assert.Equal(t, true, customConfig.GetDefineValue("test-config", false))
- assert.Equal(t, false, customConfig.GetDefineValue("test-no-config", false))
- assert.Equal(t, true, GetDefineValue("test-config", false))
- assert.Equal(t, false, GetDefineValue("test-no-config", false))
- })
-
- t.Run("config builder", func(t *testing.T) {
- customConfigBuilder := NewCustomConfigBuilder()
- customConfigBuilder.SetDefineConfig("test-build", true)
- customConfig := customConfigBuilder.Build()
- assert.NotNil(t, customConfig)
- assert.Equal(t, true, customConfig.GetDefineValue("test-build", false))
- assert.Equal(t, false, customConfig.GetDefineValue("test-no-build", false))
- // todo @(laurence) now we should guarantee rootConfig ptr can't be changed during test
- tempRootConfig := GetRootConfig()
- rt := NewRootConfigBuilder().SetCustom(customConfig).Build()
- SetRootConfig(*rt)
- assert.Equal(t, true, GetDefineValue("test-build", false))
- assert.Equal(t, false, GetDefineValue("test-no-build", false))
- SetRootConfig(*tempRootConfig)
- })
-}
-
-func TestConfigUtils(t *testing.T) {
- config := NewRegistryConfigWithProtocolDefaultPort("nacos")
-
- id := clientNameID(config, config.Protocol, config.Address)
-
- assert.Equal(t, id, strings.Join([]string{constant.RegistryConfigPrefix, "nacos", "127.0.0.1:8848"}, "-"))
-
- ids := translateIds([]string{"nacos,zk"})
- assert.Equal(t, "nacos", ids[0])
- assert.Equal(t, "zk", ids[1])
-
- element := removeDuplicateElement([]string{"nacos", "nacos"})
- assert.Len(t, element, 1)
-}
diff --git a/config/doc.go b/config/doc.go
deleted file mode 100644
index b13e49495..000000000
--- a/config/doc.go
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * 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 assembles all Dubbo configurations and works as the entrance of the whole Dubbo process.
-//
-// Deprecated: This package is for internal use only starting from 3.2.0, users must not depend on this package directly.
-package config
diff --git a/config/generic/generic_service.go b/config/generic/generic_service.go
deleted file mode 100644
index bcadb130d..000000000
--- a/config/generic/generic_service.go
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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 generic provides type aliases for backward compatibility.
-// Deprecated: Use dubbo.apache.org/dubbo-go/v3/filter/generic instead.
-package generic
-
-import (
- "dubbo.apache.org/dubbo-go/v3/filter/generic"
-)
-
-// GenericService is an alias for backward compatibility.
-// Deprecated: Use dubbo.apache.org/dubbo-go/v3/filter/generic.GenericService instead.
-type GenericService = generic.GenericService
-
-// NewGenericService is an alias for backward compatibility.
-// Deprecated: Use dubbo.apache.org/dubbo-go/v3/filter/generic.NewGenericService instead.
-var NewGenericService = generic.NewGenericService
diff --git a/config/graceful_shutdown.go b/config/graceful_shutdown.go
deleted file mode 100644
index 8080f994b..000000000
--- a/config/graceful_shutdown.go
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * 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
-
-import (
- "os"
- "os/signal"
- "runtime/debug"
- "time"
-)
-
-import (
- gxset "github.com/dubbogo/gost/container/set"
- "github.com/dubbogo/gost/log/logger"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/common/extension"
-)
-
-/*
- * The key point is that find out the signals to handle.
- * The most important documentation is https://golang.org/pkg/os/signal/
- * From this documentation, we can know that:
- * 1. The signals SIGKILL and SIGSTOP may not be caught by signal package;
- * 2. SIGHUP, SIGINT, or SIGTERM signal causes the program to exit
- * 3. SIGQUIT, SIGILL, SIGTRAP, SIGABRT, SIGSTKFLT, SIGEMT, or SIGSYS signal causes the program to exit with a stack dump
- * 4. The invocation of Notify(signal...) will disable the default behavior of those signals.
- *
- * So the signals SIGKILL, SIGSTOP, SIGHUP, SIGINT, SIGTERM, SIGQUIT, SIGILL, SIGTRAP, SIGABRT, SIGSTKFLT, SIGEMT, SIGSYS
- * should be processed.
- * syscall.SIGEMT cannot be found in CI
- * It's seems that the Unix/Linux does not have the signal SIGSTKFLT. https://github.com/golang/go/issues/33381
- * So this signal will be ignored.
- * The signals are different on different platforms.
- * We define them by using 'package build' feature https://golang.org/pkg/go/build/
- */
-const defaultShutDownTime = constant.DefaultShutdownConfigTimeout
-
-func gracefulShutdownInit() {
- // retrieve ShutdownConfig for gracefulShutdownFilter
- gracefulShutdownConsumerFilter, exist := extension.GetFilter(constant.GracefulShutdownConsumerFilterKey)
- if !exist {
- return
- }
- gracefulShutdownProviderFilter, exist := extension.GetFilter(constant.GracefulShutdownProviderFilterKey)
- if !exist {
- return
- }
- rc := GetRootConfig()
- if filter, ok := gracefulShutdownConsumerFilter.(Setter); ok && rc != nil && rc.Shutdown != nil {
- filter.Set(constant.GracefulShutdownFilterShutdownConfig, GetShutDown())
- }
-
- if filter, ok := gracefulShutdownProviderFilter.(Setter); ok && rc != nil && rc.Shutdown != nil {
- filter.Set(constant.GracefulShutdownFilterShutdownConfig, GetShutDown())
- }
-
- if GetShutDown().GetInternalSignal() {
- signals := make(chan os.Signal, 1)
- signal.Notify(signals, ShutdownSignals...)
-
- go func() {
- sig := <-signals
- logger.Infof("get signal %s, applicationConfig will shutdown.", sig)
- // gracefulShutdownOnce.Do(func() {
- time.AfterFunc(totalTimeout(), func() {
- logger.Warn("Shutdown gracefully timeout, applicationConfig will shutdown immediately. ")
- os.Exit(0)
- })
- BeforeShutdown()
- // those signals' original behavior is exit with dump ths stack, so we try to keep the behavior
- for _, dumpSignal := range DumpHeapShutdownSignals {
- if sig == dumpSignal {
- debug.WriteHeapDump(os.Stdout.Fd())
- }
- }
- os.Exit(0)
-
- }()
- }
-}
-
-// BeforeShutdown provides processing flow before shutdown
-func BeforeShutdown() {
- destroyAllRegistries()
- // waiting for a short time so that the clients have enough time to get the notification that server shutdowns
- // The value of configuration depends on how long the clients will get notification.
- waitAndAcceptNewRequests()
-
- // reject sending/receiving the new request, but keeping waiting for accepting requests
- waitForSendingAndReceivingRequests()
-
- // destroy all protocols
- destroyProtocols()
-
- logger.Info("Graceful shutdown --- Execute the custom callbacks.")
- customCallbacks := extension.GetAllCustomShutdownCallbacks()
- for callback := customCallbacks.Front(); callback != nil; callback = callback.Next() {
- callback.Value.(func())()
- }
-}
-
-func destroyAllRegistries() {
- logger.Info("Graceful shutdown --- Destroy all registriesConfig. ")
- registryProtocol := extension.GetProtocol(constant.RegistryProtocol)
- registryProtocol.Destroy()
-}
-
-// destroyProtocols destroys protocols.
-// First we destroy provider's protocols, and then we destroy the consumer protocols.
-func destroyProtocols() {
- logger.Info("Graceful shutdown --- Destroy protocols. ")
-
- rc := GetRootConfig()
- if rc == nil || rc.Protocols == nil {
- return
- }
-
- consumerProtocols := getConsumerProtocols(rc)
-
- destroyProviderProtocols(rc, consumerProtocols)
- destroyConsumerProtocols(consumerProtocols)
-}
-
-// destroyProviderProtocols destroys the provider's protocol.
-// if the protocol is consumer's protocol too, we will keep it
-func destroyProviderProtocols(rc *RootConfig, consumerProtocols *gxset.HashSet) {
- logger.Info("Graceful shutdown --- First destroy provider's protocols. ")
- for _, protocol := range rc.Protocols {
- // the protocol is the consumer's protocol too, we can not destroy it.
- if consumerProtocols.Contains(protocol.Name) {
- continue
- }
- extension.GetProtocol(protocol.Name).Destroy()
- }
-}
-
-func destroyConsumerProtocols(consumerProtocols *gxset.HashSet) {
- logger.Info("Graceful shutdown --- Second Destroy consumer's protocols. ")
- for name := range consumerProtocols.Items {
- extension.GetProtocol(name.(string)).Destroy()
- }
-}
-
-func waitAndAcceptNewRequests() {
- logger.Info("Graceful shutdown --- Keep waiting and accept new requests for a short time. ")
- rc := GetRootConfig()
- if rc == nil || rc.Shutdown == nil {
- return
- }
-
- time.Sleep(rc.Shutdown.GetConsumerUpdateWaitTime())
-
- timeout := rc.Shutdown.GetStepTimeout()
- // ignore this step
- if timeout < 0 {
- return
- }
- waitingProviderProcessedTimeout(rc.Shutdown)
-}
-
-func waitingProviderProcessedTimeout(shutdownConfig *ShutdownConfig) {
- timeout := shutdownConfig.GetStepTimeout()
- if timeout <= 0 {
- return
- }
- deadline := time.Now().Add(timeout)
-
- offlineRequestWindowTimeout := shutdownConfig.GetOfflineRequestWindowTimeout()
- for time.Now().Before(deadline) &&
- (shutdownConfig.ProviderActiveCount.Load() > 0 || time.Now().Before(shutdownConfig.ProviderLastReceivedRequestTime.Load().Add(offlineRequestWindowTimeout))) {
- // sleep 10 ms and then we check it again
- time.Sleep(10 * time.Millisecond)
- logger.Infof("waiting for provider active invocation count = %d, provider last received request time: %v",
- shutdownConfig.ProviderActiveCount.Load(), shutdownConfig.ProviderLastReceivedRequestTime.Load())
- }
-}
-
-// for provider. It will wait for processing receiving requests
-func waitForSendingAndReceivingRequests() {
- logger.Info("Graceful shutdown --- Keep waiting until sending/accepting requests finish or timeout. ")
- rc := GetRootConfig()
- if rc == nil || rc.Shutdown == nil {
- // ignore this step
- return
- }
- rc.Shutdown.RejectRequest.Store(true)
- waitingConsumerProcessedTimeout(rc.Shutdown)
-}
-
-func waitingConsumerProcessedTimeout(shutdownConfig *ShutdownConfig) {
- timeout := shutdownConfig.GetStepTimeout()
- if timeout <= 0 {
- return
- }
- deadline := time.Now().Add(timeout)
-
- for time.Now().Before(deadline) && shutdownConfig.ConsumerActiveCount.Load() > 0 {
- // sleep 10 ms and then we check it again
- time.Sleep(10 * time.Millisecond)
- logger.Infof("waiting for consumer active invocation count = %d", shutdownConfig.ConsumerActiveCount.Load())
- }
-}
-
-func totalTimeout() time.Duration {
- timeout := defaultShutDownTime
- rc := GetRootConfig()
- if rc != nil && rc.Shutdown != nil && rc.Shutdown.GetTimeout() > timeout {
- timeout = rc.Shutdown.GetTimeout()
- }
-
- return timeout
-}
-
-// we can not get the protocols from consumerConfig because some protocol don't have configuration, like jsonrpc.
-func getConsumerProtocols(rc *RootConfig) *gxset.HashSet {
- result := gxset.NewSet()
- if rc == nil || rc.Consumer == nil || rc.Consumer.References == nil {
- return result
- }
-
- for _, reference := range rc.Consumer.References {
- result.Add(reference.Protocol)
- }
- return result
-}
diff --git a/config/graceful_shutdown_config.go b/config/graceful_shutdown_config.go
deleted file mode 100644
index eb288312a..000000000
--- a/config/graceful_shutdown_config.go
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * 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
-
-import (
- "github.com/creasty/defaults"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/global"
-)
-
-// ShutdownConfig is kept as a compatibility alias for global.ShutdownConfig.
-// Use global.ShutdownConfig directly in new code. Field documentation lives on
-// global.ShutdownConfig because it owns the graceful shutdown configuration.
-type ShutdownConfig = global.ShutdownConfig
-
-type ShutdownConfigBuilder struct {
- shutdownConfig *ShutdownConfig
-}
-
-func NewShutDownConfigBuilder() *ShutdownConfigBuilder {
- return &ShutdownConfigBuilder{shutdownConfig: &ShutdownConfig{}}
-}
-
-func (scb *ShutdownConfigBuilder) SetTimeout(timeout string) *ShutdownConfigBuilder {
- scb.shutdownConfig.Timeout = timeout
- return scb
-}
-
-func (scb *ShutdownConfigBuilder) SetStepTimeout(stepTimeout string) *ShutdownConfigBuilder {
- scb.shutdownConfig.StepTimeout = stepTimeout
- return scb
-}
-
-func (scb *ShutdownConfigBuilder) SetNotifyTimeout(notifyTimeout string) *ShutdownConfigBuilder {
- scb.shutdownConfig.NotifyTimeout = notifyTimeout
- return scb
-}
-
-func (scb *ShutdownConfigBuilder) SetRejectRequestHandler(rejectRequestHandler string) *ShutdownConfigBuilder {
- scb.shutdownConfig.RejectRequestHandler = rejectRequestHandler
- return scb
-}
-
-func (scb *ShutdownConfigBuilder) SetRejectRequest(rejectRequest bool) *ShutdownConfigBuilder {
- scb.shutdownConfig.RejectRequest.Store(rejectRequest)
- return scb
-}
-
-func (scb *ShutdownConfigBuilder) SetInternalSignal(internalSignal bool) *ShutdownConfigBuilder {
- scb.shutdownConfig.InternalSignal = &internalSignal
- return scb
-}
-
-func (scb *ShutdownConfigBuilder) Build() *ShutdownConfig {
- defaults.MustSet(scb.shutdownConfig)
- return scb.shutdownConfig
-}
-
-func (scb *ShutdownConfigBuilder) SetOfflineRequestWindowTimeout(offlineRequestWindowTimeout string) *ShutdownConfigBuilder {
- scb.shutdownConfig.OfflineRequestWindowTimeout = offlineRequestWindowTimeout
- return scb
-}
diff --git a/config/graceful_shutdown_config_test.go b/config/graceful_shutdown_config_test.go
deleted file mode 100644
index 73aba2da8..000000000
--- a/config/graceful_shutdown_config_test.go
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
- "time"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-func TestShutdownConfigGetTimeout(t *testing.T) {
- config := ShutdownConfig{}
- assert.False(t, config.RejectRequest.Load())
-
- config = ShutdownConfig{
- Timeout: "60s",
- StepTimeout: "10s",
- OfflineRequestWindowTimeout: "30s",
- }
-
- assert.Equal(t, 60*time.Second, config.GetTimeout())
- assert.Equal(t, 10*time.Second, config.GetStepTimeout())
- assert.Equal(t, 30*time.Second, config.GetOfflineRequestWindowTimeout())
- config = ShutdownConfig{
- Timeout: "34ms",
- StepTimeout: "79ms",
- OfflineRequestWindowTimeout: "13ms",
- }
-
- assert.Equal(t, 34*time.Millisecond, config.GetTimeout())
- assert.Equal(t, 79*time.Millisecond, config.GetStepTimeout())
- assert.Equal(t, 13*time.Millisecond, config.GetOfflineRequestWindowTimeout())
-
- // test default
- config = ShutdownConfig{}
-
- assert.Equal(t, 60*time.Second, config.GetTimeout())
- assert.Equal(t, 3*time.Second, config.GetStepTimeout())
- assert.Equal(t, 3*time.Second, config.GetOfflineRequestWindowTimeout())
-}
-
-func TestNewShutDownConfigBuilder(t *testing.T) {
- config := NewShutDownConfigBuilder().
- SetTimeout("10s").
- SetStepTimeout("15s").
- SetOfflineRequestWindowTimeout("13s").
- SetRejectRequestHandler("handler").
- SetRejectRequest(true).
- SetInternalSignal(false).
- Build()
-
- assert.Equal(t, constant.ShutdownConfigPrefix, config.Prefix())
-
- timeout := config.GetTimeout()
- assert.Equal(t, 10*time.Second, timeout)
-
- stepTimeout := config.GetStepTimeout()
- assert.Equal(t, 15*time.Second, stepTimeout)
-
- offlineRequestWindowTimeout := config.GetOfflineRequestWindowTimeout()
- assert.Equal(t, 13*time.Second, offlineRequestWindowTimeout)
- err := config.Init()
- require.NoError(t, err)
-
- waitTime := config.GetConsumerUpdateWaitTime()
- assert.Equal(t, 3*time.Second, waitTime)
-
- assert.False(t, config.GetInternalSignal())
-}
-
-func TestGetInternalSignal(t *testing.T) {
- config := NewShutDownConfigBuilder().
- SetTimeout("10s").
- SetStepTimeout("15s").
- SetOfflineRequestWindowTimeout("13s").
- SetRejectRequestHandler("handler").
- SetRejectRequest(true).
- Build()
-
- assert.True(t, config.GetInternalSignal())
-}
diff --git a/config/graceful_shutdown_signal_darwin.go b/config/graceful_shutdown_signal_darwin.go
deleted file mode 100644
index 9b694b5e0..000000000
--- a/config/graceful_shutdown_signal_darwin.go
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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
-
-import (
- "os"
- "syscall"
-)
-
-var (
- // ShutdownSignals receives shutdown signals to process
- ShutdownSignals = []os.Signal{
- os.Interrupt, os.Kill, syscall.SIGKILL, syscall.SIGSTOP,
- syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGILL, syscall.SIGTRAP,
- syscall.SIGABRT, syscall.SIGSYS, syscall.SIGTERM,
- }
-
- // DumpHeapShutdownSignals receives shutdown signals to process
- DumpHeapShutdownSignals = []os.Signal{
- syscall.SIGQUIT, syscall.SIGILL,
- syscall.SIGTRAP, syscall.SIGABRT, syscall.SIGSYS,
- }
-)
diff --git a/config/graceful_shutdown_signal_linux.go b/config/graceful_shutdown_signal_linux.go
deleted file mode 100644
index 9b694b5e0..000000000
--- a/config/graceful_shutdown_signal_linux.go
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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
-
-import (
- "os"
- "syscall"
-)
-
-var (
- // ShutdownSignals receives shutdown signals to process
- ShutdownSignals = []os.Signal{
- os.Interrupt, os.Kill, syscall.SIGKILL, syscall.SIGSTOP,
- syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGILL, syscall.SIGTRAP,
- syscall.SIGABRT, syscall.SIGSYS, syscall.SIGTERM,
- }
-
- // DumpHeapShutdownSignals receives shutdown signals to process
- DumpHeapShutdownSignals = []os.Signal{
- syscall.SIGQUIT, syscall.SIGILL,
- syscall.SIGTRAP, syscall.SIGABRT, syscall.SIGSYS,
- }
-)
diff --git a/config/graceful_shutdown_signal_windows.go b/config/graceful_shutdown_signal_windows.go
deleted file mode 100644
index 17c209e8f..000000000
--- a/config/graceful_shutdown_signal_windows.go
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * 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
-
-import (
- "os"
- "syscall"
-)
-
-var (
- // ShutdownSignals receives shutdown signals to process
- ShutdownSignals = []os.Signal{
- os.Interrupt, os.Kill, syscall.SIGKILL,
- syscall.SIGHUP, syscall.SIGINT, syscall.SIGQUIT, syscall.SIGILL, syscall.SIGTRAP,
- syscall.SIGABRT, syscall.SIGTERM,
- }
-
- // DumpHeapShutdownSignals receives shutdown signals to process
- DumpHeapShutdownSignals = []os.Signal{syscall.SIGQUIT, syscall.SIGILL, syscall.SIGTRAP, syscall.SIGABRT}
-)
diff --git a/config/graceful_shutdown_test.go b/config/graceful_shutdown_test.go
deleted file mode 100644
index 9b9245b51..000000000
--- a/config/graceful_shutdown_test.go
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * 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
-
-import (
- "context"
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/common/extension"
- "dubbo.apache.org/dubbo-go/v3/filter"
- "dubbo.apache.org/dubbo-go/v3/global"
- "dubbo.apache.org/dubbo-go/v3/protocol/base"
- "dubbo.apache.org/dubbo-go/v3/protocol/result"
-)
-
-type captureShutdownConfigFilter struct {
- captured any
-}
-
-func (f *captureShutdownConfigFilter) Invoke(context.Context, base.Invoker, base.Invocation) result.Result {
- return &result.RPCResult{}
-}
-
-func (f *captureShutdownConfigFilter) OnResponse(context.Context, result.Result, base.Invoker, base.Invocation) result.Result {
- return &result.RPCResult{}
-}
-
-func (f *captureShutdownConfigFilter) Set(_ string, config any) {
- f.captured = config
-}
-
-func TestGracefulShutdownInitPassesGlobalShutdownConfigToFilters(t *testing.T) {
- oldRoot := GetRootConfig()
- oldConsumerFilter, hadConsumerFilter := extension.GetFilter(constant.GracefulShutdownConsumerFilterKey)
- oldProviderFilter, hadProviderFilter := extension.GetFilter(constant.GracefulShutdownProviderFilterKey)
- t.Cleanup(func() {
- setRootConfigInternal(oldRoot)
- if hadConsumerFilter {
- extension.SetFilter(constant.GracefulShutdownConsumerFilterKey, func() filter.Filter {
- return oldConsumerFilter
- })
- } else {
- extension.UnregisterFilter(constant.GracefulShutdownConsumerFilterKey)
- }
- if hadProviderFilter {
- extension.SetFilter(constant.GracefulShutdownProviderFilterKey, func() filter.Filter {
- return oldProviderFilter
- })
- } else {
- extension.UnregisterFilter(constant.GracefulShutdownProviderFilterKey)
- }
- })
-
- internalSignal := false
- SetRootConfig(RootConfig{
- Shutdown: &ShutdownConfig{
- Timeout: "11s",
- StepTimeout: "2s",
- NotifyTimeout: "4s",
- InternalSignal: &internalSignal,
- },
- })
-
- consumerFilter := &captureShutdownConfigFilter{}
- providerFilter := &captureShutdownConfigFilter{}
- extension.SetFilter(constant.GracefulShutdownConsumerFilterKey, func() filter.Filter {
- return consumerFilter
- })
- extension.SetFilter(constant.GracefulShutdownProviderFilterKey, func() filter.Filter {
- return providerFilter
- })
-
- gracefulShutdownInit()
-
- consumerShutdown, ok := consumerFilter.captured.(*global.ShutdownConfig)
- require.True(t, ok)
- assert.Equal(t, "11s", consumerShutdown.Timeout)
- assert.Equal(t, "2s", consumerShutdown.StepTimeout)
- assert.Equal(t, "4s", consumerShutdown.NotifyTimeout)
-
- providerShutdown, ok := providerFilter.captured.(*global.ShutdownConfig)
- require.True(t, ok)
- assert.Equal(t, "11s", providerShutdown.Timeout)
- assert.Equal(t, "2s", providerShutdown.StepTimeout)
- assert.Equal(t, "4s", providerShutdown.NotifyTimeout)
-}
-
-//
-//import (
-// "dubbo.apache.org/dubbo-go/v3/config"
-// "dubbo.apache.org/dubbo-go/v3/config/consumer"
-// protocol2 "dubbo.apache.org/dubbo-go/v3/config/protocol"
-// "dubbo.apache.org/dubbo-go/v3/config/provider"
-// "dubbo.apache.org/dubbo-go/v3/config/reference"
-// "testing"
-//)
-//
-//import (
-// "dubbo.apache.org/dubbo-go/v3/common/constant"
-// "dubbo.apache.org/dubbo-go/v3/common/extension"
-// "dubbo.apache.org/dubbo-go/v3/filter"
-// "dubbo.apache.org/dubbo-go/v3/protocol"
-//)
-//
-//func TestGracefulShutdownInit(t *testing.T) {
-// extension.SetFilter(constant.GracefulShutdownConsumerFilterKey, func() filter.Filter {
-// return &config.mockGracefulShutdownFilter{}
-// })
-// extension.SetFilter(constant.GracefulShutdownProviderFilterKey, func() filter.Filter {
-// return &config.mockGracefulShutdownFilter{}
-// })
-// GracefulShutdownInit()
-//}
-//
-//func TestBeforeShutdown(t *testing.T) {
-// extension.SetProtocol("registry", func() protocol.Protocol {
-// return &config.mockRegistryProtocol{}
-// })
-// extension.SetProtocol(constant.DUBBO, func() protocol.Protocol {
-// return &config.mockRegistryProtocol{}
-// })
-//
-// extension.SetProtocol("mock", func() protocol.Protocol {
-// return &config.mockRegistryProtocol{}
-// })
-//
-// consumerReferences := map[string]*reference.ReferenceConfig{}
-// consumerReferences[constant.DUBBO] = &reference.ReferenceConfig{
-// Protocol: constant.DUBBO,
-// }
-//
-// // without configuration
-// config.consumerConfig = nil
-// config.referenceConfig = nil
-// BeforeShutdown()
-//
-// config.consumerConfig = &consumer.ShutdownConfig{
-// References: consumerReferences,
-// ShutdownConfig: &ShutdownConfig{
-// Timeout: "1",
-// StepTimeout: "1s",
-// },
-// }
-//
-// providerProtocols := map[string]*protocol2.ProtocolConfig{}
-// providerProtocols[constant.DUBBO] = &protocol2.ProtocolConfig{
-// Name: constant.DUBBO,
-// }
-//
-// providerProtocols["mock"] = &protocol2.ProtocolConfig{
-// Name: "mock",
-// }
-//
-// config.referenceConfig = &provider.ProviderConfig{
-// ShutdownConfig: &ShutdownConfig{
-// Timeout: "1",
-// StepTimeout: "1s",
-// },
-// Protocols: providerProtocols,
-// }
-// // test destroy protocol
-// BeforeShutdown()
-//
-// config.referenceConfig = &provider.ProviderConfig{
-// ShutdownConfig: &ShutdownConfig{
-// Timeout: "1",
-// StepTimeout: "-1s",
-// },
-// Protocols: providerProtocols,
-// }
-//
-// config.consumerConfig = &consumer.ShutdownConfig{
-// References: consumerReferences,
-// ShutdownConfig: &ShutdownConfig{
-// Timeout: "1",
-// StepTimeout: "-1s",
-// },
-// }
-//
-// // test ignore steps
-// BeforeShutdown()
-//}
diff --git a/config/http3_config.go b/config/http3_config.go
deleted file mode 100644
index 7b830ff32..000000000
--- a/config/http3_config.go
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * 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
-
-// Http3Config represents the config of http3
-type Http3Config struct {
- // Whether to enable HTTP/3 support.
- // When set to true, both HTTP/2 and HTTP/3 servers will be started simultaneously.
- // When set to false, only HTTP/2 server will be started.
- // The default value is false.
- Enable bool `yaml:"enable" json:"enable,omitempty"`
-
- // Whether to enable HTTP/3 negotiation.
- // If set to true, HTTP/2 alt-svc negotiation will be enabled,
- // allowing clients to negotiate between HTTP/2 and HTTP/3.
- // If set to false, HTTP/2 alt-svc negotiation will be skipped,
- // Clients cannot discover HTTP/3 via Alt-Svc.
- // The default value is true.
- // ref: https://quic-go.net/docs/http3/server/#advertising-http3-via-alt-svc
- Negotiation bool `yaml:"negotiation" json:"negotiation,omitempty"`
-
- // TODO: add more params about http3
-}
diff --git a/config/interfaces/config_post_processor.go b/config/interfaces/config_post_processor.go
deleted file mode 100644
index c3165738f..000000000
--- a/config/interfaces/config_post_processor.go
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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 interfaces
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
-)
-
-// ConfigPostProcessor is an extension to give users a chance to customize configs against ReferenceConfig and
-// ServiceConfig during deployment time.
-type ConfigPostProcessor interface {
- // PostProcessReferenceConfig customizes ReferenceConfig's params.
- PostProcessReferenceConfig(*common.URL)
-
- // PostProcessServiceConfig customizes ServiceConfig's params.
- PostProcessServiceConfig(*common.URL)
-}
diff --git a/config/interfaces/config_reader.go b/config/interfaces/config_reader.go
deleted file mode 100644
index b82d87332..000000000
--- a/config/interfaces/config_reader.go
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * 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 interfaces
-
-import (
- "bytes"
-)
-
-// ConfigReader is used to read config from consumer or provider
-type ConfigReader interface {
- ReadConsumerConfig(reader *bytes.Buffer) error
- ReadProviderConfig(reader *bytes.Buffer) error
-}
diff --git a/config/logger_config.go b/config/logger_config.go
deleted file mode 100644
index 65e2125f1..000000000
--- a/config/logger_config.go
+++ /dev/null
@@ -1,223 +0,0 @@
-/*
- * 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
-
-import (
- "fmt"
- "strconv"
-)
-
-import (
- getty "github.com/apache/dubbo-getty"
-
- "github.com/creasty/defaults"
-
- gostLogger "github.com/dubbogo/gost/log/logger"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/common/extension"
- dubboLogger "dubbo.apache.org/dubbo-go/v3/logger"
-)
-
-type LoggerConfig struct {
- // logger driver default zap
- Driver string `default:"zap" yaml:"driver"`
-
- // logger level
- Level string `default:"info" yaml:"level"`
-
- // logger formatter default text
- Format string `default:"text" yaml:"format"`
-
- // supports simultaneous file and console eg: console,file default console
- Appender string `default:"console" yaml:"appender"`
-
- // logger file
- File *File `yaml:"file"`
-
- // trace integration configuration
- TraceIntegration *TraceIntegrationConfig `yaml:"trace-integration"`
-}
-
-// TraceIntegrationConfig configures the integration between logging and OpenTelemetry tracing.
-type TraceIntegrationConfig struct {
- // whether to enable trace integration (inject traceId, spanId into logs)
- Enabled *bool `default:"false" yaml:"enabled"`
-
- // whether to record error logs to span
- RecordErrorToSpan *bool `default:"true" yaml:"record-error-to-span"`
-}
-
-type File struct {
- // log file name default dubbo.log
- Name string `default:"dubbo.log" yaml:"name"`
-
- // log max size default 100Mb
- MaxSize int `default:"100" yaml:"max-size"`
-
- // log max backups default 5
- MaxBackups int `default:"5" yaml:"max-backups"`
-
- // log file max age default 3 day
- MaxAge int `default:"3" yaml:"max-age"`
-
- Compress *bool `default:"true" yaml:"compress"`
-}
-
-// Prefix dubbo.logger
-func (l *LoggerConfig) Prefix() string {
- return constant.LoggerConfigPrefix
-}
-
-func (l *LoggerConfig) Init() error {
- var (
- log gostLogger.Logger
- err error
- )
- if err = l.check(); err != nil {
- return err
- }
-
- if log, err = extension.GetLogger(l.Driver, l.toURL()); err != nil {
- return err
- }
- // set log
- gostLogger.SetLogger(log)
- dubboLogger.SetLogger(log)
- getty.SetLogger(log)
- return nil
-}
-
-func (l *LoggerConfig) check() error {
- if err := defaults.Set(l); err != nil {
- return err
- }
- return verify(l)
-}
-
-func (l *LoggerConfig) toURL() *common.URL {
- address := fmt.Sprintf("%s://%s", l.Driver, l.Level)
- url, _ := common.NewURL(address,
- common.WithParamsValue(constant.LoggerLevelKey, l.Level),
- common.WithParamsValue(constant.LoggerDriverKey, l.Driver),
- common.WithParamsValue(constant.LoggerFormatKey, l.Format),
- common.WithParamsValue(constant.LoggerAppenderKey, l.Appender),
- common.WithParamsValue(constant.LoggerFileNameKey, l.File.Name),
- common.WithParamsValue(constant.LoggerFileNaxSizeKey, strconv.Itoa(l.File.MaxSize)),
- common.WithParamsValue(constant.LoggerFileMaxBackupsKey, strconv.Itoa(l.File.MaxBackups)),
- common.WithParamsValue(constant.LoggerFileMaxAgeKey, strconv.Itoa(l.File.MaxAge)),
- common.WithParamsValue(constant.LoggerFileCompressKey, strconv.FormatBool(*l.File.Compress)),
- )
-
- // Add trace integration parameters if configured
- if l.TraceIntegration != nil {
- if l.TraceIntegration.Enabled != nil {
- url.SetParam(constant.LoggerTraceEnabledKey, strconv.FormatBool(*l.TraceIntegration.Enabled))
- }
- if l.TraceIntegration.RecordErrorToSpan != nil {
- url.SetParam(constant.LoggerTraceRecordErrorKey, strconv.FormatBool(*l.TraceIntegration.RecordErrorToSpan))
- }
- }
-
- return url
-}
-
-// DynamicUpdateProperties dynamically update properties.
-func (l *LoggerConfig) DynamicUpdateProperties(new *LoggerConfig) {
-
-}
-
-type LoggerConfigBuilder struct {
- loggerConfig *LoggerConfig
-}
-
-func NewLoggerConfigBuilder() *LoggerConfigBuilder {
- return &LoggerConfigBuilder{loggerConfig: &LoggerConfig{File: &File{}}}
-}
-
-func (lcb *LoggerConfigBuilder) SetDriver(driver string) *LoggerConfigBuilder {
- lcb.loggerConfig.Driver = driver
- return lcb
-}
-
-func (lcb *LoggerConfigBuilder) SetLevel(level string) *LoggerConfigBuilder {
- lcb.loggerConfig.Level = level
- return lcb
-}
-
-func (lcb *LoggerConfigBuilder) SetFormat(format string) *LoggerConfigBuilder {
- lcb.loggerConfig.Format = format
- return lcb
-}
-
-func (lcb *LoggerConfigBuilder) SetAppender(appender string) *LoggerConfigBuilder {
- lcb.loggerConfig.Appender = appender
- return lcb
-}
-
-func (lcb *LoggerConfigBuilder) SetFileName(name string) *LoggerConfigBuilder {
- lcb.loggerConfig.File.Name = name
- return lcb
-}
-
-func (lcb *LoggerConfigBuilder) SetFileMaxSize(maxSize int) *LoggerConfigBuilder {
- lcb.loggerConfig.File.MaxSize = maxSize
- return lcb
-}
-
-func (lcb *LoggerConfigBuilder) SetFileMaxBackups(maxBackups int) *LoggerConfigBuilder {
- lcb.loggerConfig.File.MaxBackups = maxBackups
- return lcb
-}
-
-func (lcb *LoggerConfigBuilder) SetFileMaxAge(maxAge int) *LoggerConfigBuilder {
- lcb.loggerConfig.File.MaxAge = maxAge
- return lcb
-}
-
-func (lcb *LoggerConfigBuilder) SetFileCompress(compress bool) *LoggerConfigBuilder {
- lcb.loggerConfig.File.Compress = &compress
- return lcb
-}
-
-func (lcb *LoggerConfigBuilder) SetTraceIntegrationEnabled(enabled bool) *LoggerConfigBuilder {
- if lcb.loggerConfig.TraceIntegration == nil {
- lcb.loggerConfig.TraceIntegration = &TraceIntegrationConfig{}
- }
- lcb.loggerConfig.TraceIntegration.Enabled = &enabled
- return lcb
-}
-
-func (lcb *LoggerConfigBuilder) SetRecordErrorToSpan(enabled bool) *LoggerConfigBuilder {
- if lcb.loggerConfig.TraceIntegration == nil {
- lcb.loggerConfig.TraceIntegration = &TraceIntegrationConfig{}
- }
- lcb.loggerConfig.TraceIntegration.RecordErrorToSpan = &enabled
- return lcb
-}
-
-// Build return config and set default value if nil
-func (lcb *LoggerConfigBuilder) Build() *LoggerConfig {
- if err := defaults.Set(lcb.loggerConfig); err != nil {
- return nil
- }
- return lcb.loggerConfig
-}
diff --git a/config/logger_config_test.go b/config/logger_config_test.go
deleted file mode 100644
index a8c31ee6d..000000000
--- a/config/logger_config_test.go
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
-)
-
-import (
- "github.com/dubbogo/gost/log/logger"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- dubboLogger "dubbo.apache.org/dubbo-go/v3/logger"
-)
-
-func TestLoggerInit(t *testing.T) {
- t.Run("empty use default", func(t *testing.T) {
- err := Load(WithPath("./testdata/config/logger/empty_log.yaml"))
- require.NoError(t, err)
- assert.NotNil(t, GetRootConfig())
- loggerConfig := GetRootConfig().Logger
- assert.NotNil(t, loggerConfig)
- })
-
- t.Run("use config", func(t *testing.T) {
- err := Load(WithPath("./testdata/config/logger/log.yaml"))
- require.NoError(t, err)
- loggerConfig := GetRootConfig().Logger
- assert.NotNil(t, loggerConfig)
- // default
- logger.Info("hello")
- })
-
- t.Run("use config with file", func(t *testing.T) {
- err := Load(WithPath("./testdata/config/logger/file_log.yaml"))
- require.NoError(t, err)
- loggerConfig := GetRootConfig().Logger
- assert.NotNil(t, loggerConfig)
- logger.Debug("debug")
- logger.Info("info")
- logger.Warn("warn")
- logger.Error("error")
- logger.Debugf("%s", "debug")
- logger.Infof("%s", "info")
- logger.Warnf("%s", "warn")
- logger.Errorf("%s", "error")
- })
-}
-
-func TestNewLoggerConfigBuilder(t *testing.T) {
- config := NewLoggerConfigBuilder().
- SetDriver("zap").
- SetLevel("info").
- SetFileName("dubbo.log").
- SetFileMaxAge(10).
- Build()
-
- assert.NotNil(t, config)
-
- assert.Equal(t, "dubbo.log", config.File.Name)
- assert.Equal(t, "zap", config.Driver)
- assert.Equal(t, "info", config.Level)
- assert.Equal(t, 10, config.File.MaxAge)
-
- // default value
- assert.Equal(t, "console", config.Appender)
- assert.Equal(t, "text", config.Format)
- assert.Equal(t, 100, config.File.MaxSize)
- assert.True(t, *config.File.Compress)
- assert.Equal(t, 5, config.File.MaxBackups)
-}
-
-func TestLoggerConfigBuilder_TraceIntegration(t *testing.T) {
- t.Run("with trace integration enabled", func(t *testing.T) {
- config := NewLoggerConfigBuilder().
- SetDriver("zap").
- SetLevel("info").
- SetTraceIntegrationEnabled(true).
- SetRecordErrorToSpan(false).
- Build()
-
- assert.NotNil(t, config)
- assert.NotNil(t, config.TraceIntegration)
- assert.NotNil(t, config.TraceIntegration.Enabled)
- assert.True(t, *config.TraceIntegration.Enabled)
- assert.NotNil(t, config.TraceIntegration.RecordErrorToSpan)
- assert.False(t, *config.TraceIntegration.RecordErrorToSpan)
- })
-
- t.Run("with trace integration disabled", func(t *testing.T) {
- config := NewLoggerConfigBuilder().
- SetDriver("zap").
- SetTraceIntegrationEnabled(false).
- SetRecordErrorToSpan(true).
- Build()
-
- assert.NotNil(t, config)
- assert.NotNil(t, config.TraceIntegration)
- assert.NotNil(t, config.TraceIntegration.Enabled)
- assert.False(t, *config.TraceIntegration.Enabled)
- assert.NotNil(t, config.TraceIntegration.RecordErrorToSpan)
- assert.True(t, *config.TraceIntegration.RecordErrorToSpan)
- })
-
- t.Run("without trace integration config", func(t *testing.T) {
- config := NewLoggerConfigBuilder().
- SetDriver("zap").
- SetLevel("info").
- Build()
-
- assert.NotNil(t, config)
- // TraceIntegration should be nil if not configured
- assert.Nil(t, config.TraceIntegration)
- })
-}
-
-func TestLoggerConfigInit_SyncsDubboFacade_Zap(t *testing.T) {
- config := NewLoggerConfigBuilder().
- SetDriver("zap").
- SetLevel("info").
- Build()
-
- require.NoError(t, config.Init())
- assert.NotNil(t, dubboLogger.GetLogger(), "dubbo-go logger facade should not be nil after LoggerConfig.Init()")
-}
-
-func TestLoggerConfigInit_SyncsDubboFacade_Logrus(t *testing.T) {
- config := NewLoggerConfigBuilder().
- SetDriver("logrus").
- SetLevel("info").
- Build()
-
- require.NoError(t, config.Init())
- assert.NotNil(t, dubboLogger.GetLogger(), "dubbo-go logger facade should not be nil after LoggerConfig.Init() with logrus driver")
-}
-
-func TestLoggerConfigInit_SetLoggerLevel_WorksAfterInit(t *testing.T) {
- config := NewLoggerConfigBuilder().
- SetDriver("zap").
- SetLevel("info").
- Build()
-
- require.NoError(t, config.Init())
- assert.True(t, dubboLogger.SetLoggerLevel("debug"), "SetLoggerLevel should return true after LoggerConfig.Init() with zap driver")
-}
-
-func TestLoggerConfigInit_TraceIntegration_FacadeNotNil(t *testing.T) {
- config := NewLoggerConfigBuilder().
- SetDriver("zap").
- SetLevel("info").
- SetTraceIntegrationEnabled(true).
- Build()
-
- require.NoError(t, config.Init())
- assert.NotNil(t, dubboLogger.GetLogger(), "dubbo-go logger facade should not be nil after Init() with trace-integration enabled")
- assert.True(t, dubboLogger.SetLoggerLevel("debug"), "SetLoggerLevel should work through ZapCtxLogger wrapper with trace-integration enabled")
-}
diff --git a/config/metadata_config.go b/config/metadata_config.go
deleted file mode 100644
index 36d38230d..000000000
--- a/config/metadata_config.go
+++ /dev/null
@@ -1,237 +0,0 @@
-/*
- * 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
-
-import (
- "strconv"
- "time"
-)
-
-import (
- "github.com/dubbogo/gost/log/logger"
-
- perrors "github.com/pkg/errors"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/metadata"
-)
-
-// MetadataReportConfig is app level configuration
-type MetadataReportConfig struct {
- Protocol string `required:"true" yaml:"protocol" json:"protocol,omitempty"`
- Address string `required:"true" yaml:"address" json:"address"`
- Username string `yaml:"username" json:"username,omitempty"`
- Password string `yaml:"password" json:"password,omitempty"`
- Timeout string `yaml:"timeout" json:"timeout,omitempty"`
- Group string `yaml:"group" json:"group,omitempty"`
- Namespace string `yaml:"namespace" json:"namespace,omitempty"`
- Params map[string]string `yaml:"params" json:"parameters,omitempty"`
- // metadataType of this application is defined by application config, local or remote
- metadataType string
-}
-
-func initMetadata(rc *RootConfig) error {
- opts := metadata.NewOptions(
- metadata.WithAppName(rc.Application.Name),
- metadata.WithMetadataType(rc.Application.MetadataType),
- metadata.WithPort(getMetadataPort(rc)),
- )
- if err := opts.Init(); err != nil {
- return err
- }
- return nil
-}
-
-func getMetadataPort(rc *RootConfig) int {
- port := rc.Application.MetadataServicePort
- if port == "" {
- protocolConfig, ok := rc.Protocols[constant.DefaultProtocol]
- if ok {
- port = protocolConfig.Port
- } else {
- logger.Warnf("[Metadata Service] Dubbo-go %s version's MetadataService only support dubbo protocol,"+
- "MetadataService will use random port",
- constant.Version)
- }
- }
- if port == "" {
- return 0
- }
- p, err := strconv.Atoi(port)
- if err != nil {
- logger.Error("MetadataService port parse error %v, MetadataService will use random port", err)
- return 0
- }
- return p
-}
-
-// Prefix dubbo.consumer
-func (*MetadataReportConfig) Prefix() string {
- return constant.MetadataReportPrefix
-}
-
-func (mc *MetadataReportConfig) toReportOptions() (*metadata.ReportOptions, error) {
- opts := metadata.NewReportOptions(
- metadata.WithRegistryId(constant.DefaultKey),
- metadata.WithProtocol(mc.Protocol),
- metadata.WithAddress(mc.Address),
- metadata.WithUsername(mc.Username),
- metadata.WithPassword(mc.Password),
- metadata.WithGroup(mc.Group),
- metadata.WithNamespace(mc.Namespace),
- metadata.WithParams(mc.Params),
- )
- if mc.Timeout != "" {
- timeout, err := time.ParseDuration(mc.Timeout)
- if err != nil {
- return nil, err
- }
- metadata.WithTimeout(timeout)(opts)
- }
- return opts, nil
-}
-
-func registryToReportOptions(id string, rc *RegistryConfig) (*metadata.ReportOptions, error) {
- opts := metadata.NewReportOptions(
- metadata.WithRegistryId(id),
- metadata.WithProtocol(rc.Protocol),
- metadata.WithAddress(rc.Address),
- metadata.WithUsername(rc.Username),
- metadata.WithPassword(rc.Password),
- metadata.WithGroup(rc.Group),
- metadata.WithNamespace(rc.Namespace),
- metadata.WithParams(rc.Params),
- )
- if rc.Timeout != "" {
- timeout, err := time.ParseDuration(rc.Timeout)
- if err != nil {
- return nil, err
- }
- metadata.WithTimeout(timeout)(opts)
- }
- return opts, nil
-}
-
-func (mc *MetadataReportConfig) Init(rc *RootConfig) error {
- if mc == nil {
- return nil
- }
- mc.metadataType = rc.Application.MetadataType
- if mc.Address != "" {
- // if metadata report config is avaible, then init metadata report instance
- opts, err := mc.toReportOptions()
- if err != nil {
- return err
- }
- return opts.Init()
- }
- if len(rc.Registries) > 0 {
- // if metadata report config is not available, then init metadata report instance with registries
- for id, reg := range rc.Registries {
- if isValid(reg.Address) {
- ok, err := strconv.ParseBool(reg.UseAsMetaReport)
- if err != nil {
- return err
- }
- if ok {
- opts, err := registryToReportOptions(id, reg)
- if err != nil {
- return err
- }
- if err = opts.Init(); err != nil {
- return err
- }
- }
- }
- }
- }
- return nil
-}
-
-func (mc *MetadataReportConfig) ToUrl() (*common.URL, error) {
- res, err := common.NewURL(mc.Address,
- common.WithUsername(mc.Username),
- common.WithPassword(mc.Password),
- common.WithLocation(mc.Address),
- common.WithProtocol(mc.Protocol),
- common.WithParamsValue(constant.TimeoutKey, mc.Timeout),
- common.WithParamsValue(constant.MetadataReportGroupKey, mc.Group),
- common.WithParamsValue(constant.MetadataReportNamespaceKey, mc.Namespace),
- common.WithParamsValue(constant.MetadataTypeKey, mc.metadataType),
- common.WithParamsValue(constant.ClientNameKey, clientNameID(mc, mc.Protocol, mc.Address)),
- )
- if err != nil || len(res.Protocol) == 0 {
- return nil, perrors.New("Invalid MetadataReport Config.")
- }
- res.SetParam("metadata", res.Protocol)
- for key, val := range mc.Params {
- res.SetParam(key, val)
- }
- return res, nil
-}
-
-type MetadataReportConfigBuilder struct {
- metadataReportConfig *MetadataReportConfig
-}
-
-func NewMetadataReportConfigBuilder() *MetadataReportConfigBuilder {
- return &MetadataReportConfigBuilder{metadataReportConfig: newEmptyMetadataReportConfig()}
-}
-
-func (mrcb *MetadataReportConfigBuilder) SetProtocol(protocol string) *MetadataReportConfigBuilder {
- mrcb.metadataReportConfig.Protocol = protocol
- return mrcb
-}
-
-func (mrcb *MetadataReportConfigBuilder) SetAddress(address string) *MetadataReportConfigBuilder {
- mrcb.metadataReportConfig.Address = address
- return mrcb
-}
-
-func (mrcb *MetadataReportConfigBuilder) SetUsername(username string) *MetadataReportConfigBuilder {
- mrcb.metadataReportConfig.Username = username
- return mrcb
-}
-
-func (mrcb *MetadataReportConfigBuilder) SetPassword(password string) *MetadataReportConfigBuilder {
- mrcb.metadataReportConfig.Password = password
- return mrcb
-}
-
-func (mrcb *MetadataReportConfigBuilder) SetTimeout(timeout string) *MetadataReportConfigBuilder {
- mrcb.metadataReportConfig.Timeout = timeout
- return mrcb
-}
-
-func (mrcb *MetadataReportConfigBuilder) SetGroup(group string) *MetadataReportConfigBuilder {
- mrcb.metadataReportConfig.Group = group
- return mrcb
-}
-
-func (mrcb *MetadataReportConfigBuilder) Build() *MetadataReportConfig {
- return mrcb.metadataReportConfig
-}
-
-func newEmptyMetadataReportConfig() *MetadataReportConfig {
- return &MetadataReportConfig{
- Params: make(map[string]string),
- }
-}
diff --git a/config/metadata_config_test.go b/config/metadata_config_test.go
deleted file mode 100644
index 51e5594ba..000000000
--- a/config/metadata_config_test.go
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-func TestNewMetadataReportConfigBuilder(t *testing.T) {
- config := NewMetadataReportConfigBuilder().
- SetProtocol("nacos").
- SetAddress("127.0.0.1:8848").
- SetUsername("nacos").
- SetPassword("123456").
- SetTimeout("10s").
- SetGroup("dubbo").
- Build()
-
- assert.Equal(t, constant.MetadataReportPrefix, config.Prefix())
-
- url, err := config.ToUrl()
- require.NoError(t, err)
- assert.Equal(t, "10s", url.GetParam(constant.TimeoutKey, "3s"))
-}
diff --git a/config/method_config.go b/config/method_config.go
deleted file mode 100644
index 3a52260ea..000000000
--- a/config/method_config.go
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * 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
-
-import (
- "fmt"
- "strconv"
-)
-
-import (
- "github.com/creasty/defaults"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/common/extension"
-)
-
-// MethodConfig defines method config
-type MethodConfig struct {
- InterfaceId string
- InterfaceName string
- Name string `yaml:"name" json:"name,omitempty" property:"name"`
- Retries string `yaml:"retries" json:"retries,omitempty" property:"retries"`
- LoadBalance string `yaml:"loadbalance" json:"loadbalance,omitempty" property:"loadbalance"`
- Weight int64 `yaml:"weight" json:"weight,omitempty" property:"weight"`
- TpsLimitInterval string `yaml:"tps.limit.interval" json:"tps.limit.interval,omitempty" property:"tps.limit.interval"`
- TpsLimitRate string `yaml:"tps.limit.rate" json:"tps.limit.rate,omitempty" property:"tps.limit.rate"`
- TpsLimitStrategy string `yaml:"tps.limit.strategy" json:"tps.limit.strategy,omitempty" property:"tps.limit.strategy"`
- ExecuteLimit string `yaml:"execute.limit" json:"execute.limit,omitempty" property:"execute.limit"`
- ExecuteLimitRejectedHandler string `yaml:"execute.limit.rejected.handler" json:"execute.limit.rejected.handler,omitempty" property:"execute.limit.rejected.handler"`
- Sticky bool `yaml:"sticky" json:"sticky,omitempty" property:"sticky"`
- RequestTimeout string `yaml:"timeout" json:"timeout,omitempty" property:"timeout"`
-}
-
-// Prefix builds the configuration key prefix for this method.
-func (m *MethodConfig) Prefix() string {
- if len(m.InterfaceId) != 0 {
- return constant.Dubbo + "." + m.InterfaceName + "." + m.InterfaceId + "." + m.Name + "."
- }
-
- return constant.Dubbo + "." + m.InterfaceName + "." + m.Name + "."
-}
-
-func (m *MethodConfig) Init() error {
- return m.check()
-}
-
-func initProviderMethodConfig(sc *ServiceConfig) error {
- methods := sc.Methods
- if methods == nil {
- return nil
- }
- for _, method := range methods {
- if err := method.check(); err != nil {
- return err
- }
- }
- sc.Methods = methods
- return nil
-}
-
-// check set default value and verify
-func (m *MethodConfig) check() error {
- qualifieldMethodName := m.InterfaceName + "#" + m.Name
- if m.TpsLimitStrategy != "" {
- _, err := extension.GetTpsLimitStrategyCreator(m.TpsLimitStrategy)
- if err != nil {
- panic(err)
- }
- }
-
- if m.TpsLimitInterval != "" {
- tpsLimitInterval, err := strconv.ParseInt(m.TpsLimitInterval, 0, 0)
- if err != nil {
- return fmt.Errorf("[MethodConfig] Cannot parse the configuration tps.limit.interval for method %s, please check your configuration", qualifieldMethodName)
- }
- if tpsLimitInterval < 0 {
- return fmt.Errorf("[MethodConfig] The configuration tps.limit.interval for %s must be positive, please check your configuration", qualifieldMethodName)
- }
- }
-
- if m.TpsLimitRate != "" {
- tpsLimitRate, err := strconv.ParseInt(m.TpsLimitRate, 0, 0)
- if err != nil {
- return fmt.Errorf("[MethodConfig] Cannot parse the configuration tps.limit.rate for method %s, please check your configuration", qualifieldMethodName)
- }
- if tpsLimitRate < 0 {
- return fmt.Errorf("[MethodConfig] The configuration tps.limit.rate for method %s must be positive, please check your configuration", qualifieldMethodName)
- }
- }
-
- if err := defaults.Set(m); err != nil {
- return err
- }
- return verify(m)
-}
diff --git a/config/metric_config.go b/config/metric_config.go
deleted file mode 100644
index 12875d7d2..000000000
--- a/config/metric_config.go
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * 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
-
-import (
- "strconv"
-)
-
-import (
- "github.com/creasty/defaults"
-
- "github.com/pkg/errors"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/metrics"
-)
-
-// MetricsConfig This is the config struct for all metrics implementation
-type MetricsConfig struct {
- Enable *bool `default:"false" yaml:"enable" json:"enable,omitempty" property:"enable"`
- Port string `default:"9090" yaml:"port" json:"port,omitempty" property:"port"`
- Path string `default:"/metrics" yaml:"path" json:"path,omitempty" property:"path"`
- Protocol string `default:"prometheus" yaml:"protocol" json:"protocol,omitempty" property:"protocol"`
- EnableMetadata *bool `default:"false" yaml:"enable-metadata" json:"enable-metadata,omitempty" property:"enable-metadata"`
- EnableRegistry *bool `default:"false" yaml:"enable-registry" json:"enable-registry,omitempty" property:"enable-registry"`
- EnableConfigCenter *bool `default:"false" yaml:"enable-config-center" json:"enable-config-center,omitempty" property:"enable-config-center"`
- Prometheus *PrometheusConfig `yaml:"prometheus" json:"prometheus" property:"prometheus"`
- Aggregation *AggregateConfig `yaml:"aggregation" json:"aggregation" property:"aggregation"`
- Probe *ProbeConfig `yaml:"probe" json:"probe" property:"probe"`
- rootConfig *RootConfig
-}
-
-type AggregateConfig struct {
- Enabled *bool `default:"false" yaml:"enabled" json:"enabled,omitempty" property:"enabled"`
- BucketNum int `default:"10" yaml:"bucket-num" json:"bucket-num,omitempty" property:"bucket-num"`
- TimeWindowSeconds int `default:"120" yaml:"time-window-seconds" json:"time-window-seconds,omitempty" property:"time-window-seconds"`
-}
-
-type PrometheusConfig struct {
- Exporter *Exporter `yaml:"exporter" json:"exporter,omitempty" property:"exporter"`
- Pushgateway *PushgatewayConfig `yaml:"pushgateway" json:"pushgateway,omitempty" property:"pushgateway"`
-}
-
-type ProbeConfig struct {
- Enabled *bool `default:"false" yaml:"enabled" json:"enabled,omitempty" property:"enabled"`
- Port string `default:"22222" yaml:"port" json:"port,omitempty" property:"port"`
- LivenessPath string `default:"/live" yaml:"liveness-path" json:"liveness-path,omitempty" property:"liveness-path"`
- ReadinessPath string `default:"/ready" yaml:"readiness-path" json:"readiness-path,omitempty" property:"readiness-path"`
- StartupPath string `default:"/startup" yaml:"startup-path" json:"startup-path,omitempty" property:"startup-path"`
- UseInternalState *bool `default:"true" yaml:"use-internal-state" json:"use-internal-state,omitempty" property:"use-internal-state"`
-}
-
-type Exporter struct {
- Enabled *bool `default:"true" yaml:"enabled" json:"enabled,omitempty" property:"enabled"`
-}
-
-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"`
-}
-
-func (mc *MetricsConfig) ToReporterConfig() *metrics.ReporterConfig {
- defaultMetricsReportConfig := metrics.NewReporterConfig()
-
- defaultMetricsReportConfig.Enable = *mc.Enable
- defaultMetricsReportConfig.Port = mc.Port
- defaultMetricsReportConfig.Path = mc.Path
- defaultMetricsReportConfig.Protocol = mc.Protocol
- return defaultMetricsReportConfig
-}
-
-func (mc *MetricsConfig) Init(rc *RootConfig) error {
- if mc == nil {
- return errors.New("metrics config is null")
- }
- if err := defaults.Set(mc); err != nil {
- return err
- }
- if err := verify(mc); err != nil {
- return err
- }
- mc.rootConfig = rc
- if *mc.Enable {
- metrics.Init(mc.toURL())
- }
- return nil
-}
-
-type MetricConfigBuilder struct {
- metricConfig *MetricsConfig
-}
-
-func NewMetricConfigBuilder() *MetricConfigBuilder {
- return &MetricConfigBuilder{metricConfig: &MetricsConfig{}}
-}
-
-func (mcb *MetricConfigBuilder) SetMetadataEnabled(enabled bool) *MetricConfigBuilder {
- mcb.metricConfig.EnableMetadata = &enabled
- return mcb
-}
-
-func (mcb *MetricConfigBuilder) SetRegistryEnabled(enabled bool) *MetricConfigBuilder {
- mcb.metricConfig.EnableRegistry = &enabled
- return mcb
-}
-
-func (mcb *MetricConfigBuilder) SetConfigCenterEnabled(enabled bool) *MetricConfigBuilder {
- mcb.metricConfig.EnableConfigCenter = &enabled
- return mcb
-}
-
-func (mcb *MetricConfigBuilder) Build() *MetricsConfig {
- return mcb.metricConfig
-}
-
-// DynamicUpdateProperties dynamically update properties.
-func (mc *MetricsConfig) DynamicUpdateProperties(newMetricConfig *MetricsConfig) {
- // TODO update
-}
-
-// prometheus://localhost:9090?&histogram.enabled=false&prometheus.exporter.enabled=false
-func (mc *MetricsConfig) toURL() *common.URL {
- url, _ := common.NewURL("localhost", common.WithProtocol(mc.Protocol))
- url.SetParam(constant.PrometheusExporterMetricsPortKey, mc.Port)
- url.SetParam(constant.PrometheusExporterMetricsPathKey, mc.Path)
- url.SetParam(constant.ApplicationKey, mc.rootConfig.Application.Name)
- url.SetParam(constant.AppVersionKey, mc.rootConfig.Application.Version)
- url.SetParam(constant.RpcEnabledKey, strconv.FormatBool(*mc.Enable))
- url.SetParam(constant.MetadataEnabledKey, strconv.FormatBool(*mc.EnableMetadata))
- url.SetParam(constant.RegistryEnabledKey, strconv.FormatBool(*mc.EnableRegistry))
- url.SetParam(constant.ConfigCenterEnabledKey, strconv.FormatBool(*mc.EnableConfigCenter))
- if mc.Aggregation != nil {
- url.SetParam(constant.AggregationEnabledKey, strconv.FormatBool(*mc.Aggregation.Enabled))
- url.SetParam(constant.AggregationBucketNumKey, strconv.Itoa(mc.Aggregation.BucketNum))
- url.SetParam(constant.AggregationTimeWindowSecondsKey, strconv.Itoa(mc.Aggregation.TimeWindowSeconds))
- }
- if mc.Prometheus != nil {
- if mc.Prometheus.Exporter != nil {
- exporter := mc.Prometheus.Exporter
- url.SetParam(constant.PrometheusExporterEnabledKey, strconv.FormatBool(*exporter.Enabled))
- }
- if mc.Prometheus.Pushgateway != nil {
- pushGateWay := mc.Prometheus.Pushgateway
- url.SetParam(constant.PrometheusPushgatewayEnabledKey, strconv.FormatBool(*pushGateWay.Enabled))
- url.SetParam(constant.PrometheusPushgatewayBaseUrlKey, pushGateWay.BaseUrl)
- url.SetParam(constant.PrometheusPushgatewayUsernameKey, pushGateWay.Username)
- url.SetParam(constant.PrometheusPushgatewayPasswordKey, pushGateWay.Password)
- url.SetParam(constant.PrometheusPushgatewayPushIntervalKey, strconv.Itoa(pushGateWay.PushInterval))
- url.SetParam(constant.PrometheusPushgatewayJobKey, pushGateWay.Job)
- }
- }
- return url
-}
diff --git a/config/metric_config_test.go b/config/metric_config_test.go
deleted file mode 100644
index e87bd1830..000000000
--- a/config/metric_config_test.go
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
-)
-
-func TestMetricConfigBuilder(t *testing.T) {
- config := NewMetricConfigBuilder().
- SetConfigCenterEnabled(false).
- SetMetadataEnabled(false).
- SetRegistryEnabled(false).
- Build()
- enable := false
- assert.Equal(t, &MetricsConfig{
- EnableConfigCenter: &enable,
- EnableMetadata: &enable,
- EnableRegistry: &enable,
- }, config)
-}
diff --git a/config/mock_rpcservice.go b/config/mock_rpcservice.go
deleted file mode 100644
index 3a769e8b3..000000000
--- a/config/mock_rpcservice.go
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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
-
-import (
- "context"
-)
-
-// MockService mocks the rpc service for test
-type MockService struct{}
-
-// Reference mocks the Reference method
-func (*MockService) Reference() string {
- return "MockService"
-}
-
-// GetUser mocks the GetUser method
-func (*MockService) GetUser(ctx context.Context, itf []any, str *struct{}) error {
- return nil
-}
-
-// GetUser1 mocks the GetUser1 method
-func (*MockService) GetUser1(ctx context.Context, itf []any, str *struct{}) error {
- return nil
-}
diff --git a/config/mock_rpcservice_test.go b/config/mock_rpcservice_test.go
deleted file mode 100644
index b7af8ef78..000000000
--- a/config/mock_rpcservice_test.go
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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
-
-import (
- "context"
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-func TestMockService(t *testing.T) {
-
- mockService := &MockService{}
- reference := mockService.Reference()
- assert.Equal(t, "MockService", reference)
-
- err := mockService.GetUser1(context.TODO(), nil, nil)
- require.NoError(t, err)
- err = mockService.GetUser(context.TODO(), nil, nil)
- require.NoError(t, err)
-}
diff --git a/config/options.go b/config/options.go
deleted file mode 100644
index ca607c84f..000000000
--- a/config/options.go
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * 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
-
-import (
- "strconv"
- "time"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/global"
-)
-
-type MethodOption func(*MethodOptions)
-
-func WithInterfaceId(id string) MethodOption {
- return func(opts *MethodOptions) {
- opts.Method.InterfaceId = id
- }
-}
-
-func WithInterfaceName(name string) MethodOption {
- return func(opts *MethodOptions) {
- opts.Method.InterfaceName = name
- }
-}
-
-func WithName(name string) MethodOption {
- return func(opts *MethodOptions) {
- opts.Method.Name = name
- }
-}
-
-func WithRetries(retries int) MethodOption {
- return func(opts *MethodOptions) {
- opts.Method.Retries = strconv.Itoa(retries)
- }
-}
-
-func WithLoadBalance(lb string) MethodOption {
- return func(opts *MethodOptions) {
- opts.Method.LoadBalance = lb
- }
-}
-
-func WithWeight(weight int64) MethodOption {
- return func(opts *MethodOptions) {
- opts.Method.Weight = weight
- }
-}
-
-func WithTpsLimitInterval(interval int) MethodOption {
- return func(opts *MethodOptions) {
- opts.Method.TpsLimitInterval = strconv.Itoa(interval)
- }
-}
-
-func WithTpsLimitRate(rate int) MethodOption {
- return func(opts *MethodOptions) {
- opts.Method.TpsLimitRate = strconv.Itoa(rate)
- }
-}
-
-func WithTpsLimitStrategy(strategy string) MethodOption {
- return func(opts *MethodOptions) {
- opts.Method.TpsLimitStrategy = strategy
- }
-}
-
-func WithExecuteLimit(limit int) MethodOption {
- return func(opts *MethodOptions) {
- opts.Method.ExecuteLimit = strconv.Itoa(limit)
- }
-}
-
-func WithExecuteLimitRejectedHandler(handler string) MethodOption {
- return func(opts *MethodOptions) {
- opts.Method.ExecuteLimitRejectedHandler = handler
- }
-}
-
-func WithSticky() MethodOption {
- return func(opts *MethodOptions) {
- opts.Method.Sticky = true
- }
-}
-
-func WithRequestTimeout(timeout time.Duration) MethodOption {
- return func(opts *MethodOptions) {
- opts.Method.RequestTimeout = timeout.String()
- }
-}
-
-type MethodOptions struct {
- Method *global.MethodConfig
-}
-
-func defaultMethodOptions() *MethodOptions {
- return &MethodOptions{Method: &global.MethodConfig{}}
-}
-
-func NewMethodOptions(opts ...MethodOption) *MethodOptions {
- defOpts := defaultMethodOptions()
- for _, opt := range opts {
- opt(defOpts)
- }
- return defOpts
-}
diff --git a/config/otel_config.go b/config/otel_config.go
deleted file mode 100644
index cf7a352e4..000000000
--- a/config/otel_config.go
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * 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
-
-import (
- "github.com/creasty/defaults"
-
- "github.com/dubbogo/gost/log/logger"
-
- "github.com/pkg/errors"
-
- "go.opentelemetry.io/otel"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/extension"
- "dubbo.apache.org/dubbo-go/v3/otel/trace"
-)
-
-type OtelConfig struct {
- TraceConfig *OtelTraceConfig `yaml:"tracing" json:"trace,omitempty" property:"trace"`
-}
-
-type OtelTraceConfig struct {
- Enable *bool `default:"false" yaml:"enable" json:"enable,omitempty" property:"enable"`
- Exporter string `default:"stdout" yaml:"exporter" json:"exporter,omitempty" property:"exporter"` // stdout, jaeger, zipkin, otlp-http, otlp-grpc
- Endpoint string `default:"" yaml:"endpoint" json:"endpoint,omitempty" property:"endpoint"`
- Propagator string `default:"w3c" yaml:"propagator" json:"propagator,omitempty" property:"propagator"` // one of w3c(standard), b3(for zipkin),
- SampleMode string `default:"ratio" yaml:"sample-mode" json:"sample-mode,omitempty" property:"sample-mode"` // one of always, never, ratio
- SampleRatio float64 `default:"0.5" yaml:"sample-ratio" json:"sample-ratio,omitempty" property:"sample-ratio"` // [0.0, 1.0]
- Insecure bool `default:"false" yaml:"insecure" json:"insecure,omitempty" property:"insecure"`
-}
-
-func (oc *OtelConfig) Init(appConfig *ApplicationConfig) error {
- if oc == nil {
- return errors.New("otel config is nil")
- }
- if err := defaults.Set(oc); err != nil {
- return err
- }
- if err := verify(oc); err != nil {
- return err
- }
- if *oc.TraceConfig.Enable {
- extension.AddCustomShutdownCallback(extension.GetTraceShutdownCallback())
- return oc.TraceConfig.init(appConfig)
- }
-
- return nil
-}
-
-func (c *OtelTraceConfig) init(appConfig *ApplicationConfig) error {
- exporter, err := extension.GetTraceExporter(c.Exporter, c.toTraceProviderConfig(appConfig))
- if err != nil {
- return err
- }
- otel.SetTracerProvider(exporter.GetTracerProvider())
- otel.SetTextMapPropagator(exporter.GetPropagator())
-
- // print trace exporter configuration
- if c.Exporter == "stdout" {
- logger.Infof("enable %s trace provider with propagator: %s", c.Exporter, c.Propagator)
- } else {
- logger.Infof("enable %s trace provider with endpoint: %s, propagator: %s", c.Exporter, c.Endpoint, c.Propagator)
- }
- logger.Infof("sample mode: %s", c.SampleMode)
- if c.SampleMode == "ratio" {
- logger.Infof("sample ratio: %.2f", c.SampleRatio)
- }
-
- return nil
-}
-
-func (c *OtelTraceConfig) toTraceProviderConfig(a *ApplicationConfig) *trace.ExporterConfig {
- tpc := &trace.ExporterConfig{
- Exporter: c.Exporter,
- Endpoint: c.Endpoint,
- SampleMode: c.SampleMode,
- SampleRatio: c.SampleRatio,
- Propagator: c.Propagator,
- ServiceNamespace: a.Organization,
- ServiceName: a.Name,
- ServiceVersion: a.Version,
- Insecure: c.Insecure,
- }
- return tpc
-}
-
-type OtelConfigBuilder struct {
- otelConfig *OtelConfig
-}
-
-func NewOtelConfigBuilder() *OtelConfigBuilder {
- return &OtelConfigBuilder{
- otelConfig: &OtelConfig{
- TraceConfig: &OtelTraceConfig{},
- },
- }
-}
-
-func (ocb *OtelConfigBuilder) Build() *OtelConfig {
- return ocb.otelConfig
-}
-
-// TODO: dynamic config
diff --git a/config/otel_config_test.go b/config/otel_config_test.go
deleted file mode 100644
index 20f6db6e2..000000000
--- a/config/otel_config_test.go
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-func TestNewOtelConfigBuilder(t *testing.T) {
- config := NewOtelConfigBuilder().Build()
- assert.NotNil(t, config)
- assert.NotNil(t, config.TraceConfig)
-
- ac := NewApplicationConfigBuilder().Build()
- err := config.Init(ac)
- require.NoError(t, err)
-
- tpc := config.TraceConfig.toTraceProviderConfig(ac)
- assert.NotNil(t, tpc)
-}
diff --git a/config/profiles_config.go b/config/profiles_config.go
deleted file mode 100644
index a47c8a719..000000000
--- a/config/profiles_config.go
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-var (
- defaultActive = "default"
-)
-
-type ProfilesConfig struct {
- // active profiles
- Active string
-}
-
-// Prefix dubbo.profiles
-func (ProfilesConfig) Prefix() string {
- return constant.ProfilesConfigPrefix
-}
-
-// getLegalActive if active is null return default
-func getLegalActive(active string) string {
- if len(active) == 0 {
- return defaultActive
- }
- return active
-}
diff --git a/config/profiles_config_test.go b/config/profiles_config_test.go
deleted file mode 100644
index e16c3a7a1..000000000
--- a/config/profiles_config_test.go
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
-)
-
-import (
- "github.com/knadh/koanf"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-func TestProfilesConfig_Prefix(t *testing.T) {
- profiles := &ProfilesConfig{}
- assert.Equal(t, constant.ProfilesConfigPrefix, profiles.Prefix())
-}
-
-func TestLoaderConf_MergeConfig(t *testing.T) {
- rc := NewRootConfigBuilder().Build()
- conf := NewLoaderConf(WithPath("./testdata/config/active/application.yaml"))
- koan := GetConfigResolver(conf)
- koan = conf.MergeConfig(koan)
-
- err := koan.UnmarshalWithConf(rc.Prefix(), rc, koanf.UnmarshalConf{Tag: "yaml"})
- require.NoError(t, err)
-
- registries := rc.Registries
- assert.NotNil(t, registries)
- assert.Equal(t, "10s", registries["nacos"].Timeout)
- assert.Equal(t, "nacos://127.0.0.1:8848", registries["nacos"].Address)
-
- protocols := rc.Protocols
- assert.NotNil(t, protocols)
- assert.Equal(t, "dubbo", protocols["dubbo"].Name)
- assert.Equal(t, "20000", protocols["dubbo"].Port)
-
- consumer := rc.Consumer
- assert.NotNil(t, consumer)
- assert.Equal(t, "dubbo", consumer.References["helloService"].Protocol)
- assert.Equal(t, "org.github.dubbo.HelloService", consumer.References["helloService"].InterfaceName)
-}
-
-func Test_getLegalActive(t *testing.T) {
-
- t.Run("default", func(t *testing.T) {
- active := getLegalActive("")
- assert.Equal(t, "default", active)
- })
-
- t.Run("normal", func(t *testing.T) {
- active := getLegalActive("active")
- assert.Equal(t, "active", active)
- })
-}
diff --git a/config/protocol_config.go b/config/protocol_config.go
deleted file mode 100644
index f75a1c849..000000000
--- a/config/protocol_config.go
+++ /dev/null
@@ -1,100 +0,0 @@
-/*
- * 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
-
-import (
- "github.com/creasty/defaults"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-// ProtocolConfig is protocol configuration
-type ProtocolConfig struct {
- 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:"50051" yaml:"port" json:"port,omitempty" property:"port"`
- Params any `yaml:"params" json:"params,omitempty" property:"params"`
-
- TripleConfig *TripleConfig `yaml:"triple" json:"triple,omitempty" property:"triple"`
-
- // MaxServerSendMsgSize max size of server send message, 1mb=1000kb=1000000b 1mib=1024kb=1048576b.
- // more detail to see https://pkg.go.dev/github.com/dustin/go-humanize#pkg-constants
- MaxServerSendMsgSize string `yaml:"max-server-send-msg-size" json:"max-server-send-msg-size,omitempty"`
- // MaxServerRecvMsgSize max size of server receive message
- MaxServerRecvMsgSize string `default:"4mib" yaml:"max-server-recv-msg-size" json:"max-server-recv-msg-size,omitempty"`
-}
-
-// Prefix dubbo.config-center
-func (ProtocolConfig) Prefix() string {
- return constant.ConfigCenterPrefix
-}
-
-func GetProtocolsInstance() map[string]*ProtocolConfig {
- return make(map[string]*ProtocolConfig, 1)
-}
-
-func (p *ProtocolConfig) Init() error {
- if err := defaults.Set(p); err != nil {
- return err
- }
- return verify(p)
-}
-
-func NewProtocolConfigBuilder() *ProtocolConfigBuilder {
- return &ProtocolConfigBuilder{protocolConfig: &ProtocolConfig{}}
-}
-
-type ProtocolConfigBuilder struct {
- protocolConfig *ProtocolConfig
-}
-
-func (pcb *ProtocolConfigBuilder) SetName(name string) *ProtocolConfigBuilder {
- pcb.protocolConfig.Name = name
- return pcb
-}
-
-func (pcb *ProtocolConfigBuilder) SetIp(ip string) *ProtocolConfigBuilder {
- pcb.protocolConfig.Ip = ip
- return pcb
-}
-
-func (pcb *ProtocolConfigBuilder) SetPort(port string) *ProtocolConfigBuilder {
- pcb.protocolConfig.Port = port
- return pcb
-}
-
-func (pcb *ProtocolConfigBuilder) SetParams(params any) *ProtocolConfigBuilder {
- pcb.protocolConfig.Params = params
- return pcb
-}
-
-func (pcb *ProtocolConfigBuilder) SetMaxServerSendMsgSize(maxServerSendMsgSize string) *ProtocolConfigBuilder {
- pcb.protocolConfig.MaxServerSendMsgSize = maxServerSendMsgSize
- return pcb
-}
-
-func (pcb *ProtocolConfigBuilder) SetMaxServerRecvMsgSize(maxServerRecvMsgSize string) *ProtocolConfigBuilder {
- pcb.protocolConfig.MaxServerRecvMsgSize = maxServerRecvMsgSize
- return pcb
-}
-
-func (pcb *ProtocolConfigBuilder) Build() *ProtocolConfig {
- return pcb.protocolConfig
-}
diff --git a/config/protocol_config_test.go b/config/protocol_config_test.go
deleted file mode 100644
index 543ed3433..000000000
--- a/config/protocol_config_test.go
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-func TestGetProtocolsConfig(t *testing.T) {
-
- t.Run("empty use default", func(t *testing.T) {
- err := Load(WithPath("./testdata/config/protocol/empty_application.yaml"))
- require.NoError(t, err)
- protocols := GetRootConfig().Protocols
- assert.NotNil(t, protocols)
- // default
- assert.Equal(t, "tri", protocols["tri"].Name)
- assert.Equal(t, string("50051"), protocols["tri"].Port)
- assert.Equal(t, "4mib", protocols["tri"].MaxServerRecvMsgSize)
- })
-
- t.Run("use config", func(t *testing.T) {
- err := Load(WithPath("./testdata/config/protocol/application.yaml"))
- require.NoError(t, err)
- protocols := GetRootConfig().Protocols
- assert.NotNil(t, protocols)
- // default
- assert.Equal(t, "dubbo", protocols["dubbo"].Name)
- assert.Equal(t, string("20000"), protocols["dubbo"].Port)
- assert.Equal(t, "4mib", protocols["dubbo"].MaxServerSendMsgSize)
- assert.Equal(t, "4mib", protocols["dubbo"].MaxServerRecvMsgSize)
- })
-}
diff --git a/config/provider_config.go b/config/provider_config.go
deleted file mode 100644
index e84e395d9..000000000
--- a/config/provider_config.go
+++ /dev/null
@@ -1,279 +0,0 @@
-/*
- * 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
-
-import (
- "fmt"
- "strings"
-)
-
-import (
- "github.com/creasty/defaults"
-
- "github.com/dubbogo/gost/log/logger"
-
- tripleConstant "github.com/dubbogo/triple/pkg/common/constant"
-
- perrors "github.com/pkg/errors"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- aslimiter "dubbo.apache.org/dubbo-go/v3/filter/adaptivesvc/limiter"
-)
-
-// ProviderConfig is the default configuration of service provider
-type ProviderConfig struct {
- Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"`
- // Deprecated Register whether registration is required
- Register bool `yaml:"register" json:"register" property:"register"`
- // RegistryIDs is registry ids list
- RegistryIDs []string `yaml:"registry-ids" json:"registry-ids" property:"registry-ids"`
- // protocol
- ProtocolIDs []string `yaml:"protocol-ids" json:"protocol-ids" property:"protocol-ids"`
- // TracingKey is tracing ids list
- TracingKey string `yaml:"tracing-key" json:"tracing-key" property:"tracing-key"`
- // Services services
- Services map[string]*ServiceConfig `yaml:"services" json:"services,omitempty" property:"services"`
- ProxyFactory string `default:"default" yaml:"proxy" json:"proxy,omitempty" property:"proxy"`
- FilterConf any `yaml:"filter_conf" json:"filter_conf,omitempty" property:"filter_conf"`
- ConfigType map[string]string `yaml:"config_type" json:"config_type,omitempty" property:"config_type"`
- // adaptive service
- AdaptiveService bool `yaml:"adaptive-service" json:"adaptive-service" property:"adaptive-service"`
- AdaptiveServiceVerbose bool `yaml:"adaptive-service-verbose" json:"adaptive-service-verbose" property:"adaptive-service-verbose"`
-
- rootConfig *RootConfig
-}
-
-func (ProviderConfig) Prefix() string {
- return constant.ProviderConfigPrefix
-}
-
-func (c *ProviderConfig) check() error {
- if err := defaults.Set(c); err != nil {
- return err
- }
- return verify(c)
-}
-
-func (c *ProviderConfig) Init(rc *RootConfig) error {
- if c == nil {
- return nil
- }
- buildDebugMsg := func() string {
- if len(c.Services) == 0 {
- return "empty"
- }
- providerNames := make([]string, 0, len(c.Services))
- for k := range c.Services {
- providerNames = append(providerNames, k)
- }
- return strings.Join(providerNames, ", ")
- }
- logger.Debugf("Registered provider services are %v", buildDebugMsg())
-
- c.RegistryIDs = translateIds(c.RegistryIDs)
- if len(c.RegistryIDs) <= 0 {
- c.RegistryIDs = rc.getRegistryIds()
- }
- c.ProtocolIDs = translateIds(c.ProtocolIDs)
-
- if c.TracingKey == "" && len(rc.Tracing) > 0 {
- for k := range rc.Tracing {
- c.TracingKey = k
- break
- }
- }
- for key, serviceConfig := range c.Services {
- if serviceConfig.Interface == "" {
- service := GetProviderService(key)
- // try to use interface name defined by pb
- supportPBPackagerNameService, ok := service.(common.TriplePBService)
- if !ok {
- logger.Errorf("Service with reference = %s is not support read interface name from it."+
- "Please run go install github.com/dubbogo/dubbogo-cli/cmd/protoc-gen-go-triple@latest to update your "+
- "protoc-gen-go-triple and re-generate your pb file again."+
- "If you are not using pb serialization, please set 'interface' field in service config.", key)
- continue
- } else {
- // use interface name defined by pb
- serviceConfig.Interface = supportPBPackagerNameService.XXX_InterfaceName()
- }
- }
- if err := serviceConfig.Init(rc); err != nil {
- return err
- }
-
- serviceConfig.adaptiveService = c.AdaptiveService
- }
-
- for k, v := range rc.Protocols {
- if v.Name == tripleConstant.TRIPLE {
- // Auto create grpc based health check service.
- healthService := NewServiceConfigBuilder().
- SetProtocolIDs(k).
- SetNotRegister(true).
- SetInterface(constant.HealthCheckServiceInterface).
- Build()
- if err := healthService.Init(rc); err != nil {
- return err
- }
- c.Services[constant.HealthCheckServiceTypeName] = healthService
-
- // Auto create reflection service configure only when provider with triple service is configured.
- tripleReflectionService := NewServiceConfigBuilder().
- SetProtocolIDs(k).
- SetNotRegister(true).
- SetInterface(constant.ReflectionServiceInterface).
- Build()
- if err := tripleReflectionService.Init(rc); err != nil {
- return err
- }
- // Maybe only register once, If setting this service, break from traversing Protocols.
- c.Services[constant.ReflectionServiceTypeName] = tripleReflectionService
- break
- }
- }
-
- if err := c.check(); err != nil {
- return err
- }
- // enable adaptive service verbose
- if c.AdaptiveServiceVerbose {
- if !c.AdaptiveService {
- return perrors.Errorf("The adaptive service is disabled, " +
- "adaptive service verbose should be disabled either.")
- }
- logger.Infof("adaptive service verbose is enabled.")
- logger.Debugf("debug-level info could be shown.")
- aslimiter.Verbose = true
- }
- return nil
-}
-
-func (c *ProviderConfig) Load() {
- for registeredTypeName, service := range GetProviderServiceMap() {
- serviceConfig, ok := c.Services[registeredTypeName]
- if !ok {
- if registeredTypeName == constant.ReflectionServiceTypeName ||
- registeredTypeName == constant.HealthCheckServiceTypeName {
- // do not auto generate reflection or health check server's configuration.
- continue
- }
- // service doesn't config in config file, create one with default
- supportPBPackagerNameService, ok := service.(common.TriplePBService)
- if !ok {
- logger.Warnf(
- "The provider service %s is ignored: neither the config is found, nor it is a valid Triple service.",
- registeredTypeName)
- continue
- }
- serviceConfig = NewServiceConfigBuilder().Build()
- // use interface name defined by pb
- serviceConfig.Interface = supportPBPackagerNameService.XXX_InterfaceName()
- if err := serviceConfig.Init(GetRootConfig()); err != nil {
- logger.Errorf("Service with registeredTypeName = %s init failed with error = %#v", registeredTypeName, err)
- }
- serviceConfig.adaptiveService = c.AdaptiveService
- }
- serviceConfig.id = registeredTypeName
- serviceConfig.Implement(service)
- if err := serviceConfig.Export(); err != nil {
- logger.Errorf(fmt.Sprintf("service with registeredTypeName = %s export failed! err: %#v", registeredTypeName, err))
- }
- }
-}
-
-// newEmptyProviderConfig returns ProviderConfig with default ApplicationConfig
-func newEmptyProviderConfig() *ProviderConfig {
- newProviderConfig := &ProviderConfig{
- Services: make(map[string]*ServiceConfig),
- RegistryIDs: make([]string, 8),
- ProtocolIDs: make([]string, 8),
- }
- return newProviderConfig
-}
-
-type ProviderConfigBuilder struct {
- providerConfig *ProviderConfig
-}
-
-func NewProviderConfigBuilder() *ProviderConfigBuilder {
- return &ProviderConfigBuilder{providerConfig: newEmptyProviderConfig()}
-}
-
-func (pcb *ProviderConfigBuilder) SetFilter(filter string) *ProviderConfigBuilder {
- pcb.providerConfig.Filter = filter
- return pcb
-}
-
-func (pcb *ProviderConfigBuilder) SetRegister(register bool) *ProviderConfigBuilder {
- pcb.providerConfig.Register = register
- return pcb
-}
-
-func (pcb *ProviderConfigBuilder) SetRegistryIDs(RegistryIDs ...string) *ProviderConfigBuilder {
- pcb.providerConfig.RegistryIDs = RegistryIDs
- return pcb
-}
-
-func (pcb *ProviderConfigBuilder) SetServices(services map[string]*ServiceConfig) *ProviderConfigBuilder {
- pcb.providerConfig.Services = services
- return pcb
-}
-
-func (pcb *ProviderConfigBuilder) AddService(serviceID string, serviceConfig *ServiceConfig) *ProviderConfigBuilder {
- if pcb.providerConfig.Services == nil {
- pcb.providerConfig.Services = make(map[string]*ServiceConfig)
- }
- pcb.providerConfig.Services[serviceID] = serviceConfig
- return pcb
-}
-
-func (pcb *ProviderConfigBuilder) SetProxyFactory(proxyFactory string) *ProviderConfigBuilder {
- pcb.providerConfig.ProxyFactory = proxyFactory
- return pcb
-}
-
-func (pcb *ProviderConfigBuilder) SetFilterConf(filterConf any) *ProviderConfigBuilder {
- pcb.providerConfig.FilterConf = filterConf
- return pcb
-}
-
-func (pcb *ProviderConfigBuilder) SetConfigType(configType map[string]string) *ProviderConfigBuilder {
- pcb.providerConfig.ConfigType = configType
- return pcb
-}
-
-func (pcb *ProviderConfigBuilder) AddConfigType(key, value string) *ProviderConfigBuilder {
- if pcb.providerConfig.ConfigType == nil {
- pcb.providerConfig.ConfigType = make(map[string]string)
- }
- pcb.providerConfig.ConfigType[key] = value
- return pcb
-}
-
-func (pcb *ProviderConfigBuilder) SetRootConfig(rootConfig *RootConfig) *ProviderConfigBuilder {
- pcb.providerConfig.rootConfig = rootConfig
- return pcb
-}
-
-func (pcb *ProviderConfigBuilder) Build() *ProviderConfig {
- return pcb.providerConfig
-}
diff --git a/config/provider_config_test.go b/config/provider_config_test.go
deleted file mode 100644
index 8dc861cce..000000000
--- a/config/provider_config_test.go
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- _ "dubbo.apache.org/dubbo-go/v3/metadata/report/nacos"
-)
-
-func TestProviderConfigEmptyRegistry(t *testing.T) {
- err := Load(WithPath("./testdata/config/provider/empty_registry_application.yaml"))
- require.NoError(t, err)
- provider := GetRootConfig().Provider
- assert.Len(t, provider.RegistryIDs, 1)
- assert.Equal(t, "nacos", provider.RegistryIDs[0])
-}
-
-func TestProviderConfigRootRegistry(t *testing.T) {
- err := Load(WithPath("./testdata/config/provider/registry_application.yaml"))
- require.NoError(t, err)
- provider := GetRootConfig().Provider
- assert.NotNil(t, provider)
- assert.NotNil(t, provider.Services["HelloService"])
- assert.NotNil(t, provider.Services["OrderService"])
-
- assert.Len(t, provider.Services["HelloService"].RegistryIDs, 2)
- assert.Len(t, provider.Services["OrderService"].RegistryIDs, 1)
-}
-
-//
-//func TestConsumerInitWithDefaultProtocol(t *testing.T) {
-// conPath, err := filepath.Abs("./testdata/consumer_config_withoutProtocol.yml")
-// require.NoError(t, err)
-// assert.NoError(t, consumer.ConsumerInit(conPath))
-// assert.Equal(t, "dubbo", config.consumerConfig.References["UserProvider"].Protocol)
-//}
-//
-//func TestProviderInitWithDefaultProtocol(t *testing.T) {
-// conPath, err := filepath.Abs("./testdata/provider_config_withoutProtocol.yml")
-// require.NoError(t, err)
-// assert.NoError(t, ProviderInit(conPath))
-// assert.Equal(t, "dubbo", config.referenceConfig.Services["UserProvider"].Protocol)
-//}
-
-func TestNewProviderConfigBuilder(t *testing.T) {
-
- config := NewProviderConfigBuilder().
- SetFilter("echo").
- SetRegister(true).
- SetRegistryIDs("nacos").
- SetServices(map[string]*ServiceConfig{}).
- AddService("HelloService", &ServiceConfig{}).
- SetProxyFactory("default").
- SetFilterConf(nil).
- SetConfigType(map[string]string{}).
- AddConfigType("", "").
- SetRootConfig(nil).
- Build()
-
- err := config.check()
- require.NoError(t, err)
- assert.Equal(t, constant.ProviderConfigPrefix, config.Prefix())
-}
diff --git a/config/reference_config.go b/config/reference_config.go
deleted file mode 100644
index 6ac6f4e81..000000000
--- a/config/reference_config.go
+++ /dev/null
@@ -1,547 +0,0 @@
-/*
- * 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
-
-import (
- "fmt"
- "net/url"
- "os"
- "strconv"
- "time"
-)
-
-import (
- "github.com/creasty/defaults"
-
- "github.com/dubbogo/gost/log/logger"
- gxstrings "github.com/dubbogo/gost/strings"
-
- constant2 "github.com/dubbogo/triple/pkg/common/constant"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/cluster/directory/static"
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/common/extension"
- "dubbo.apache.org/dubbo-go/v3/filter/generic"
- "dubbo.apache.org/dubbo-go/v3/protocol/base"
- "dubbo.apache.org/dubbo-go/v3/protocol/protocolwrapper"
- "dubbo.apache.org/dubbo-go/v3/proxy"
-)
-
-// ReferenceConfig is the configuration of service consumer
-type ReferenceConfig struct {
- pxy *proxy.Proxy
- invoker base.Invoker
- urls []*common.URL
- rootConfig *RootConfig
-
- id string
- InterfaceName string `yaml:"interface" json:"interface,omitempty" property:"interface"`
- Check *bool `yaml:"check" json:"check,omitempty" property:"check"`
- URL string `yaml:"url" json:"url,omitempty" property:"url"`
- Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"`
- Protocol string `yaml:"protocol" json:"protocol,omitempty" property:"protocol"`
- RegistryIDs []string `yaml:"registry-ids" json:"registry-ids,omitempty" property:"registry-ids"`
- Cluster string `yaml:"cluster" json:"cluster,omitempty" property:"cluster"`
- Loadbalance string `yaml:"loadbalance" json:"loadbalance,omitempty" property:"loadbalance"`
- Retries string `yaml:"retries" json:"retries,omitempty" property:"retries"`
- Group string `yaml:"group" json:"group,omitempty" property:"group"`
- Version string `yaml:"version" json:"version,omitempty" property:"version"`
- Serialization string `yaml:"serialization" json:"serialization" property:"serialization"`
- ProvidedBy string `yaml:"provided_by" json:"provided_by,omitempty" property:"provided_by"`
-
- MethodsConfig []*MethodConfig `yaml:"methods" json:"methods,omitempty" property:"methods"`
- // TODO: rename protocol_config to protocol when publish 4.0.0.
- ProtocolClientConfig *ClientProtocolConfig `yaml:"protocol_config" json:"protocol_config,omitempty" property:"protocol_config"`
-
- Async bool `yaml:"async" json:"async,omitempty" property:"async"`
- Params map[string]string `yaml:"params" json:"params,omitempty" property:"params"`
- Generic string `yaml:"generic" json:"generic,omitempty" property:"generic"`
- Sticky bool `yaml:"sticky" json:"sticky,omitempty" property:"sticky"`
- RequestTimeout string `yaml:"timeout" json:"timeout,omitempty" property:"timeout"`
- ForceTag bool `yaml:"force.tag" json:"force.tag,omitempty" property:"force.tag"`
- TracingKey string `yaml:"tracing-key" json:"tracing-key,omitempty" propertiy:"tracing-key"`
- metaDataType string
- metricsEnable bool
- MeshProviderPort int `yaml:"mesh-provider-port" json:"mesh-provider-port,omitempty" propertiy:"mesh-provider-port"`
-}
-
-func (rc *ReferenceConfig) Prefix() string {
- return constant.ReferenceConfigPrefix + rc.InterfaceName + "."
-}
-
-func (rc *ReferenceConfig) Init(root *RootConfig) error {
- for _, method := range rc.MethodsConfig {
- if err := method.Init(); err != nil {
- return err
- }
- }
- if err := defaults.Set(rc); err != nil {
- return err
- }
- rc.rootConfig = root
- if root.Application != nil {
- rc.metaDataType = root.Application.MetadataType
- if rc.Group == "" {
- rc.Group = root.Application.Group
- }
- if rc.Version == "" {
- rc.Version = root.Application.Version
- }
- }
- rc.RegistryIDs = translateIds(rc.RegistryIDs)
- if root.Consumer != nil {
- if rc.Filter == "" {
- rc.Filter = root.Consumer.Filter
- }
- if len(rc.RegistryIDs) <= 0 {
- rc.RegistryIDs = root.Consumer.RegistryIDs
- }
- if rc.Protocol == "" {
- rc.Protocol = root.Consumer.Protocol
- }
- if rc.RequestTimeout == "" && root.Consumer.RequestTimeout != "" {
- rc.RequestTimeout = root.Consumer.RequestTimeout
- }
- if rc.TracingKey == "" {
- rc.TracingKey = root.Consumer.TracingKey
- }
- if rc.Check == nil {
- rc.Check = &root.Consumer.Check
- }
- }
- if rc.Cluster == "" {
- rc.Cluster = "failover"
- }
- if root.Metrics.Enable != nil {
- rc.metricsEnable = *root.Metrics.Enable
- }
-
- return verify(rc)
-}
-
-func getEnv(key, fallback string) string {
- if value, ok := os.LookupEnv(key); ok {
- return value
- }
- return fallback
-}
-
-func updateOrCreateMeshURL(rc *ReferenceConfig) {
- if rc.URL != "" {
- logger.Infof("URL specified explicitly %v", rc.URL)
- }
-
- if !rc.rootConfig.Consumer.MeshEnabled {
- return
- }
- if rc.Protocol != constant2.TRIPLE {
- panic(fmt.Sprintf("Mesh mode enabled, Triple protocol expected but %v protocol found!", rc.Protocol))
- }
- if rc.ProvidedBy == "" {
- panic("Mesh mode enabled, provided-by should not be empty!")
- }
-
- podNamespace := getEnv(constant.PodNamespaceEnvKey, constant.DefaultNamespace)
- clusterDomain := getEnv(constant.ClusterDomainKey, constant.DefaultClusterDomain)
-
- var meshPort int
- if rc.MeshProviderPort > 0 {
- meshPort = rc.MeshProviderPort
- } else {
- meshPort = constant.DefaultMeshPort
- }
-
- rc.URL = "tri://" + rc.ProvidedBy + "." + podNamespace + constant.SVC + clusterDomain + ":" + strconv.Itoa(meshPort)
-}
-
-// Refer retrieves invokers from urls.
-func (rc *ReferenceConfig) Refer(srv any) {
- // If adaptive service is enabled,
- // the cluster and load balance should be overridden to "adaptivesvc" and "p2c" respectively.
- if rc.rootConfig.Consumer.AdaptiveService {
- rc.Cluster = constant.ClusterKeyAdaptiveService
- rc.Loadbalance = constant.LoadBalanceKeyP2C
- }
-
- // cfgURL is an interface-level invoker url, in the other words, it represents an interface.
- cfgURL := common.NewURLWithOptions(
- common.WithPath(rc.InterfaceName),
- common.WithProtocol(rc.Protocol),
- common.WithParams(rc.getURLMap()),
- common.WithParamsValue(constant.BeanNameKey, rc.id),
- common.WithParamsValue(constant.MetadataTypeKey, rc.metaDataType),
- )
-
- SetConsumerServiceByInterfaceName(rc.InterfaceName, srv)
- if rc.ForceTag {
- cfgURL.SetParam(constant.ForceUseTag, "true")
- }
- rc.postProcessConfig(cfgURL)
-
- // if mesh-enabled is set
- updateOrCreateMeshURL(rc)
-
- // retrieving urls from config, and appending the urls to rc.urls
- if rc.URL != "" { // use user-specific urls
- /*
- Two types of URL are allowed for rc.URL:
- 1. direct url: server IP, that is, no need for a registry anymore
- 2. registry url
- They will be handled in different ways:
- For example, we have a direct url and a registry url:
- 1. "tri://localhost:10000" is a direct url
- 2. "registry://localhost:2181" is a registry url.
- Then, rc.URL looks like a string separated by semicolon: "tri://localhost:10000;registry://localhost:2181".
- The result of urlStrings is a string array: []string{"tri://localhost:10000", "registry://localhost:2181"}.
- */
- urlStrings := gxstrings.RegSplit(rc.URL, "\\s*[;]+\\s*")
- for _, urlStr := range urlStrings {
- serviceURL, err := common.NewURL(urlStr)
- if err != nil {
- panic(fmt.Sprintf("url configuration error, please check your configuration, user specified URL %v refer error, error message is %v ", urlStr, err))
- }
- if serviceURL.Protocol == constant.RegistryProtocol { // serviceURL in this branch is a registry protocol
- serviceURL.SubURL = cfgURL
- rc.urls = append(rc.urls, serviceURL)
- } else { // serviceURL in this branch is the target endpoint IP address
- if serviceURL.Path == "" {
- serviceURL.Path = "/" + rc.InterfaceName
- }
- // replace params of serviceURL with params of cfgUrl
- // other stuff, e.g. IP, port, etc., are same as serviceURL
- newURL := serviceURL.MergeURL(cfgURL)
- newURL.SetParam("peer", "true")
- rc.urls = append(rc.urls, newURL)
- }
- }
- } else { // use registry configs
- rc.urls = LoadRegistries(rc.RegistryIDs, rc.rootConfig.Registries, common.CONSUMER)
- // set url to regURLs
- for _, regURL := range rc.urls {
- regURL.SubURL = cfgURL
- }
- }
-
- // Get invokers according to rc.urls
- var (
- invoker base.Invoker
- regURL *common.URL
- )
- invokers := make([]base.Invoker, len(rc.urls))
- for i, u := range rc.urls {
- if u.Protocol == constant.ServiceRegistryProtocol {
- invoker = extension.GetProtocol(constant.RegistryProtocol).Refer(u)
- } else {
- invoker = extension.GetProtocol(u.Protocol).Refer(u)
- }
-
- if rc.URL != "" {
- invoker = protocolwrapper.BuildInvokerChain(invoker, constant.ReferenceFilterKey)
- }
-
- invokers[i] = invoker
- if u.Protocol == constant.RegistryProtocol {
- regURL = u
- }
- }
-
- // TODO(hxmhlt): decouple from directory, config should not depend on directory module
- if len(invokers) == 1 {
- rc.invoker = invokers[0]
- if rc.URL != "" {
- hitClu := constant.ClusterKeyFailover
- if u := rc.invoker.GetURL(); u != nil {
- hitClu = u.GetParam(constant.ClusterKey, constant.ClusterKeyZoneAware)
- }
- cluster, err := extension.GetCluster(hitClu)
- if err != nil {
- logger.Errorf("reference config get cluster %s error, error message is %w, will skip this invoker",
- hitClu, err)
- return
- }
- if cluster == nil {
- logger.Errorf("reference config cluster is nil for key %s, will skip this invoker", hitClu)
- return
- }
- rc.invoker = cluster.Join(static.NewDirectory(invokers))
- }
- } else {
- var hitClu string
- if regURL != nil {
- // for multi-subscription scenario, use 'zone-aware' policy by default
- hitClu = constant.ClusterKeyZoneAware
- } else {
- // not a registry url, must be direct invoke.
- hitClu = constant.ClusterKeyFailover
- if u := invokers[0].GetURL(); u != nil {
- hitClu = u.GetParam(constant.ClusterKey, constant.ClusterKeyZoneAware)
- }
- }
- cluster, err := extension.GetCluster(hitClu)
- if err != nil {
- logger.Errorf("reference config get cluster %s error, error message is %w, will skip this invoker",
- hitClu, err)
- return
- }
- if cluster == nil {
- logger.Errorf("reference config cluster is nil for key %s, will skip this invoker", hitClu)
- return
- }
- rc.invoker = cluster.Join(static.NewDirectory(invokers))
- }
-
- // create proxy
- if rc.Async {
- callback := GetCallback(rc.id)
- rc.pxy = extension.GetProxyFactory(rc.rootConfig.Consumer.ProxyFactory).GetAsyncProxy(rc.invoker, callback, cfgURL)
- } else {
- rc.pxy = extension.GetProxyFactory(rc.rootConfig.Consumer.ProxyFactory).GetProxy(rc.invoker, cfgURL)
- }
-}
-
-// Implement
-// @v is service provider implemented RPCService
-func (rc *ReferenceConfig) Implement(v common.RPCService) {
- rc.pxy.Implement(v)
-}
-
-// GetRPCService gets RPCService from proxy
-func (rc *ReferenceConfig) GetRPCService() common.RPCService {
- return rc.pxy.Get()
-}
-
-// GetProxy gets proxy
-func (rc *ReferenceConfig) GetProxy() *proxy.Proxy {
- return rc.pxy
-}
-
-func (rc *ReferenceConfig) getURLMap() url.Values {
- urlMap := url.Values{}
- // first set user params
- for k, v := range rc.Params {
- urlMap.Set(k, v)
- }
-
- urlMap.Set(constant.InterfaceKey, rc.InterfaceName)
- urlMap.Set(constant.TimestampKey, strconv.FormatInt(time.Now().Unix(), 10))
- urlMap.Set(constant.ClusterKey, rc.Cluster)
- urlMap.Set(constant.LoadbalanceKey, rc.Loadbalance)
- urlMap.Set(constant.RetriesKey, rc.Retries)
- urlMap.Set(constant.GroupKey, rc.Group)
- urlMap.Set(constant.VersionKey, rc.Version)
- urlMap.Set(constant.GenericKey, rc.Generic)
- urlMap.Set(constant.RegistryRoleKey, strconv.Itoa(common.CONSUMER))
- urlMap.Set(constant.ProvidedBy, rc.ProvidedBy)
- urlMap.Set(constant.SerializationKey, rc.Serialization)
- urlMap.Set(constant.TracingConfigKey, rc.TracingKey)
-
- urlMap.Set(constant.ReleaseKey, "dubbo-golang-"+constant.Version)
- urlMap.Set(constant.SideKey, (common.RoleType(common.CONSUMER)).Role())
-
- if len(rc.RequestTimeout) != 0 {
- urlMap.Set(constant.TimeoutKey, rc.RequestTimeout)
- }
- // getty invoke async or sync
- urlMap.Set(constant.AsyncKey, strconv.FormatBool(rc.Async))
- urlMap.Set(constant.StickyKey, strconv.FormatBool(rc.Sticky))
-
- // applicationConfig info
- urlMap.Set(constant.ApplicationKey, rc.rootConfig.Application.Name)
- urlMap.Set(constant.OrganizationKey, rc.rootConfig.Application.Organization)
- urlMap.Set(constant.NameKey, rc.rootConfig.Application.Name)
- urlMap.Set(constant.ModuleKey, rc.rootConfig.Application.Module)
- urlMap.Set(constant.AppVersionKey, rc.rootConfig.Application.Version)
- urlMap.Set(constant.OwnerKey, rc.rootConfig.Application.Owner)
- urlMap.Set(constant.EnvironmentKey, rc.rootConfig.Application.Environment)
-
- // filter
- defaultReferenceFilter := constant.DefaultReferenceFilters
- if rc.Generic != "" {
- defaultReferenceFilter = constant.GenericFilterKey + "," + defaultReferenceFilter
- }
- if rc.metricsEnable {
- defaultReferenceFilter += fmt.Sprintf(",%s", constant.MetricsFilterKey)
- }
- urlMap.Set(constant.ReferenceFilterKey, mergeValue(rc.Filter, "", defaultReferenceFilter))
-
- for _, v := range rc.MethodsConfig {
- urlMap.Set("methods."+v.Name+"."+constant.LoadbalanceKey, v.LoadBalance)
- urlMap.Set("methods."+v.Name+"."+constant.RetriesKey, v.Retries)
- urlMap.Set("methods."+v.Name+"."+constant.StickyKey, strconv.FormatBool(v.Sticky))
- if len(v.RequestTimeout) != 0 {
- urlMap.Set("methods."+v.Name+"."+constant.TimeoutKey, v.RequestTimeout)
- }
- }
-
- return urlMap
-}
-
-// GenericLoad ...
-func (rc *ReferenceConfig) GenericLoad(id string) {
- genericService := generic.NewGenericService(id)
- SetConsumerService(genericService)
- rc.id = id
- rc.Refer(genericService)
- rc.Implement(genericService)
-}
-
-// GetInvoker get invoker from ReferenceConfig
-func (rc *ReferenceConfig) GetInvoker() base.Invoker {
- return rc.invoker
-}
-
-// postProcessConfig asks registered ConfigPostProcessor to post-process the current ReferenceConfig.
-func (rc *ReferenceConfig) postProcessConfig(url *common.URL) {
- for _, p := range extension.GetConfigPostProcessors() {
- p.PostProcessReferenceConfig(url)
- }
-}
-
-//////////////////////////////////// reference config api
-
-// newEmptyReferenceConfig returns empty ReferenceConfig
-func newEmptyReferenceConfig() *ReferenceConfig {
- newReferenceConfig := &ReferenceConfig{}
- newReferenceConfig.MethodsConfig = make([]*MethodConfig, 0, 8)
- newReferenceConfig.Params = make(map[string]string, 8)
- return newReferenceConfig
-}
-
-type ReferenceConfigBuilder struct {
- referenceConfig *ReferenceConfig
-}
-
-func NewReferenceConfigBuilder() *ReferenceConfigBuilder {
- return &ReferenceConfigBuilder{referenceConfig: newEmptyReferenceConfig()}
-}
-
-func (pcb *ReferenceConfigBuilder) SetInterface(interfaceName string) *ReferenceConfigBuilder {
- pcb.referenceConfig.InterfaceName = interfaceName
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetRegistryIDs(registryIDs ...string) *ReferenceConfigBuilder {
- pcb.referenceConfig.RegistryIDs = registryIDs
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetGeneric(generic bool) *ReferenceConfigBuilder {
- if generic {
- pcb.referenceConfig.Generic = "true"
- } else {
- pcb.referenceConfig.Generic = "false"
- }
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetCluster(cluster string) *ReferenceConfigBuilder {
- pcb.referenceConfig.Cluster = cluster
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetSerialization(serialization string) *ReferenceConfigBuilder {
- pcb.referenceConfig.Serialization = serialization
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetProtocol(protocol string) *ReferenceConfigBuilder {
- pcb.referenceConfig.Protocol = protocol
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetURL(url string) *ReferenceConfigBuilder {
- pcb.referenceConfig.URL = url
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetFilter(filter string) *ReferenceConfigBuilder {
- pcb.referenceConfig.Filter = filter
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetLoadbalance(loadbalance string) *ReferenceConfigBuilder {
- pcb.referenceConfig.Loadbalance = loadbalance
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetRetries(retries string) *ReferenceConfigBuilder {
- pcb.referenceConfig.Retries = retries
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetGroup(group string) *ReferenceConfigBuilder {
- pcb.referenceConfig.Group = group
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetVersion(version string) *ReferenceConfigBuilder {
- pcb.referenceConfig.Version = version
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetProvidedBy(providedBy string) *ReferenceConfigBuilder {
- pcb.referenceConfig.ProvidedBy = providedBy
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetMethodConfig(methodConfigs []*MethodConfig) *ReferenceConfigBuilder {
- pcb.referenceConfig.MethodsConfig = methodConfigs
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) AddMethodConfig(methodConfig *MethodConfig) *ReferenceConfigBuilder {
- pcb.referenceConfig.MethodsConfig = append(pcb.referenceConfig.MethodsConfig, methodConfig)
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetAsync(async bool) *ReferenceConfigBuilder {
- pcb.referenceConfig.Async = async
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetParams(params map[string]string) *ReferenceConfigBuilder {
- pcb.referenceConfig.Params = params
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetSticky(sticky bool) *ReferenceConfigBuilder {
- pcb.referenceConfig.Sticky = sticky
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetRequestTimeout(requestTimeout string) *ReferenceConfigBuilder {
- pcb.referenceConfig.RequestTimeout = requestTimeout
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetForceTag(forceTag bool) *ReferenceConfigBuilder {
- pcb.referenceConfig.ForceTag = forceTag
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) SetTracingKey(tracingKey string) *ReferenceConfigBuilder {
- pcb.referenceConfig.TracingKey = tracingKey
- return pcb
-}
-
-func (pcb *ReferenceConfigBuilder) Build() *ReferenceConfig {
- return pcb.referenceConfig
-}
diff --git a/config/reference_config_test.go b/config/reference_config_test.go
deleted file mode 100644
index 4844692ff..000000000
--- a/config/reference_config_test.go
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- _ "dubbo.apache.org/dubbo-go/v3/proxy/proxy_factory"
-)
-
-// import (
-//
-// "context"
-// "dubbo.apache.org/dubbo-go/v3/config"
-// "dubbo.apache.org/dubbo-go/v3/config/applicationConfig"
-// "dubbo.apache.org/dubbo-go/v3/config/base"
-// "dubbo.apache.org/dubbo-go/v3/config/consumer"
-// "dubbo.apache.org/dubbo-go/v3/config/instance"
-// "dubbo.apache.org/dubbo-go/v3/config/method"
-// registry2 "dubbo.apache.org/dubbo-go/v3/config/registry"
-// "sync"
-// "testing"
-//
-// )
-//
-// import (
-//
-// "github.com/stretchr/testify/assert"
-//
-// )
-//
-// import (
-//
-// "dubbo.apache.org/dubbo-go/v3/cluster/cluster_impl"
-// "dubbo.apache.org/dubbo-go/v3/common"
-// "dubbo.apache.org/dubbo-go/v3/common/constant"
-// "dubbo.apache.org/dubbo-go/v3/common/extension"
-// "dubbo.apache.org/dubbo-go/v3/filter"
-// "dubbo.apache.org/dubbo-go/v3/protocol"
-// "dubbo.apache.org/dubbo-go/v3/registry"
-//
-// )
-//
-// var regProtocol protocol.Protocol
-//
-// func doInitConsumer() {
-// config.consumerConfig = &consumer.Config{
-// BaseConfig: base.Config{
-// applicationConfig.Config: &applicationConfig.Config{
-// Organization: "dubbo_org",
-// Name: "dubbo",
-// Module: "module",
-// Version: "2.6.0",
-// Owner: "dubbo",
-// Environment: "test",
-// },
-// },
-//
-// Registries: map[string]*registry2.RegistryConfig{
-// "shanghai_reg1": {
-// Protocol: "mock",
-// TimeoutStr: "2s",
-// Group: "shanghai_idc",
-// Address: "127.0.0.1:2181",
-// Username: "user1",
-// Password: "pwd1",
-// },
-// "shanghai_reg2": {
-// Protocol: "mock",
-// TimeoutStr: "2s",
-// Group: "shanghai_idc",
-// Address: "127.0.0.2:2181",
-// Username: "user1",
-// Password: "pwd1",
-// },
-// "hangzhou_reg1": {
-// Protocol: "mock",
-// TimeoutStr: "2s",
-// Group: "hangzhou_idc",
-// Address: "127.0.0.3:2181",
-// Username: "user1",
-// Password: "pwd1",
-// },
-// "hangzhou_reg2": {
-// Protocol: "mock",
-// TimeoutStr: "2s",
-// Group: "hangzhou_idc",
-// Address: "127.0.0.4:2181",
-// Username: "user1",
-// Password: "pwd1",
-// },
-// },
-//
-// References: map[string]*ReferenceConfig{
-// "MockService": {
-// id: "MockProvider",
-// Params: map[string]string{
-// "serviceid": "soa.mock",
-// "forks": "5",
-// },
-// Sticky: false,
-// Registry: "shanghai_reg1,shanghai_reg2,hangzhou_reg1,hangzhou_reg2",
-// InterfaceName: "com.MockService",
-// Protocol: "mock",
-// Cluster: "failover",
-// Loadbalance: "random",
-// Retries: "3",
-// Group: "huadong_idc",
-// Version: "1.0.0",
-// Methods: []*method.MethodConfig{
-// {
-// Name: "GetUser",
-// Retries: "2",
-// LoadBalance: "random",
-// },
-// {
-// Name: "GetUser1",
-// Retries: "2",
-// LoadBalance: "random",
-// Sticky: true,
-// },
-// },
-// },
-// },
-// }
-// }
-//
-// var mockProvider = new(MockProvider)
-//
-// type MockProvider struct{}
-//
-// func (m *MockProvider) Reference() string {
-// return "MockProvider"
-// }
-//
-// func (m *MockProvider) CallBack(res common.CallbackResponse) {
-// // CallBack is a mock function. to implement the interface
-// }
-//
-// func doInitConsumerAsync() {
-// doInitConsumer()
-// instance.SetConsumerService(mockProvider)
-// for _, v := range config.consumerConfig.References {
-// v.Async = true
-// }
-// }
-//
-// func doInitConsumerWithSingleRegistry() {
-// config.consumerConfig = &consumer.Config{
-// BaseConfig: base.Config{
-// applicationConfig.Config: &applicationConfig.Config{
-// Organization: "dubbo_org",
-// Name: "dubbo",
-// Module: "module",
-// Version: "2.6.0",
-// Owner: "dubbo",
-// Environment: "test",
-// },
-// },
-//
-// Registry: ®istry2.RegistryConfig{
-// Address: "mock://27.0.0.1:2181",
-// Username: "user1",
-// Password: "pwd1",
-// },
-// Registries: map[string]*registry2.RegistryConfig{},
-//
-// References: map[string]*ReferenceConfig{
-// "MockService": {
-// Params: map[string]string{
-// "serviceid": "soa.mock",
-// "forks": "5",
-// },
-// InterfaceName: "com.MockService",
-// Protocol: "mock",
-// Cluster: "failover",
-// Loadbalance: "random",
-// Retries: "3",
-// Group: "huadong_idc",
-// Version: "1.0.0",
-// Methods: []*method.MethodConfig{
-// {
-// Name: "GetUser",
-// Retries: "2",
-// LoadBalance: "random",
-// },
-// {
-// Name: "GetUser1",
-// Retries: "2",
-// LoadBalance: "random",
-// },
-// },
-// },
-// },
-// }
-// }
-//
-// func TestReferMultiReg(t *testing.T) {
-// doInitConsumer()
-// extension.SetProtocol("registry", GetProtocol)
-// extension.SetCluster(constant.ZONEAWARE_CLUSTER_NAME, cluster_impl.NewZoneAwareCluster)
-// for _, reference := range config.consumerConfig.References {
-// reference.Refer(nil)
-// assert.NotNil(t, reference.invoker)
-// assert.NotNil(t, reference.pxy)
-// }
-// config.consumerConfig = nil
-// }
-//
-// func TestRefer(t *testing.T) {
-// doInitConsumer()
-// extension.SetProtocol("registry", GetProtocol)
-// extension.SetCluster(constant.ZONEAWARE_CLUSTER_NAME, cluster_impl.NewZoneAwareCluster)
-//
-// for _, reference := range config.consumerConfig.References {
-// reference.Refer(nil)
-// assert.Equal(t, "soa.mock", reference.Params["serviceid"])
-// assert.NotNil(t, reference.invoker)
-// assert.NotNil(t, reference.pxy)
-// }
-// config.consumerConfig = nil
-// }
-//
-// func TestReferAsync(t *testing.T) {
-// doInitConsumerAsync()
-// extension.SetProtocol("registry", GetProtocol)
-// extension.SetCluster(constant.ZONEAWARE_CLUSTER_NAME, cluster_impl.NewZoneAwareCluster)
-//
-// for _, reference := range config.consumerConfig.References {
-// reference.Refer(nil)
-// assert.Equal(t, "soa.mock", reference.Params["serviceid"])
-// assert.NotNil(t, reference.invoker)
-// assert.NotNil(t, reference.pxy)
-// assert.NotNil(t, reference.pxy.GetCallback())
-// }
-// config.consumerConfig = nil
-// }
-//
-// func TestReferP2P(t *testing.T) {
-// doInitConsumer()
-// extension.SetProtocol("dubbo", GetProtocol)
-// mockFilter()
-// m := config.consumerConfig.References["MockService"]
-// m.URL = "dubbo://127.0.0.1:20000"
-//
-// for _, reference := range config.consumerConfig.References {
-// reference.Refer(nil)
-// assert.NotNil(t, reference.invoker)
-// assert.NotNil(t, reference.pxy)
-// }
-// config.consumerConfig = nil
-// }
-//
-// func TestReferMultiP2P(t *testing.T) {
-// doInitConsumer()
-// extension.SetProtocol("dubbo", GetProtocol)
-// mockFilter()
-// m := config.consumerConfig.References["MockService"]
-// m.URL = "dubbo://127.0.0.1:20000;dubbo://127.0.0.2:20000"
-//
-// for _, reference := range config.consumerConfig.References {
-// reference.Refer(nil)
-// assert.NotNil(t, reference.invoker)
-// assert.NotNil(t, reference.pxy)
-// }
-// config.consumerConfig = nil
-// }
-//
-// func TestReferMultiP2PWithReg(t *testing.T) {
-// doInitConsumer()
-// extension.SetProtocol("dubbo", GetProtocol)
-// extension.SetProtocol("registry", GetProtocol)
-// mockFilter()
-// m := config.consumerConfig.References["MockService"]
-// m.URL = "dubbo://127.0.0.1:20000;registry://127.0.0.2:20000"
-//
-// for _, reference := range config.consumerConfig.References {
-// reference.Refer(nil)
-// assert.NotNil(t, reference.invoker)
-// assert.NotNil(t, reference.pxy)
-// }
-// config.consumerConfig = nil
-// }
-//
-// func TestImplement(t *testing.T) {
-// doInitConsumer()
-// extension.SetProtocol("registry", GetProtocol)
-// extension.SetCluster(constant.ZONEAWARE_CLUSTER_NAME, cluster_impl.NewZoneAwareCluster)
-// for _, reference := range config.consumerConfig.References {
-// reference.Refer(nil)
-// reference.Implement(&config.MockService{})
-// assert.NotNil(t, reference.GetRPCService())
-//
-// }
-// config.consumerConfig = nil
-// }
-//
-// func TestForking(t *testing.T) {
-// doInitConsumer()
-// extension.SetProtocol("dubbo", GetProtocol)
-// extension.SetProtocol("registry", GetProtocol)
-// mockFilter()
-// m := config.consumerConfig.References["MockService"]
-// m.URL = "dubbo://127.0.0.1:20000;registry://127.0.0.2:20000"
-//
-// for _, reference := range config.consumerConfig.References {
-// reference.Refer(nil)
-// forks := int(reference.invoker.GetURL().GetParamInt(constant.FORKS_KEY, constant.DEFAULT_FORKS))
-// assert.Equal(t, 5, forks)
-// assert.NotNil(t, reference.pxy)
-// assert.NotNil(t, reference.Cluster)
-// }
-// config.consumerConfig = nil
-// }
-//
-// func TestSticky(t *testing.T) {
-// doInitConsumer()
-// extension.SetProtocol("dubbo", GetProtocol)
-// extension.SetProtocol("registry", GetProtocol)
-// mockFilter()
-// m := config.consumerConfig.References["MockService"]
-// m.URL = "dubbo://127.0.0.1:20000;registry://127.0.0.2:20000"
-//
-// reference := config.consumerConfig.References["MockService"]
-// reference.Refer(nil)
-// referenceSticky := reference.invoker.GetURL().GetParam(constant.STICKY_KEY, "false")
-// assert.Equal(t, "false", referenceSticky)
-//
-// method0StickKey := reference.invoker.GetURL().GetMethodParam(reference.Methods[0].Name, constant.STICKY_KEY, "false")
-// assert.Equal(t, "false", method0StickKey)
-// method1StickKey := reference.invoker.GetURL().GetMethodParam(reference.Methods[1].Name, constant.STICKY_KEY, "false")
-// assert.Equal(t, "true", method1StickKey)
-// }
-//
-// func GetProtocol() protocol.Protocol {
-// if regProtocol != nil {
-// return regProtocol
-// }
-// return newRegistryProtocol()
-// }
-//
-// func newRegistryProtocol() protocol.Protocol {
-// return &mockRegistryProtocol{}
-// }
-//
-// type mockRegistryProtocol struct {
-// }
-//
-// func (*mockRegistryProtocol) Refer(url *common.URL) protocol.Invoker {
-// return protocol.NewBaseInvoker(url)
-// }
-//
-// func (*mockRegistryProtocol) Export(invoker protocol.Invoker) protocol.Exporter {
-// registryURL := getRegistryURL(invoker)
-// if registryURL.Protocol == "service-discovery" {
-// metaDataService, err := extension.GetLocalMetadataService("")
-// if err != nil {
-// panic(err)
-// }
-// ok, err := metaDataService.ExportURL(invoker.GetURL().SubURL.Clone())
-// if err != nil {
-// panic(err)
-// }
-// if !ok {
-// panic("The URL has been registry!")
-// }
-// }
-// return protocol.NewBaseExporter("test", invoker, &sync.Map{})
-// }
-//
-// func (*mockRegistryProtocol) Destroy() {
-// // Destroy is a mock function
-// }
-//
-// func getRegistryURL(invoker protocol.Invoker) *common.URL {
-// // here add * for return a new url
-// url := invoker.GetURL()
-// // if the protocol == registry ,set protocol the registry value in url.params
-// if url.Protocol == constant.REGISTRY_PROTOCOL {
-// protocol := url.GetParam(constant.REGISTRY_KEY, "")
-// url.Protocol = protocol
-// }
-// return url
-// }
-//
-// func (p *mockRegistryProtocol) GetRegistries() []registry.Registry {
-// return []registry.Registry{&config.mockServiceDiscoveryRegistry{}}
-// }
-//
-// func mockFilter() {
-// consumerFiler := &mockShutdownFilter{}
-// extension.SetFilter(constant.GracefulShutdownConsumerFilterKey, func() filter.Filter {
-// return consumerFiler
-// })
-// }
-//
-// type mockShutdownFilter struct {
-// }
-//
-// // Invoke adds the requests count and block the new requests if applicationConfig is closing
-//
-// func (gf *mockShutdownFilter) Invoke(ctx context.Context, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
-// return invoker.Invoke(ctx, invocation)
-// }
-//
-// // OnResponse reduces the number of active processes then return the process result
-//
-// func (gf *mockShutdownFilter) OnResponse(ctx context.Context, result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
-// return result
-// }
-func TestNewReferenceConfigBuilder(t *testing.T) {
- registryConfig := NewRegistryConfigWithProtocolDefaultPort("nacos")
- protocolConfig := NewProtocolConfigBuilder().
- SetName("dubbo").
- SetPort("20000").
- Build()
- config := NewReferenceConfigBuilder().
- SetInterface("org.apache.dubbo.HelloService").
- SetRegistryIDs("nacos").
- SetGeneric(false).
- SetCluster("cluster").
- SetSerialization("serialization").
- SetProtocol("dubbo").
- Build()
-
- config.rootConfig = NewRootConfigBuilder().
- SetProtocols(map[string]*ProtocolConfig{"dubbo": protocolConfig}).
- SetRegistries(map[string]*RegistryConfig{"nacos": registryConfig}).
- Build()
-
- assert.Equal(t, config.Prefix(), constant.ReferenceConfigPrefix+config.InterfaceName+".")
- proxy := config.GetProxy()
- assert.Nil(t, proxy)
-
- values := config.getURLMap()
- assert.Empty(t, values.Get(constant.GroupKey))
-
- invoker := config.GetInvoker()
- assert.Nil(t, invoker)
-}
-
-func TestReferenceConfigInitWithoutConsumerConfig(t *testing.T) {
- testRootConfig := NewRootConfigBuilder().Build()
- testRootConfig.Consumer = nil
- err := NewReferenceConfigBuilder().Build().Init(testRootConfig)
- assert.NoError(t, err)
-}
-
-func TestReferenceConfigInitInheritsConsumerRequestTimeout(t *testing.T) {
- root := NewRootConfigBuilder().
- SetApplication(NewApplicationConfigBuilder().SetName("test-app").Build()).
- SetConsumer(NewConsumerConfigBuilder().SetRequestTimeout("5s").Build()).
- Build()
-
- ref := NewReferenceConfigBuilder().Build()
- err := ref.Init(root)
- require.NoError(t, err)
- assert.Equal(t, "5s", ref.RequestTimeout)
- assert.Equal(t, "5s", ref.getURLMap().Get(constant.TimeoutKey))
-}
diff --git a/config/registry_config.go b/config/registry_config.go
deleted file mode 100644
index 0c1d93134..000000000
--- a/config/registry_config.go
+++ /dev/null
@@ -1,491 +0,0 @@
-/*
- * 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
-
-import (
- "net/url"
- "strconv"
- "strings"
-)
-
-import (
- "github.com/creasty/defaults"
-
- "github.com/dubbogo/gost/log/logger"
-
- perrors "github.com/pkg/errors"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/common/extension"
- "dubbo.apache.org/dubbo-go/v3/registry"
-)
-
-// RegistryConfig is the configuration of the registry center
-type RegistryConfig struct {
- Protocol string `validate:"required" yaml:"protocol" json:"protocol,omitempty" property:"protocol"`
- Timeout string `default:"5s" validate:"required" yaml:"timeout" json:"timeout,omitempty" property:"timeout"` // unit: second
- Group string `yaml:"group" json:"group,omitempty" property:"group"`
- Namespace string `yaml:"namespace" json:"namespace,omitempty" property:"namespace"`
- TTL string `default:"15m" yaml:"ttl" json:"ttl,omitempty" property:"ttl"` // unit: minute
- Address string `validate:"required" yaml:"address" json:"address,omitempty" property:"address"`
- Username string `yaml:"username" json:"username,omitempty" property:"username"`
- Password string `yaml:"password" json:"password,omitempty" property:"password"`
- Simplified bool `yaml:"simplified" json:"simplified,omitempty" property:"simplified"`
- Preferred bool `yaml:"preferred" json:"preferred,omitempty" property:"preferred"` // Always use this registry first if set to true, useful when subscribe to multiple registriesConfig
- Zone string `yaml:"zone" json:"zone,omitempty" property:"zone"` // The region where the registry belongs, usually used to isolate traffics
- Weight int64 `yaml:"weight" json:"weight,omitempty" property:"weight"` // Affects traffic distribution among registriesConfig, useful when subscribe to multiple registriesConfig Take effect only when no preferred registry is specified.
- Params map[string]string `yaml:"params" json:"params,omitempty" property:"params"`
- RegistryType string `yaml:"registry-type"`
- UseAsMetaReport string `default:"true" yaml:"use-as-meta-report" json:"use-as-meta-report,omitempty" property:"use-as-meta-report"`
- UseAsConfigCenter string `yaml:"use-as-config-center" json:"use-as-config-center,omitempty" property:"use-as-config-center"`
-}
-
-// Prefix dubbo.registries
-func (RegistryConfig) Prefix() string {
- return constant.RegistryConfigPrefix
-}
-
-func (c *RegistryConfig) Init() error {
- if err := defaults.Set(c); err != nil {
- return err
- }
- return c.startRegistryConfig()
-}
-
-func (c *RegistryConfig) getUrlMap(roleType common.RoleType) url.Values {
- urlMap := url.Values{}
- urlMap.Set(constant.RegistryGroupKey, c.Group)
- urlMap.Set(constant.RegistryRoleKey, strconv.Itoa(int(roleType)))
- urlMap.Set(constant.RegistryKey, c.Protocol)
- urlMap.Set(constant.RegistryTimeoutKey, c.Timeout)
- // multi registry invoker weight label for load balance
- urlMap.Set(constant.RegistryKey+"."+constant.RegistryLabelKey, strconv.FormatBool(true))
- urlMap.Set(constant.RegistryKey+"."+constant.PreferredKey, strconv.FormatBool(c.Preferred))
- urlMap.Set(constant.RegistryKey+"."+constant.RegistryZoneKey, c.Zone)
- urlMap.Set(constant.RegistryKey+"."+constant.WeightKey, strconv.FormatInt(c.Weight, 10))
- urlMap.Set(constant.RegistryTTLKey, c.TTL)
- urlMap.Set(constant.ClientNameKey, clientNameID(c, c.Protocol, c.Address))
- urlMap.Set(constant.RegistryTypeKey, c.RegistryType)
-
- for k, v := range c.Params {
- urlMap.Set(k, v)
- }
- return urlMap
-}
-
-func (c *RegistryConfig) startRegistryConfig() error {
- c.translateRegistryAddress()
- return verify(c)
-}
-
-// toMetadataReportUrl translate the registry configuration to the metadata reporting url
-func (c *RegistryConfig) toMetadataReportUrl() (*common.URL, error) {
- res, err := common.NewURL(c.Address,
- common.WithLocation(c.Address),
- common.WithProtocol(c.Protocol),
- common.WithUsername(c.Username),
- common.WithPassword(c.Password),
- common.WithParamsValue(constant.TimeoutKey, c.Timeout),
- common.WithParamsValue(constant.ClientNameKey, clientNameID(c, c.Protocol, c.Address)),
- common.WithParamsValue(constant.MetadataReportGroupKey, c.Group),
- common.WithParamsValue(constant.MetadataReportNamespaceKey, c.Namespace),
- )
- if err != nil || len(res.Protocol) == 0 {
- return nil, perrors.New("Invalid Registry Config.")
- }
- return res, nil
-}
-
-// translateRegistryAddress translate registry address
-//
-// eg:address=nacos://127.0.0.1:8848 will return 127.0.0.1:8848 and protocol will set nacos
-func (c *RegistryConfig) translateRegistryAddress() string {
- if strings.Contains(c.Address, "://") {
- u, err := url.Parse(c.Address)
- if err != nil {
- logger.Errorf("The registry url is invalid, error: %#v", err)
- panic(err)
- }
- c.Protocol = u.Scheme
- c.Address = strings.Join([]string{u.Host, u.Path}, "")
- }
- return c.Address
-}
-
-func (c *RegistryConfig) GetInstance(roleType common.RoleType) (registry.Registry, error) {
- u, err := c.toURL(roleType)
- if err != nil {
- return nil, err
- }
- // if the protocol == registry, set protocol the registry value in url.params
- if u.Protocol == constant.RegistryProtocol {
- u.Protocol = u.GetParam(constant.RegistryKey, "")
- }
- return extension.GetRegistry(u.Protocol, u)
-}
-
-func (c *RegistryConfig) toURL(roleType common.RoleType) (*common.URL, error) {
- address := c.translateRegistryAddress()
- var registryURLProtocol string
-
- switch c.RegistryType {
- case constant.RegistryTypeService:
- // service discovery protocol
- registryURLProtocol = constant.ServiceRegistryProtocol
- case constant.RegistryTypeInterface:
- registryURLProtocol = constant.RegistryProtocol
- default:
- registryURLProtocol = constant.ServiceRegistryProtocol
- }
- return common.NewURL(registryURLProtocol+"://"+address,
- common.WithParams(c.getUrlMap(roleType)),
- common.WithParamsValue(constant.RegistrySimplifiedKey, strconv.FormatBool(c.Simplified)),
- common.WithParamsValue(constant.RegistryKey, c.Protocol),
- common.WithParamsValue(constant.RegistryNamespaceKey, c.Namespace),
- common.WithParamsValue(constant.RegistryTimeoutKey, c.Timeout),
- common.WithUsername(c.Username),
- common.WithPassword(c.Password),
- common.WithLocation(c.Address),
- )
-}
-
-func (c *RegistryConfig) toURLs(roleType common.RoleType) ([]*common.URL, error) {
- address := c.translateRegistryAddress()
- var urls []*common.URL
- var err error
- var registryURL *common.URL
-
- if !isValid(c.Address) {
- logger.Infof("Empty or N/A registry address found, the process will work with no registry enabled " +
- "which means that the address of this instance will not be registered and not able to be found by other consumer instances.")
- return urls, nil
- }
- switch c.RegistryType {
- case constant.RegistryTypeService:
- // service discovery protocol
- if registryURL, err = c.createNewURL(constant.ServiceRegistryProtocol, address, roleType); err == nil {
- urls = append(urls, registryURL)
- }
- case constant.RegistryTypeInterface:
- if registryURL, err = c.createNewURL(constant.RegistryProtocol, address, roleType); err == nil {
- urls = append(urls, registryURL)
- }
- case constant.RegistryTypeAll:
- if registryURL, err = c.createNewURL(constant.ServiceRegistryProtocol, address, roleType); err == nil {
- urls = append(urls, registryURL)
- }
- if registryURL, err = c.createNewURL(constant.RegistryProtocol, address, roleType); err == nil {
- urls = append(urls, registryURL)
- }
- default:
- if registryURL, err = c.createNewURL(constant.ServiceRegistryProtocol, address, roleType); err == nil {
- urls = append(urls, registryURL)
- }
- }
- return urls, err
-}
-
-func LoadRegistries(registryIds []string, registries map[string]*RegistryConfig, roleType common.RoleType) []*common.URL {
- var registryURLs []*common.URL
- //trSlice := strings.Split(targetRegistries, ",")
-
- for k, registryConf := range registries {
- target := false
-
- // if user not config targetRegistries, default load all
- // Notice: in func "func Split(s, sep string) []string" comment:
- // if s does not contain sep and sep is not empty, SplitAfter returns
- // a slice of length 1 whose only element is s. So we have to add the
- // condition when targetRegistries string is not set (it will be "" when not set)
- if len(registryIds) == 0 || (len(registryIds) == 1 && registryIds[0] == "") {
- target = true
- } else {
- // else if user config targetRegistries
- for _, tr := range registryIds {
- if tr == k {
- target = true
- break
- }
- }
- }
-
- if target {
- if urls, err := registryConf.toURLs(roleType); err != nil {
- logger.Errorf("The registry id: %s url is invalid, error: %#v", k, err)
- panic(err)
- } else {
- for _, u := range urls {
- u.SetParam(constant.RegistryIdKey, k)
- }
- registryURLs = append(registryURLs, urls...)
- }
- }
- }
-
- return registryURLs
-}
-
-func (c *RegistryConfig) createNewURL(protocol string, address string, roleType common.RoleType) (*common.URL, error) {
- return common.NewURL(protocol+"://"+address,
- common.WithParams(c.getUrlMap(roleType)),
- common.WithParamsValue(constant.RegistrySimplifiedKey, strconv.FormatBool(c.Simplified)),
- common.WithParamsValue(constant.RegistryKey, c.Protocol),
- common.WithParamsValue(constant.RegistryNamespaceKey, c.Namespace),
- common.WithParamsValue(constant.RegistryTimeoutKey, c.Timeout),
- common.WithUsername(c.Username),
- common.WithPassword(c.Password),
- common.WithLocation(c.Address),
- )
-}
-
-const (
- defaultZKAddr = "127.0.0.1:2181" // default registry address of zookeeper
- defaultNacosAddr = "127.0.0.1:8848" // the default registry address of nacos
- defaultRegistryTimeout = "3s" // the default registry timeout
-)
-
-type RegistryConfigOpt func(config *RegistryConfig) *RegistryConfig
-
-// NewRegistryConfigWithProtocolDefaultPort New default registry config
-// the input @protocol can only be:
-// "zookeeper" with default addr "127.0.0.1:2181"
-// "nacos" with default addr "127.0.0.1:8848"
-func NewRegistryConfigWithProtocolDefaultPort(protocol string) *RegistryConfig {
- switch protocol {
- case "zookeeper":
- return &RegistryConfig{
- Protocol: protocol,
- Address: defaultZKAddr,
- Timeout: defaultRegistryTimeout,
- }
- case "nacos":
- return &RegistryConfig{
- Protocol: protocol,
- Address: defaultNacosAddr,
- Timeout: defaultRegistryTimeout,
- }
- default:
- return &RegistryConfig{
- Protocol: protocol,
- }
- }
-}
-
-// NewRegistryConfig creates New RegistryConfig with @opts
-func NewRegistryConfig(opts ...RegistryConfigOpt) *RegistryConfig {
- newRegistryConfig := NewRegistryConfigWithProtocolDefaultPort("")
- for _, v := range opts {
- newRegistryConfig = v(newRegistryConfig)
- }
- return newRegistryConfig
-}
-
-// WithRegistryProtocol returns RegistryConfigOpt with given @regProtocol name
-func WithRegistryProtocol(regProtocol string) RegistryConfigOpt {
- return func(config *RegistryConfig) *RegistryConfig {
- config.Protocol = regProtocol
- return config
- }
-}
-
-// WithRegistryAddress returns RegistryConfigOpt with given @addr registry address
-func WithRegistryAddress(addr string) RegistryConfigOpt {
- return func(config *RegistryConfig) *RegistryConfig {
- config.Address = addr
- return config
- }
-}
-
-// WithRegistryTimeOut returns RegistryConfigOpt with given @timeout registry config
-func WithRegistryTimeOut(timeout string) RegistryConfigOpt {
- return func(config *RegistryConfig) *RegistryConfig {
- config.Timeout = timeout
- return config
- }
-}
-
-// WithRegistryGroup returns RegistryConfigOpt with given @group registry group
-func WithRegistryGroup(group string) RegistryConfigOpt {
- return func(config *RegistryConfig) *RegistryConfig {
- config.Group = group
- return config
- }
-}
-
-// WithRegistryTTL returns RegistryConfigOpt with given @ttl registry ttl
-func WithRegistryTTL(ttl string) RegistryConfigOpt {
- return func(config *RegistryConfig) *RegistryConfig {
- config.TTL = ttl
- return config
- }
-}
-
-// WithRegistryUserName returns RegistryConfigOpt with given @userName registry userName
-func WithRegistryUserName(userName string) RegistryConfigOpt {
- return func(config *RegistryConfig) *RegistryConfig {
- config.Username = userName
- return config
- }
-}
-
-// WithRegistryPassword returns RegistryConfigOpt with given @psw registry password
-func WithRegistryPassword(psw string) RegistryConfigOpt {
- return func(config *RegistryConfig) *RegistryConfig {
- config.Password = psw
- return config
- }
-}
-
-// WithRegistrySimplified returns RegistryConfigOpt with given @simplified registry simplified flag
-func WithRegistrySimplified(simplified bool) RegistryConfigOpt {
- return func(config *RegistryConfig) *RegistryConfig {
- config.Simplified = simplified
- return config
- }
-}
-
-// WithRegistryPreferred returns RegistryConfig with given @preferred registry preferred flag
-func WithRegistryPreferred(preferred bool) RegistryConfigOpt {
- return func(config *RegistryConfig) *RegistryConfig {
- config.Preferred = preferred
- return config
- }
-}
-
-// WithRegistryWeight returns RegistryConfigOpt with given @weight registry weight flag
-func WithRegistryWeight(weight int64) RegistryConfigOpt {
- return func(config *RegistryConfig) *RegistryConfig {
- config.Weight = weight
- return config
- }
-}
-
-// WithRegistryParams returns RegistryConfigOpt with given registry @params
-func WithRegistryParams(params map[string]string) RegistryConfigOpt {
- return func(config *RegistryConfig) *RegistryConfig {
- config.Params = params
- return config
- }
-}
-
-func NewRegistryConfigBuilder() *RegistryConfigBuilder {
- return &RegistryConfigBuilder{
- registryConfig: &RegistryConfig{},
- }
-}
-
-type RegistryConfigBuilder struct {
- registryConfig *RegistryConfig
-}
-
-func (rcb *RegistryConfigBuilder) SetProtocol(protocol string) *RegistryConfigBuilder {
- rcb.registryConfig.Protocol = protocol
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) SetTimeout(timeout string) *RegistryConfigBuilder {
- rcb.registryConfig.Timeout = timeout
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) SetGroup(group string) *RegistryConfigBuilder {
- rcb.registryConfig.Group = group
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) SetNamespace(namespace string) *RegistryConfigBuilder {
- rcb.registryConfig.Namespace = namespace
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) SetTTL(ttl string) *RegistryConfigBuilder {
- rcb.registryConfig.TTL = ttl
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) SetAddress(address string) *RegistryConfigBuilder {
- rcb.registryConfig.Address = address
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) SetUsername(username string) *RegistryConfigBuilder {
- rcb.registryConfig.Username = username
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) SetPassword(password string) *RegistryConfigBuilder {
- rcb.registryConfig.Password = password
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) SetSimplified(simplified bool) *RegistryConfigBuilder {
- rcb.registryConfig.Simplified = simplified
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) SetPreferred(preferred bool) *RegistryConfigBuilder {
- rcb.registryConfig.Preferred = preferred
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) SetZone(zone string) *RegistryConfigBuilder {
- rcb.registryConfig.Zone = zone
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) SetWeight(weight int64) *RegistryConfigBuilder {
- rcb.registryConfig.Weight = weight
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) SetParams(params map[string]string) *RegistryConfigBuilder {
- rcb.registryConfig.Params = params
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) AddParam(key, value string) *RegistryConfigBuilder {
- if rcb.registryConfig.Params == nil {
- rcb.registryConfig.Params = make(map[string]string)
- }
- rcb.registryConfig.Params[key] = value
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) SetRegistryType(registryType string) *RegistryConfigBuilder {
- rcb.registryConfig.RegistryType = registryType
- return rcb
-}
-
-func (rcb *RegistryConfigBuilder) Build() *RegistryConfig {
- if err := rcb.registryConfig.Init(); err != nil {
- panic(err)
- }
- return rcb.registryConfig
-}
-
-// DynamicUpdateProperties update registry
-func (c *RegistryConfig) DynamicUpdateProperties(updateRegistryConfig *RegistryConfig) {
- // if nacos's registry timeout not equal local root config's registry timeout , update.
- if updateRegistryConfig != nil && updateRegistryConfig.Timeout != c.Timeout {
- c.Timeout = updateRegistryConfig.Timeout
- logger.Infof("RegistryConfigs Timeout was dynamically updated, new value:%v", c.Timeout)
- }
-}
diff --git a/config/registry_config_test.go b/config/registry_config_test.go
deleted file mode 100644
index 011e08101..000000000
--- a/config/registry_config_test.go
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-func TestLoadRegistries(t *testing.T) {
- target := []string{"shanghai1"}
- regs := map[string]*RegistryConfig{
-
- "shanghai1": {
- Protocol: "mock",
- Timeout: "2s",
- Group: "shanghai_idc",
- Address: "127.0.0.2:2181,128.0.0.1:2181",
- Username: "user1",
- Password: "pwd1",
- },
- }
- urls := LoadRegistries(target, regs, common.CONSUMER)
- t.Logf("LoadRegistries() = urls:%v", urls)
- assert.Equal(t, "127.0.0.2:2181,128.0.0.1:2181", urls[0].Location)
- assert.Equal(t, "service-discovery-registry://127.0.0.2:2181,128.0.0.1:2181/shanghai_idc", urls[0].PrimitiveURL)
-}
-
-func TestLoadRegistries1(t *testing.T) {
- target := []string{"shanghai1"}
- regs := map[string]*RegistryConfig{
-
- "shanghai1": {
- Protocol: "mock",
- Timeout: "2s",
- Group: "shanghai_idc",
- Address: "127.0.0.2:2181",
- Username: "user1",
- Password: "pwd1",
- },
- }
- urls := LoadRegistries(target, regs, common.CONSUMER)
- t.Logf("LoadRegistries() = urls:%v", urls)
- assert.Equal(t, "127.0.0.2:2181", urls[0].Location)
- assert.Equal(t, "service-discovery-registry://127.0.0.2:2181/shanghai_idc", urls[0].PrimitiveURL)
-}
-
-func TestRegistryTypeAll(t *testing.T) {
- target := []string{"test"}
- regs := map[string]*RegistryConfig{
- "test": {
- Protocol: "mock",
- Address: "127.0.0.2:2181",
- RegistryType: constant.RegistryTypeAll,
- },
- }
- urls := LoadRegistries(target, regs, common.PROVIDER)
- assert.Len(t, urls, 2)
- assert.Equal(t, "service-discovery-registry://127.0.0.2:2181", urls[0].PrimitiveURL)
-}
-
-func TestTranslateRegistryAddress(t *testing.T) {
- reg := new(RegistryConfig)
- reg.Address = "nacos://127.0.0.1:8848"
-
- reg.translateRegistryAddress()
-
- assert.Equal(t, "nacos", reg.Protocol)
- assert.Equal(t, "127.0.0.1:8848", reg.Address)
-}
-
-func TestNewRegistryConfigBuilder(t *testing.T) {
-
- config := NewRegistryConfigBuilder().
- SetProtocol("nacos").
- SetTimeout("10s").
- SetGroup("group").
- SetNamespace("public").
- SetTTL("10s").
- SetAddress("127.0.0.1:8848").
- SetUsername("nacos").
- SetPassword("123456").
- SetSimplified(true).
- SetPreferred(true).
- SetZone("zone").
- SetWeight(100).
- SetParams(map[string]string{"timeout": "3s"}).
- AddParam("timeout", "15s").
- SetRegistryType("local").
- Build()
-
- config.DynamicUpdateProperties(config)
-
- assert.Equal(t, constant.RegistryConfigPrefix, config.Prefix())
-
- values := config.getUrlMap(common.PROVIDER)
- assert.Equal(t, "15s", values.Get("timeout"))
-
- url, err := config.toMetadataReportUrl()
- require.NoError(t, err)
- assert.Equal(t, "10s", url.GetParam("timeout", "3s"))
-
- url, err = config.toURL(common.PROVIDER)
- require.NoError(t, err)
- assert.Equal(t, "15s", url.GetParam("timeout", "3s"))
-
- address := config.translateRegistryAddress()
- assert.Equal(t, "127.0.0.1:8848", address)
-}
-
-func TestNewRegistryConfig(t *testing.T) {
- config := NewRegistryConfig(
- WithRegistryProtocol("nacos"),
- WithRegistryAddress("127.0.0.1:8848"),
- WithRegistryTimeOut("10s"),
- WithRegistryGroup("group"),
- WithRegistryTTL("10s"),
- WithRegistryUserName("nacos"),
- WithRegistryPassword("123456"),
- WithRegistrySimplified(true),
- WithRegistryPreferred(true),
- WithRegistryWeight(100),
- WithRegistryParams(map[string]string{"timeout": "3s"}))
-
- assert.Equal(t, "10s", config.Timeout)
-}
diff --git a/config/remote_config.go b/config/remote_config.go
deleted file mode 100644
index 7af5c1040..000000000
--- a/config/remote_config.go
+++ /dev/null
@@ -1,154 +0,0 @@
-/*
- * 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
-
-import (
- "net/url"
- "time"
-)
-
-import (
- perrors "github.com/pkg/errors"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-// RemoteConfig usually we need some middleware, including nacos, zookeeper
-// this represents an instance of this middleware
-// so that other module, like config center, registry could reuse the config
-// but now, only metadata report, metadata service, service discovery use this structure
-type RemoteConfig struct {
- Protocol string `yaml:"protocol" json:"protocol,omitempty" property:"protocol"`
- Address string `yaml:"address" json:"address,omitempty" property:"address"`
- Timeout string `default:"5s" yaml:"timeout" json:"timeout,omitempty" property:"timeout"`
- Username string `yaml:"username" json:"username,omitempty" property:"username"`
- Password string `yaml:"password" json:"password,omitempty" property:"password"`
- Params map[string]string `yaml:"params" json:"params,omitempty"`
-}
-
-// Prefix dubbo.remote.
-func (rc *RemoteConfig) Prefix() string {
- return constant.RemotePrefix
-}
-
-func (rc *RemoteConfig) Init() error {
- return nil
-}
-
-// GetTimeout return timeout duration.
-// if the configure is invalid, or missing, the default value 5s will be returned
-func (rc *RemoteConfig) GetTimeout() time.Duration {
- if res, err := time.ParseDuration(rc.Timeout); err == nil {
- return res
- }
- return 5 * time.Second
-}
-
-// GetParam will return the value of the key. If not found, def will be return;
-// def => default value
-func (rc *RemoteConfig) GetParam(key string, def string) string {
- param, ok := rc.Params[key]
- if !ok {
- return def
- }
- return param
-}
-
-// ToURL config to url
-func (rc *RemoteConfig) ToURL() (*common.URL, error) {
- if len(rc.Protocol) == 0 {
- return nil, perrors.Errorf("Must provide protocol in RemoteConfig.")
- }
- return common.NewURL(rc.Address,
- common.WithProtocol(rc.Protocol),
- common.WithUsername(rc.Username),
- common.WithPassword(rc.Password),
- common.WithLocation(rc.Address),
- common.WithParams(rc.getUrlMap()),
- )
-}
-
-// getUrlMap get url map
-func (rc *RemoteConfig) getUrlMap() url.Values {
- urlMap := url.Values{}
- urlMap.Set(constant.ConfigUsernameKey, rc.Username)
- urlMap.Set(constant.ConfigPasswordKey, rc.Password)
- urlMap.Set(constant.ConfigTimeoutKey, rc.Timeout)
- urlMap.Set(constant.ClientNameKey, clientNameID(rc, rc.Protocol, rc.Protocol))
-
- for key, val := range rc.Params {
- urlMap.Set(key, val)
- }
- return urlMap
-}
-
-func NewRemoteConfigBuilder() *RemoteConfigBuilder {
- return &RemoteConfigBuilder{remoteConfig: &RemoteConfig{}}
-}
-
-type RemoteConfigBuilder struct {
- remoteConfig *RemoteConfig
-}
-
-func (rcb *RemoteConfigBuilder) SetProtocol(protocol string) *RemoteConfigBuilder {
- rcb.remoteConfig.Protocol = protocol
- return rcb
-}
-
-func (rcb *RemoteConfigBuilder) SetAddress(address string) *RemoteConfigBuilder {
- rcb.remoteConfig.Address = address
- return rcb
-}
-
-func (rcb *RemoteConfigBuilder) SetTimeout(timeout string) *RemoteConfigBuilder {
- rcb.remoteConfig.Timeout = timeout
- return rcb
-}
-
-func (rcb *RemoteConfigBuilder) SetUsername(username string) *RemoteConfigBuilder {
- rcb.remoteConfig.Username = username
- return rcb
-}
-
-func (rcb *RemoteConfigBuilder) SetPassword(password string) *RemoteConfigBuilder {
- rcb.remoteConfig.Password = password
- return rcb
-}
-
-func (rcb *RemoteConfigBuilder) SetParams(params map[string]string) *RemoteConfigBuilder {
- rcb.remoteConfig.Params = params
- return rcb
-}
-
-func (rcb *RemoteConfigBuilder) AddParam(key, value string) *RemoteConfigBuilder {
- if rcb.remoteConfig.Params == nil {
- rcb.remoteConfig.Params = make(map[string]string)
- }
- rcb.remoteConfig.Params[key] = value
- return rcb
-}
-
-func (rcb *RemoteConfigBuilder) Build() *RemoteConfig {
- if err := rcb.remoteConfig.Init(); err != nil {
- panic(err)
- }
- return rcb.remoteConfig
-}
diff --git a/config/remote_config_test.go b/config/remote_config_test.go
deleted file mode 100644
index f9433e063..000000000
--- a/config/remote_config_test.go
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
- "time"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-func TestRemoteConfig_GetParam(t *testing.T) {
- rc := &RemoteConfig{
- Params: make(map[string]string, 1),
- }
-
- def := "default value"
- key := "key"
- value := rc.GetParam(key, def)
- assert.Equal(t, def, value)
-
- actualVal := "actual value"
- rc.Params[key] = actualVal
-
- value = rc.GetParam(key, def)
- assert.Equal(t, actualVal, value)
-}
-
-func TestNewRemoteConfigBuilder(t *testing.T) {
- config := NewRemoteConfigBuilder().
- SetProtocol("nacos").
- SetAddress("127.0.0.1:8848").
- SetTimeout("10s").
- SetUsername("nacos").
- SetPassword("nacos").
- SetParams(map[string]string{"timeout": "3s"}).
- AddParam("timeout", "15s").
- Build()
-
- values := config.getUrlMap()
- assert.Equal(t, "15s", values.Get("timeout"))
-
- url, err := config.ToURL()
- require.NoError(t, err)
- assert.Equal(t, "15s", url.GetParam("timeout", "3s"))
-
- err = config.Init()
- require.NoError(t, err)
-
- timeout := config.GetTimeout()
- assert.Equal(t, 10*time.Second, timeout)
- assert.Equal(t, constant.RemotePrefix, config.Prefix())
-
- param := config.GetParam("timeout", "3s")
- assert.Equal(t, "15s", param)
-}
diff --git a/config/root_config.go b/config/root_config.go
deleted file mode 100644
index 409f2cece..000000000
--- a/config/root_config.go
+++ /dev/null
@@ -1,429 +0,0 @@
-/*
- * 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
-
-import (
- "fmt"
- "sync"
-)
-
-import (
- hessian "github.com/apache/dubbo-go-hessian2"
-
- "github.com/dubbogo/gost/log/logger"
-
- "github.com/knadh/koanf"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/config_center"
- "dubbo.apache.org/dubbo-go/v3/registry/exposed_tmp"
-)
-
-var (
- startOnce sync.Once
-)
-
-// RootConfig is the root config
-type RootConfig struct {
- Application *ApplicationConfig `validate:"required" yaml:"application" json:"application,omitempty" property:"application"`
- Protocols map[string]*ProtocolConfig `validate:"required" yaml:"protocols" json:"protocols" property:"protocols"`
- Registries map[string]*RegistryConfig `yaml:"registries" json:"registries" property:"registries"`
- ConfigCenter *CenterConfig `yaml:"config-center" json:"config-center,omitempty"`
- MetadataReport *MetadataReportConfig `yaml:"metadata-report" json:"metadata-report,omitempty" property:"metadata-report"`
- Provider *ProviderConfig `yaml:"provider" json:"provider" property:"provider"`
- Consumer *ConsumerConfig `yaml:"consumer" json:"consumer" property:"consumer"`
- Otel *OtelConfig `yaml:"otel" json:"otel,omitempty" property:"otel"`
- Metrics *MetricsConfig `yaml:"metrics" json:"metrics,omitempty" property:"metrics"`
- Tracing map[string]*TracingConfig `yaml:"tracing" json:"tracing,omitempty" property:"tracing"`
- Logger *LoggerConfig `yaml:"logger" json:"logger,omitempty" property:"logger"`
- Shutdown *ShutdownConfig `yaml:"shutdown" json:"shutdown,omitempty" property:"shutdown"`
- Router []*RouterConfig `yaml:"router" json:"router,omitempty" property:"router"`
- EventDispatcherType string `default:"direct" yaml:"event-dispatcher-type" json:"event-dispatcher-type,omitempty"`
- CacheFile string `yaml:"cache_file" json:"cache_file,omitempty" property:"cache_file"`
- Custom *CustomConfig `yaml:"custom" json:"custom,omitempty" property:"custom"`
- Profiles *ProfilesConfig `yaml:"profiles" json:"profiles,omitempty" property:"profiles"`
- TLSConfig *TLSConfig `yaml:"tls_config" json:"tls_config,omitempty" property:"tls_config"`
-}
-
-func SetRootConfig(r RootConfig) {
- rc := r
- setRootConfigInternal(&rc)
-}
-
-// Prefix dubbo
-func (rc *RootConfig) Prefix() string {
- return constant.DubboProtocol
-}
-
-func GetRootConfig() *RootConfig {
- return rootConfigStore.Load()
-}
-
-func GetProviderConfig() *ProviderConfig {
- rc := GetRootConfig()
- if err := check(); err == nil && rc.Provider != nil {
- return rc.Provider
- }
- return NewProviderConfigBuilder().Build()
-}
-
-func GetConsumerConfig() *ConsumerConfig {
- rc := GetRootConfig()
- if err := check(); err == nil && rc.Consumer != nil {
- return rc.Consumer
- }
- return NewConsumerConfigBuilder().Build()
-}
-
-func GetApplicationConfig() *ApplicationConfig {
- return GetRootConfig().Application
-}
-
-func GetShutDown() *ShutdownConfig {
- rc := GetRootConfig()
- if err := check(); err == nil && rc.Shutdown != nil {
- return rc.Shutdown
- }
- return NewShutDownConfigBuilder().Build()
-}
-
-func GetTLSConfig() *TLSConfig {
- rc := GetRootConfig()
- if err := check(); err == nil && rc.TLSConfig != nil {
- return rc.TLSConfig
- }
- return NewTLSConfigBuilder().Build()
-}
-
-// getRegistryIds get registry ids
-func (rc *RootConfig) getRegistryIds() []string {
- ids := make([]string, 0)
- for key := range rc.Registries {
- ids = append(ids, key)
- }
- return removeDuplicateElement(ids)
-}
-func registerPOJO() {
- hessian.RegisterPOJO(&common.URL{})
-}
-
-// Init is to start dubbo-go framework, load local configuration, or read configuration from config-center if necessary.
-// It's deprecated for user to call rootConfig.Init() manually, try config.Load(config.WithRootConfig(rootConfig)) instead.
-func (rc *RootConfig) Init() error {
- registerPOJO()
- if err := rc.Logger.Init(); err != nil { // init default logger
- return err
- }
- if err := rc.ConfigCenter.Init(rc); err != nil {
- logger.Infof("[Config Center] Config center doesn't start")
- logger.Debugf("config center doesn't start because %s", err)
- } else {
- if err = rc.Logger.Init(); err != nil { // init logger using config from config center again
- return err
- }
- }
- if err := rc.Application.Init(); err != nil {
- return err
- }
-
- // init user define
- if err := rc.Custom.Init(); err != nil {
- return err
- }
-
- // init protocol
- protocols := rc.Protocols
- if len(protocols) <= 0 {
- protocol := ProtocolConfig{}
- protocols = make(map[string]*ProtocolConfig, 1)
- // todo, default value should be determined in a unified way
- protocols["tri"] = &protocol
- rc.Protocols = protocols
- }
- for _, protocol := range protocols {
- if err := protocol.Init(); err != nil {
- return err
- }
- }
-
- // init registry
- for _, reg := range rc.Registries {
- if err := reg.Init(); err != nil {
- return err
- }
- }
-
- // TODO:When config is migrated later, the impact of this will be migrated to the global module
- if err := validateRegistryAddresses(rc.Registries); err != nil {
- return err
- }
-
- if err := rc.MetadataReport.Init(rc); err != nil {
- return err
- }
-
- if err := rc.Otel.Init(rc.Application); err != nil {
- return err
- }
- if err := rc.Metrics.Init(rc); err != nil {
- return err
- }
- for _, t := range rc.Tracing {
- if err := t.Init(); err != nil {
- return err
- }
- }
- if err := initRouterConfig(rc); err != nil {
- return err
- }
-
- // provider、consumer must last init
- if err := rc.Provider.Init(rc); err != nil {
- return err
- }
- if err := rc.Consumer.Init(rc); err != nil {
- return err
- }
- if err := rc.Shutdown.Init(); err != nil {
- return err
- }
- SetRootConfig(*rc)
- // todo if we can remove this from Init in the future?
- rc.Start()
- return nil
-}
-
-func (rc *RootConfig) Start() {
- startOnce.Do(func() {
- gracefulShutdownInit()
-
- rc.Consumer.Load()
- rc.Provider.Load()
- if err := initMetadata(rc); err != nil {
- panic(err)
- }
- if err := exposed_tmp.RegisterServiceInstance(); err != nil {
- panic(err)
- }
- })
-}
-
-// newEmptyRootConfig get empty root config
-func newEmptyRootConfig() *RootConfig {
- newRootConfig := &RootConfig{
- ConfigCenter: NewConfigCenterConfigBuilder().Build(),
- MetadataReport: NewMetadataReportConfigBuilder().Build(),
- Application: NewApplicationConfigBuilder().Build(),
- Registries: make(map[string]*RegistryConfig),
- Protocols: make(map[string]*ProtocolConfig),
- Tracing: make(map[string]*TracingConfig),
- Provider: NewProviderConfigBuilder().Build(),
- Consumer: NewConsumerConfigBuilder().Build(),
- Otel: NewOtelConfigBuilder().Build(),
- Metrics: NewMetricConfigBuilder().Build(),
- Logger: NewLoggerConfigBuilder().Build(),
- Custom: NewCustomConfigBuilder().Build(),
- Shutdown: NewShutDownConfigBuilder().Build(),
- TLSConfig: NewTLSConfigBuilder().Build(),
- }
- return newRootConfig
-}
-
-func NewRootConfigBuilder() *RootConfigBuilder {
- return &RootConfigBuilder{rootConfig: newEmptyRootConfig()}
-}
-
-type RootConfigBuilder struct {
- rootConfig *RootConfig
-}
-
-func (rb *RootConfigBuilder) SetApplication(application *ApplicationConfig) *RootConfigBuilder {
- rb.rootConfig.Application = application
- return rb
-}
-
-func (rb *RootConfigBuilder) AddProtocol(protocolID string, protocolConfig *ProtocolConfig) *RootConfigBuilder {
- rb.rootConfig.Protocols[protocolID] = protocolConfig
- return rb
-}
-
-func (rb *RootConfigBuilder) AddRegistry(registryID string, registryConfig *RegistryConfig) *RootConfigBuilder {
- rb.rootConfig.Registries[registryID] = registryConfig
- return rb
-}
-
-func (rb *RootConfigBuilder) SetProtocols(protocols map[string]*ProtocolConfig) *RootConfigBuilder {
- rb.rootConfig.Protocols = protocols
- return rb
-}
-
-func (rb *RootConfigBuilder) SetRegistries(registries map[string]*RegistryConfig) *RootConfigBuilder {
- rb.rootConfig.Registries = registries
- return rb
-}
-
-func (rb *RootConfigBuilder) SetMetadataReport(metadataReport *MetadataReportConfig) *RootConfigBuilder {
- rb.rootConfig.MetadataReport = metadataReport
- return rb
-}
-
-func (rb *RootConfigBuilder) SetProvider(provider *ProviderConfig) *RootConfigBuilder {
- rb.rootConfig.Provider = provider
- return rb
-}
-
-func (rb *RootConfigBuilder) SetConsumer(consumer *ConsumerConfig) *RootConfigBuilder {
- rb.rootConfig.Consumer = consumer
- return rb
-}
-
-func (rb *RootConfigBuilder) SetOtel(otel *OtelConfig) *RootConfigBuilder {
- rb.rootConfig.Otel = otel
- return rb
-}
-
-func (rb *RootConfigBuilder) SetMetric(metric *MetricsConfig) *RootConfigBuilder {
- rb.rootConfig.Metrics = metric
- return rb
-}
-
-func (rb *RootConfigBuilder) SetLogger(logger *LoggerConfig) *RootConfigBuilder {
- rb.rootConfig.Logger = logger
- return rb
-}
-
-func (rb *RootConfigBuilder) SetShutdown(shutdown *ShutdownConfig) *RootConfigBuilder {
- rb.rootConfig.Shutdown = shutdown
- return rb
-}
-
-func (rb *RootConfigBuilder) SetRouter(router []*RouterConfig) *RootConfigBuilder {
- rb.rootConfig.Router = router
- return rb
-}
-
-func (rb *RootConfigBuilder) SetEventDispatcherType(eventDispatcherType string) *RootConfigBuilder {
- rb.rootConfig.EventDispatcherType = eventDispatcherType
- return rb
-}
-
-func (rb *RootConfigBuilder) SetCacheFile(cacheFile string) *RootConfigBuilder {
- rb.rootConfig.CacheFile = cacheFile
- return rb
-}
-
-func (rb *RootConfigBuilder) SetConfigCenter(configCenterConfig *CenterConfig) *RootConfigBuilder {
- rb.rootConfig.ConfigCenter = configCenterConfig
- return rb
-}
-
-func (rb *RootConfigBuilder) SetCustom(customConfig *CustomConfig) *RootConfigBuilder {
- rb.rootConfig.Custom = customConfig
- return rb
-}
-
-func (rb *RootConfigBuilder) SetShutDown(shutDownConfig *ShutdownConfig) *RootConfigBuilder {
- rb.rootConfig.Shutdown = shutDownConfig
- return rb
-}
-
-func (rb *RootConfigBuilder) SetTLSConfig(tlsConfig *TLSConfig) *RootConfigBuilder {
- rb.rootConfig.TLSConfig = tlsConfig
- return rb
-}
-
-func (rb *RootConfigBuilder) Build() *RootConfig {
- return rb.rootConfig
-}
-
-// Process receive changing listener's event, dynamic update config
-func (rc *RootConfig) Process(event *config_center.ConfigChangeEvent) {
- logger.Infof("CenterConfig process event:\n%+v", event)
- config := NewLoaderConf(WithBytes([]byte(event.Value.(string))))
- koan := GetConfigResolver(config)
-
- updateRootConfig := &RootConfig{}
- if err := koan.UnmarshalWithConf(rc.Prefix(),
- updateRootConfig, koanf.UnmarshalConf{Tag: "yaml"}); err != nil {
- logger.Errorf("CenterConfig process unmarshalConf failed, got error %#v", err)
- return
- }
- nextRootConfig := cloneRootConfigForDynamicUpdate(rc)
- // dynamically update register
- for registerId, updateRegister := range updateRootConfig.Registries {
- if register := nextRootConfig.Registries[registerId]; register != nil {
- register.DynamicUpdateProperties(updateRegister)
- }
- }
- // dynamically update consumer
- if nextRootConfig.Consumer != nil {
- nextRootConfig.Consumer.DynamicUpdateProperties(updateRootConfig.Consumer)
- }
-
- setRootConfigInternal(nextRootConfig)
-}
-
-func cloneRootConfigForDynamicUpdate(rc *RootConfig) *RootConfig {
- next := *rc
- if rc.Registries != nil {
- next.Registries = make(map[string]*RegistryConfig, len(rc.Registries))
- for registryID, registryConfig := range rc.Registries {
- if registryConfig == nil {
- next.Registries[registryID] = nil
- continue
- }
- registryCopy := *registryConfig
- next.Registries[registryID] = ®istryCopy
- }
- }
-
- if rc.Consumer != nil {
- consumerCopy := *rc.Consumer
- next.Consumer = &consumerCopy
- }
- return &next
-}
-
-// TODO:When config is migrated later, the impact of this will be migrated to the global module
-// validateRegistryAddresses Checks whether there are duplicate registry addresses
-func validateRegistryAddresses(registries map[string]*RegistryConfig) error {
- cacheKeyMap := make(map[string]string, len(registries))
-
- for id, reg := range registries {
- address := reg.Address
- namespace := reg.Namespace
-
- cacheKey := address
- if namespace != "" {
- cacheKey = cacheKey + "?" + constant.NacosNamespaceID + "=" + namespace
- }
-
- if existingID, exists := cacheKeyMap[cacheKey]; exists {
- err := fmt.Errorf("duplicate registry address: [%s] used by both [%s] and [%s]", cacheKey, existingID, id)
- logger.Errorf("duplicate registry address: [%s] used by both [%s] and [%s]", cacheKey, existingID, id)
- return err
- }
-
- cacheKeyMap[cacheKey] = id
- }
-
- return nil
-}
diff --git a/config/root_config_test.go b/config/root_config_test.go
deleted file mode 100644
index 92415594d..000000000
--- a/config/root_config_test.go
+++ /dev/null
@@ -1,142 +0,0 @@
-/*
- * 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
-
-import (
- "fmt"
- "sync"
- "testing"
-)
-
-import (
- "github.com/dubbogo/gost/encoding/yaml"
-
- "github.com/stretchr/testify/assert"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/config_center"
-)
-
-func TestGoConfigProcess(t *testing.T) {
- rc := &RootConfigBuilder{rootConfig: newEmptyRootConfig()}
- r := &RegistryConfig{Protocol: "zookeeper", Timeout: "10s", Address: "127.0.0.1:2181"}
- rc.AddRegistry("demoZK", r)
- SetRootConfig(*rc.rootConfig)
-
- // test koan.UnmarshalWithConf error
- b := "dubbo:\n registries:\n demoZK:\n protocol: zookeeper\n timeout: 11s\n address: 127.0.0.1:2181\n simplified: abc123"
- c2 := &config_center.ConfigChangeEvent{Key: "test", Value: b}
- GetRootConfig().Process(c2)
- assert.Equal(t, "10s", GetRootConfig().Registries["demoZK"].Timeout)
-
- // test update registry time out
- bs, _ := yaml.LoadYMLConfig("./testdata/root_config_test.yml")
- c := &config_center.ConfigChangeEvent{Key: "test", Value: string(bs)}
- GetRootConfig().Process(c)
- assert.Equal(t, "11s", GetRootConfig().Registries["demoZK"].Timeout)
- assert.Equal(t, "6s", GetRootConfig().Consumer.RequestTimeout)
-
-}
-
-func TestNewRootConfigBuilder(t *testing.T) {
- registryConfig := NewRegistryConfigWithProtocolDefaultPort("nacos")
- protocolConfig := NewProtocolConfigBuilder().
- SetName("dubbo").
- SetPort("20000").
- Build()
- newConfig := NewRootConfigBuilder().
- SetConfigCenter(NewConfigCenterConfigBuilder().Build()).
- SetMetadataReport(NewMetadataReportConfigBuilder().Build()).
- AddProtocol("dubbo", protocolConfig).
- AddRegistry("nacos", registryConfig).
- SetProtocols(map[string]*ProtocolConfig{"dubbo": protocolConfig}).
- SetRegistries(map[string]*RegistryConfig{"nacos": registryConfig}).
- SetProvider(NewProviderConfigBuilder().Build()).
- SetConsumer(NewConsumerConfigBuilder().Build()).
- SetMetric(NewMetricConfigBuilder().Build()).
- SetLogger(NewLoggerConfigBuilder().Build()).
- SetShutdown(NewShutDownConfigBuilder().Build()).
- SetShutDown(NewShutDownConfigBuilder().Build()).
- SetRouter([]*RouterConfig{}).
- SetEventDispatcherType("direct").
- SetCacheFile("abc=123").
- Build()
-
- SetRootConfig(*newConfig)
-
- assert.Equal(t, constant.Dubbo, newConfig.Prefix())
- ids := newConfig.getRegistryIds()
- assert.Equal(t, "nacos", ids[0])
-
- down := GetShutDown()
- assert.NotNil(t, down)
-
- application := GetApplicationConfig()
- assert.NotNil(t, application)
-
- registerPOJO()
- config := GetRootConfig()
- assert.Equal(t, newConfig, config)
-}
-
-func TestRootConfigConcurrentSetAndGet(t *testing.T) {
- SetRootConfig(*NewRootConfigBuilder().Build())
-
- var wg sync.WaitGroup
- for i := 0; i < 50; i++ {
- wg.Add(2)
- go func(idx int) {
- defer wg.Done()
- cfg := NewRootConfigBuilder().Build()
- cfg.Application.Name = fmt.Sprintf("app-%d", idx)
- SetRootConfig(*cfg)
- }(i)
- go func() {
- defer wg.Done()
- _ = GetRootConfig()
- }()
- }
- wg.Wait()
- finalCfg := GetRootConfig()
- assert.NotNil(t, finalCfg)
- assert.NotEmpty(t, finalCfg.Application.Name)
-}
-
-func TestRootConfigProcessCopyOnWrite(t *testing.T) {
- base := NewRootConfigBuilder().Build()
- base.Registries["demoZK"] = &RegistryConfig{
- Protocol: "zookeeper",
- Timeout: "10s",
- Address: "127.0.0.1:2181",
- }
- base.Consumer.RequestTimeout = "3s"
- SetRootConfig(*base)
-
- oldSnapshot := GetRootConfig()
- eventValue := "dubbo:\n registries:\n demoZK:\n protocol: zookeeper\n timeout: 11s\n address: 127.0.0.1:2181\n consumer:\n request-timeout: 6s\n"
- oldSnapshot.Process(&config_center.ConfigChangeEvent{Key: "test", Value: eventValue})
-
- newSnapshot := GetRootConfig()
- assert.NotSame(t, oldSnapshot, newSnapshot)
- assert.Equal(t, "10s", oldSnapshot.Registries["demoZK"].Timeout)
- assert.Equal(t, "3s", oldSnapshot.Consumer.RequestTimeout)
- assert.Equal(t, "11s", newSnapshot.Registries["demoZK"].Timeout)
- assert.Equal(t, "6s", newSnapshot.Consumer.RequestTimeout)
-}
diff --git a/config/router_config.go b/config/router_config.go
deleted file mode 100644
index 7971fd58f..000000000
--- a/config/router_config.go
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * 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
-
-import (
- "reflect"
-)
-
-import (
- "github.com/creasty/defaults"
-)
-
-import (
- _ "dubbo.apache.org/dubbo-go/v3/cluster/router/chain"
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- _ "dubbo.apache.org/dubbo-go/v3/metrics/prometheus"
-)
-
-// RouterConfig is the configuration of the router.
-type RouterConfig struct {
- Scope string `validate:"required" yaml:"scope" json:"scope,omitempty" property:"scope"` // must be chosen from `service` and `application`.
- Key string `validate:"required" yaml:"key" json:"key,omitempty" property:"key"` // specifies which service or application the rule body acts on.
- Force *bool `default:"false" yaml:"force" json:"force,omitempty" property:"force"`
- Runtime *bool `default:"false" yaml:"runtime" json:"runtime,omitempty" property:"runtime"`
- Enabled *bool `default:"true" yaml:"enabled" json:"enabled,omitempty" property:"enabled"`
- Valid *bool `default:"true" yaml:"valid" json:"valid,omitempty" property:"valid"`
- Priority int `default:"0" yaml:"priority" json:"priority,omitempty" property:"priority"`
- Conditions []string `yaml:"conditions" json:"conditions,omitempty" property:"conditions"`
- Tags []Tag `yaml:"tags" json:"tags,omitempty" property:"tags"`
- ScriptType string `yaml:"type" json:"type,omitempty" property:"type"`
- Script string `yaml:"script" json:"script,omitempty" property:"script"`
-}
-
-type Tag struct {
- Name string `yaml:"name" json:"name,omitempty" property:"name"`
- Match []*common.ParamMatch `yaml:"match" json:"match,omitempty" property:"match"`
- Addresses []string `yaml:"addresses" json:"addresses,omitempty" property:"addresses"`
-}
-
-type ConditionRule struct {
- From ConditionRuleFrom `yaml:"from" json:"from,omitempty" property:"from"`
- To []ConditionRuleTo `yaml:"to" json:"to,omitempty" property:"to"`
-}
-
-type ConditionRuleFrom struct {
- Match string `yaml:"match" json:"match,omitempty" property:"match"`
-}
-
-type ConditionRuleTo struct {
- Match string `yaml:"match" json:"match,omitempty" property:"match"`
- Weight int `default:"100" yaml:"weight" json:"weight,omitempty" property:"weight"`
-}
-
-type ConditionRuleDisable struct {
- Match string `yaml:"match" json:"match,omitempty" property:"match"`
-}
-
-type AffinityAware struct {
- Key string `default:"" yaml:"key" json:"key,omitempty" property:"key"`
- Ratio int32 `default:"0" yaml:"ratio" json:"ratio,omitempty" property:"ratio"`
-}
-
-// ConditionRouter -- when RouteConfigVersion == v3.1, decode by this
-type ConditionRouter struct {
- Scope string `validate:"required" yaml:"scope" json:"scope,omitempty" property:"scope"` // must be chosen from `service` and `application`.
- Key string `validate:"required" yaml:"key" json:"key,omitempty" property:"key"` // specifies which service or application the rule body acts on.
- Force bool `default:"false" yaml:"force" json:"force,omitempty" property:"force"`
- Runtime bool `default:"false" yaml:"runtime" json:"runtime,omitempty" property:"runtime"`
- Enabled bool `default:"true" yaml:"enabled" json:"enabled,omitempty" property:"enabled"`
- Conditions []*ConditionRule `yaml:"conditions" json:"conditions,omitempty" property:"conditions"`
-}
-
-// AffinityRouter -- RouteConfigVersion == v3.1
-type AffinityRouter struct {
- Scope string `validate:"required" yaml:"scope" json:"scope,omitempty" property:"scope"` // must be chosen from `service` and `application`.
- Key string `validate:"required" yaml:"key" json:"key,omitempty" property:"key"` // specifies which service or application the rule body acts on.
- Runtime bool `default:"false" yaml:"runtime" json:"runtime,omitempty" property:"runtime"`
- Enabled bool `default:"true" yaml:"enabled" json:"enabled,omitempty" property:"enabled"`
- AffinityAware AffinityAware `yaml:"affinityAware" json:"affinityAware,omitempty" property:"affinityAware"`
-}
-
-// Prefix dubbo.router
-func (RouterConfig) Prefix() string {
- return constant.RouterConfigPrefix
-}
-
-func (c *RouterConfig) Init() error {
- if err := defaults.Set(c); err != nil {
- return err
- }
- return verify(c)
-}
-
-func initRouterConfig(rc *RootConfig) error {
- routers := rc.Router
- if len(routers) > 0 {
- for _, r := range routers {
- if err := r.Init(); err != nil {
- return err
- }
- }
- rc.Router = routers
- }
-
- //chain.SetVSAndDRConfigByte(vsBytes, drBytes)
- return nil
-}
-
-type RouterConfigBuilder struct {
- routerConfig *RouterConfig
-}
-
-func NewRouterConfigBuilder() *RouterConfigBuilder {
- return &RouterConfigBuilder{routerConfig: &RouterConfig{}}
-}
-
-func (rcb *RouterConfigBuilder) SetScope(scope string) *RouterConfigBuilder {
- rcb.routerConfig.Scope = scope
- return rcb
-}
-
-func (rcb *RouterConfigBuilder) SetKey(key string) *RouterConfigBuilder {
- rcb.routerConfig.Key = key
- return rcb
-}
-
-func (rcb *RouterConfigBuilder) SetForce(force bool) *RouterConfigBuilder {
- rcb.routerConfig.Force = &force
- return rcb
-}
-
-func (rcb *RouterConfigBuilder) SetRuntime(runtime bool) *RouterConfigBuilder {
- rcb.routerConfig.Runtime = &runtime
- return rcb
-}
-
-func (rcb *RouterConfigBuilder) SetEnabled(enabled bool) *RouterConfigBuilder {
- rcb.routerConfig.Enabled = &enabled
- return rcb
-}
-
-func (rcb *RouterConfigBuilder) SetValid(valid bool) *RouterConfigBuilder {
- rcb.routerConfig.Valid = &valid
- return rcb
-}
-
-func (rcb *RouterConfigBuilder) SetPriority(priority int) *RouterConfigBuilder {
- rcb.routerConfig.Priority = priority
- return rcb
-}
-
-func (rcb *RouterConfigBuilder) SetConditions(conditions []string) *RouterConfigBuilder {
- rcb.routerConfig.Conditions = conditions
- return rcb
-}
-
-func (rcb *RouterConfigBuilder) AddCondition(condition string) *RouterConfigBuilder {
- if rcb.routerConfig.Conditions == nil {
- rcb.routerConfig.Conditions = make([]string, 0)
- }
- rcb.routerConfig.Conditions = append(rcb.routerConfig.Conditions, condition)
- return rcb
-}
-
-func (rcb *RouterConfigBuilder) SetTags(tags []Tag) *RouterConfigBuilder {
- rcb.routerConfig.Tags = tags
- return rcb
-}
-
-func (rcb *RouterConfigBuilder) AddTag(tag Tag) *RouterConfigBuilder {
- if rcb.routerConfig.Tags == nil {
- rcb.routerConfig.Tags = make([]Tag, 0)
- }
- rcb.routerConfig.Tags = append(rcb.routerConfig.Tags, tag)
- return rcb
-}
-
-func (rcb *RouterConfigBuilder) Build() *RouterConfig {
- if err := rcb.routerConfig.Init(); err != nil {
- panic(err)
- }
- return rcb.routerConfig
-}
-
-func (x *ConditionRule) Equal(t *ConditionRule) bool {
- if !reflect.DeepEqual(x.From, t.From) {
- return false
- }
- if len(x.To) != len(t.To) {
- return false
- }
- for i := range x.To {
- if !reflect.DeepEqual(x.To[i], t.To[i]) {
- return false
- }
- }
- return true
-}
diff --git a/config/router_config_test.go b/config/router_config_test.go
deleted file mode 100644
index fcaed0670..000000000
--- a/config/router_config_test.go
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * 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
-
-import (
- "strings"
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-func TestString(t *testing.T) {
- s := "a1=>a2"
- s1 := "=>a2"
- s2 := "a1=>"
-
- n := strings.SplitN(s, "=>", 2)
- n1 := strings.SplitN(s1, "=>", 2)
- n2 := strings.SplitN(s2, "=>", 2)
-
- assert.Equal(t, "a1", n[0])
- assert.Equal(t, "a2", n[1])
-
- assert.Empty(t, n1[0])
- assert.Equal(t, "a2", n1[1])
-
- assert.Equal(t, "a1", n2[0])
- assert.Empty(t, n2[1])
-}
-
-func TestRouterInit(t *testing.T) {
- //err := RouterInit(testVirtualServiceYML, testDestinationRuleYML)
- //require.NoError(t, err)
- //
- //err = RouterInit(testVirtualServiceYML, errorTestDestinationRuleYML)
- //assert.Error(t, err)
-}
-
-func TestNewRouterConfigBuilder(t *testing.T) {
- tag := Tag{
- Name: "tag",
- Addresses: []string{"127.0.0.1"},
- }
- rc := newEmptyRootConfig()
- config := NewRouterConfigBuilder().
- SetScope("scope").
- SetKey("key").
- SetForce(true).
- SetRuntime(true).
- SetEnabled(true).
- SetValid(true).
- SetPriority(10).
- SetConditions([]string{"condition"}).
- AddCondition("condition").
- SetTags([]Tag{tag}).
- AddTag(tag).
- Build()
-
- err := initRouterConfig(rc)
- require.NoError(t, err)
- err = config.Init()
- require.NoError(t, err)
-
- assert.Equal(t, constant.RouterConfigPrefix, config.Prefix())
-}
diff --git a/config/service.go b/config/service.go
deleted file mode 100644
index cdcfbc52a..000000000
--- a/config/service.go
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * 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
-
-import (
- "sync"
-)
-
-import (
- "github.com/dubbogo/gost/log/logger"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
-)
-
-var (
- conServicesLock = sync.Mutex{} // used to guard conServices map.
- conServices = map[string]common.RPCService{} // service name -> service
- proServicesLock = sync.Mutex{} // used to guard proServices map and proServicesInfo map
- proServices = map[string]common.RPCService{} // service name -> service
- proServicesInfo = map[string]any{} // service name -> service info
- interfaceNameConServicesLock = sync.Mutex{} // used to guard interfaceNameConServices map
- interfaceNameConServices = map[string]common.RPCService{} // interfaceName -> service
-)
-
-// SetConsumerService is called by init() of implement of RPCService
-func SetConsumerService(service common.RPCService) {
- ref := common.GetReference(service)
- conServicesLock.Lock()
- defer func() {
- conServicesLock.Unlock()
- logger.Debugf("A consumer service %s was registered successfully.", ref)
- }()
- conServices[ref] = service
-}
-
-// SetProviderService is called by init() of implementation of RPCService
-func SetProviderService(service common.RPCService) {
- ref := common.GetReference(service)
- proServicesLock.Lock()
- defer func() {
- proServicesLock.Unlock()
- logger.Debugf("A provider service %s was registered successfully.", ref)
- }()
- proServices[ref] = service
-}
-
-// SetProviderServiceWithInfo is called by init() of implementation of RPCService
-func SetProviderServiceWithInfo(service common.RPCService, info any) {
- ref := common.GetReference(service)
- proServicesLock.Lock()
- defer func() {
- proServicesLock.Unlock()
- logger.Debugf("A provider service %s was registered successfully.", ref)
- }()
- proServices[ref] = service
- proServicesInfo[ref] = info
-}
-
-// GetConsumerService gets ConsumerService by @name
-func GetConsumerService(name string) common.RPCService {
- conServicesLock.Lock()
- defer conServicesLock.Unlock()
- return conServices[name]
-}
-
-// GetProviderService gets ProviderService by @name
-func GetProviderService(name string) common.RPCService {
- proServicesLock.Lock()
- defer proServicesLock.Unlock()
- return proServices[name]
-}
-
-// GetProviderServiceMap gets ProviderServiceMap
-func GetProviderServiceMap() map[string]common.RPCService {
- proServicesLock.Lock()
- defer proServicesLock.Unlock()
-
- m := make(map[string]common.RPCService, len(proServices))
- for k, v := range proServices {
- m[k] = v
- }
- return m
-}
-
-func GetProviderServiceInfo(name string) any {
- proServicesLock.Lock()
- defer proServicesLock.Unlock()
- return proServicesInfo[name]
-}
-
-// GetConsumerServiceMap gets ProviderServiceMap
-func GetConsumerServiceMap() map[string]common.RPCService {
- conServicesLock.Lock()
- defer conServicesLock.Unlock()
-
- m := make(map[string]common.RPCService, len(conServices))
- for k, v := range conServices {
- m[k] = v
- }
- return m
-}
-
-// SetConsumerServiceByInterfaceName is used by pb serialization
-func SetConsumerServiceByInterfaceName(interfaceName string, srv common.RPCService) {
- interfaceNameConServicesLock.Lock()
- defer interfaceNameConServicesLock.Unlock()
- interfaceNameConServices[interfaceName] = srv
-}
-
-// GetConsumerServiceByInterfaceName is used by pb serialization
-func GetConsumerServiceByInterfaceName(interfaceName string) common.RPCService {
- interfaceNameConServicesLock.Lock()
- defer interfaceNameConServicesLock.Unlock()
- return interfaceNameConServices[interfaceName]
-}
-
-// GetCallback gets CallbackResponse by @name
-func GetCallback(name string) func(response common.CallbackResponse) {
- service := GetConsumerService(name)
- if sv, ok := service.(common.AsyncCallbackService); ok {
- return sv.CallBack
- }
- return nil
-}
-
-// SetClientInfoService is used by new Triple generated code
-// use any to represent info because config package can not depend on client package.
-// When refactoring work finished, this info should be with *client.ClientInfo type and this
-// function would be implemented.
-// todo(DMWangnima): refactor and implement this function
-func SetClientInfoService(info any, service common.RPCService) {}
diff --git a/config/service_config.go b/config/service_config.go
deleted file mode 100644
index cf7e5fb1a..000000000
--- a/config/service_config.go
+++ /dev/null
@@ -1,606 +0,0 @@
-/*
- * 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
-
-import (
- "container/list"
- "fmt"
- "net/url"
- "os"
- "strconv"
- "strings"
- "sync"
- "time"
-)
-
-import (
- "github.com/creasty/defaults"
-
- "github.com/dubbogo/gost/log/logger"
-
- perrors "github.com/pkg/errors"
-
- "go.uber.org/atomic"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/common/extension"
- "dubbo.apache.org/dubbo-go/v3/protocol/base"
- "dubbo.apache.org/dubbo-go/v3/protocol/protocolwrapper"
-)
-
-// ServiceConfig is the configuration of the service provider
-type ServiceConfig struct {
- id string
- Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"`
- ProtocolIDs []string `yaml:"protocol-ids" json:"protocol-ids,omitempty" property:"protocol-ids"` // multi protocolIDs support, split by ','
- Interface string `yaml:"interface" json:"interface,omitempty" property:"interface"`
- RegistryIDs []string `yaml:"registry-ids" json:"registry-ids,omitempty" property:"registry-ids"`
- Cluster string `default:"failover" yaml:"cluster" json:"cluster,omitempty" property:"cluster"`
- Loadbalance string `default:"random" yaml:"loadbalance" json:"loadbalance,omitempty" property:"loadbalance"`
- Group string `yaml:"group" json:"group,omitempty" property:"group"`
- Version string `yaml:"version" json:"version,omitempty" property:"version" `
- Methods []*MethodConfig `yaml:"methods" json:"methods,omitempty" property:"methods"`
- Warmup string `yaml:"warmup" json:"warmup,omitempty" property:"warmup"`
- Retries string `yaml:"retries" json:"retries,omitempty" property:"retries"`
- Serialization string `yaml:"serialization" json:"serialization" property:"serialization"`
- Params map[string]string `yaml:"params" json:"params,omitempty" property:"params"`
- Token string `yaml:"token" json:"token,omitempty" property:"token"`
- AccessLog string `yaml:"accesslog" json:"accesslog,omitempty" property:"accesslog"`
- TpsLimiter string `yaml:"tps.limiter" json:"tps.limiter,omitempty" property:"tps.limiter"`
- TpsLimitInterval string `yaml:"tps.limit.interval" json:"tps.limit.interval,omitempty" property:"tps.limit.interval"`
- TpsLimitRate string `yaml:"tps.limit.rate" json:"tps.limit.rate,omitempty" property:"tps.limit.rate"`
- TpsLimitStrategy string `yaml:"tps.limit.strategy" json:"tps.limit.strategy,omitempty" property:"tps.limit.strategy"`
- TpsLimitRejectedHandler string `yaml:"tps.limit.rejected.handler" json:"tps.limit.rejected.handler,omitempty" property:"tps.limit.rejected.handler"`
- ExecuteLimit string `yaml:"execute.limit" json:"execute.limit,omitempty" property:"execute.limit"`
- ExecuteLimitRejectedHandler string `yaml:"execute.limit.rejected.handler" json:"execute.limit.rejected.handler,omitempty" property:"execute.limit.rejected.handler"`
- Auth string `yaml:"auth" json:"auth,omitempty" property:"auth"`
- NotRegister bool `yaml:"not_register" json:"not_register,omitempty" property:"not_register"`
- ParamSign string `yaml:"param.sign" json:"param.sign,omitempty" property:"param.sign"`
- Tag string `yaml:"tag" json:"tag,omitempty" property:"tag"`
- TracingKey string `yaml:"tracing-key" json:"tracing-key,omitempty" propertiy:"tracing-key"`
-
- RCProtocolsMap map[string]*ProtocolConfig
- RCRegistriesMap map[string]*RegistryConfig
- ProxyFactoryKey string
- adaptiveService bool
- metricsEnable bool // whether append metrics filter to filter chain
- unexported *atomic.Bool
- exported *atomic.Bool
- export bool // a flag to control whether the current service should export or not
- rpcService common.RPCService
- cacheMutex sync.Mutex
- cacheProtocol base.Protocol
- exportersLock sync.Mutex
- exporters []base.Exporter
-
- metadataType string
- rc *RootConfig
-}
-
-// Prefix returns dubbo.service.${InterfaceName}.
-func (s *ServiceConfig) Prefix() string {
- return strings.Join([]string{constant.ServiceConfigPrefix, s.id}, ".")
-}
-
-func (s *ServiceConfig) Init(rc *RootConfig) error {
- s.rc = rc
- if err := initProviderMethodConfig(s); err != nil {
- return err
- }
- if err := defaults.Set(s); err != nil {
- return err
- }
- s.exported = atomic.NewBool(false)
- s.metadataType = rc.Application.MetadataType
- if s.Filter == "" {
- s.Filter = rc.Provider.Filter
- }
- if s.Version == "" {
- s.Version = rc.Application.Version
- }
- if s.Group == "" {
- s.Group = rc.Application.Group
- }
- s.unexported = atomic.NewBool(false)
- if len(s.RCRegistriesMap) == 0 {
- s.RCRegistriesMap = rc.Registries
- }
- if len(s.RCProtocolsMap) == 0 {
- s.RCProtocolsMap = rc.Protocols
- }
- if rc.Provider != nil {
- s.ProxyFactoryKey = rc.Provider.ProxyFactory
- }
- s.RegistryIDs = translateIds(s.RegistryIDs)
- if len(s.RegistryIDs) <= 0 {
- s.RegistryIDs = rc.Provider.RegistryIDs
- }
-
- s.ProtocolIDs = translateIds(s.ProtocolIDs)
- if len(s.ProtocolIDs) <= 0 {
- s.ProtocolIDs = rc.Provider.ProtocolIDs
- }
- if len(s.ProtocolIDs) <= 0 {
- for k := range rc.Protocols {
- s.ProtocolIDs = append(s.ProtocolIDs, k)
- }
- }
- if s.TracingKey == "" {
- s.TracingKey = rc.Provider.TracingKey
- }
- if rc.Metrics.Enable != nil {
- s.metricsEnable = *rc.Metrics.Enable
- }
- err := s.check()
- if err != nil {
- panic(err)
- }
- s.export = true
- return verify(s)
-}
-
-func (s *ServiceConfig) check() error {
- // check if the limiter has been imported
- if s.TpsLimiter != "" {
- _, err := extension.GetTpsLimiter(s.TpsLimiter)
- if err != nil {
- panic(err)
- }
- }
- if s.TpsLimitStrategy != "" {
- _, err := extension.GetTpsLimitStrategyCreator(s.TpsLimitStrategy)
- if err != nil {
- panic(err)
- }
- }
- if s.TpsLimitRejectedHandler != "" {
- _, err := extension.GetRejectedExecutionHandler(s.TpsLimitRejectedHandler)
- if err != nil {
- panic(err)
- }
- }
-
- if s.TpsLimitInterval != "" {
- tpsLimitInterval, err := strconv.ParseInt(s.TpsLimitInterval, 0, 0)
- if err != nil {
- return fmt.Errorf("[ServiceConfig] Cannot parse the configuration tps.limit.interval for service %s, please check your configuration", s.Interface)
- }
- if tpsLimitInterval < 0 {
- return fmt.Errorf("[ServiceConfig] The configuration tps.limit.interval for service %s must be positive, please check your configuration", s.Interface)
- }
- }
-
- if s.TpsLimitRate != "" {
- tpsLimitRate, err := strconv.ParseInt(s.TpsLimitRate, 0, 0)
- if err != nil {
- return fmt.Errorf("[ServiceConfig] Cannot parse the configuration tps.limit.rate for service %s, please check your configuration", s.Interface)
- }
- if tpsLimitRate < 0 {
- return fmt.Errorf("[ServiceConfig] The configuration tps.limit.rate for service %s must be positive, please check your configuration", s.Interface)
- }
- }
- return nil
-}
-
-// InitExported will set exported as false atom bool
-func (s *ServiceConfig) InitExported() {
- s.exported = atomic.NewBool(false)
-}
-
-// IsExport will return whether the service config is exported or not
-func (s *ServiceConfig) IsExport() bool {
- return s.exported.Load()
-}
-
-// Get Random Port
-func getRandomPort(protocolConfigs []*ProtocolConfig) *list.List {
- ports := list.New()
- for _, proto := range protocolConfigs {
- if port, err := strconv.Atoi(proto.Port); err != nil {
- logger.Infof(
- "%s will be assgined to a random port, since the port is an invalid number",
- proto.Name,
- )
- } else if port > 0 {
- continue
- }
-
- ports.PushBack(common.GetRandomPort(proto.Ip))
- }
- return ports
-}
-
-// Export exports the service
-func (s *ServiceConfig) Export() error {
- // TODO: delay export
- if s.unexported != nil && s.unexported.Load() {
- err := perrors.Errorf("The service %v has already unexported!", s.Interface)
- logger.Errorf(err.Error())
- return err
- }
- if s.exported != nil && s.exported.Load() {
- logger.Warnf("The service %v has already exported!", s.Interface)
- return nil
- }
-
- common.WarnVariadicRPCMethods(s.Interface, s.rpcService)
-
- regUrls := make([]*common.URL, 0)
- if !s.NotRegister {
- regUrls = LoadRegistries(s.RegistryIDs, s.RCRegistriesMap, common.PROVIDER)
- }
-
- urlMap := s.getUrlMap()
- protocolConfigs := loadProtocol(s.ProtocolIDs, s.RCProtocolsMap)
- if len(protocolConfigs) == 0 {
- logger.Warnf("The service %v's '%v' protocols don't has right protocolConfigs, Please check your configuration center and transfer protocol ", s.Interface, s.ProtocolIDs)
- return nil
- }
-
- var invoker base.Invoker
- ports := getRandomPort(protocolConfigs)
- nextPort := ports.Front()
-
- for _, protocolConf := range protocolConfigs {
- // registry the service reflect
- methods, err := common.ServiceMap.Register(s.Interface, protocolConf.Name, s.Group, s.Version, s.rpcService)
- if err != nil {
- formatErr := perrors.Errorf("The service %v export the protocol %v error! Error message is %v.",
- s.Interface, protocolConf.Name, err.Error())
- logger.Errorf(formatErr.Error())
- return formatErr
- }
-
- port := protocolConf.Port
- if num, err := strconv.Atoi(protocolConf.Port); err != nil || num <= 0 {
- port = nextPort.Value.(string)
- nextPort = nextPort.Next()
- }
- ivkURL := common.NewURLWithOptions(
- common.WithPath(s.Interface),
- common.WithProtocol(protocolConf.Name),
- common.WithIp(protocolConf.Ip),
- common.WithPort(port),
- common.WithParams(urlMap),
- common.WithParamsValue(constant.BeanNameKey, s.id),
- common.WithParamsValue(constant.ApplicationTagKey, s.rc.Application.Tag),
- //common.WithParamsValue(constant.SslEnabledKey, strconv.FormatBool(config.GetSslEnabled())),
- common.WithMethods(strings.Split(methods, ",")),
- common.WithAttribute(constant.RpcServiceKey, s.rpcService),
- common.WithAttribute(constant.ProviderConfigKey, s.rc.Provider),
- common.WithToken(s.Token),
- common.WithParamsValue(constant.MetadataTypeKey, s.metadataType),
- // fix https://github.com/apache/dubbo-go/issues/2176
- common.WithParamsValue(constant.MaxServerSendMsgSize, protocolConf.MaxServerSendMsgSize),
- common.WithParamsValue(constant.MaxServerRecvMsgSize, protocolConf.MaxServerRecvMsgSize),
- )
- info := GetProviderServiceInfo(s.id)
- if info != nil {
- ivkURL.SetAttribute(constant.ServiceInfoKey, info)
- }
-
- if len(s.Tag) > 0 {
- ivkURL.SetParam(constant.Tagkey, s.Tag)
- }
-
- // post process the URL to be exported
- s.postProcessConfig(ivkURL)
- // config post processor may set "export" to false
- if !ivkURL.GetParamBool(constant.ExportKey, true) {
- return nil
- }
-
- if len(regUrls) > 0 {
- s.cacheMutex.Lock()
- if s.cacheProtocol == nil {
- logger.Debugf(fmt.Sprintf("First load the registry protocol, url is {%v}!", ivkURL))
- s.cacheProtocol = extension.GetProtocol(constant.RegistryProtocol)
- }
- s.cacheMutex.Unlock()
-
- for _, regUrl := range regUrls {
- setRegistrySubURL(ivkURL, regUrl)
-
- invoker = s.generatorInvoker(regUrl, info)
- exporter := s.cacheProtocol.Export(invoker)
- if exporter == nil {
- return perrors.New(fmt.Sprintf("Registry protocol new exporter error, registry is {%v}, url is {%v}", regUrl, ivkURL))
- }
- s.exporters = append(s.exporters, exporter)
- }
- } else {
- invoker = s.generatorInvoker(ivkURL, info)
- exporter := extension.GetProtocol(protocolwrapper.FILTER).Export(invoker)
- if exporter == nil {
- return perrors.New(fmt.Sprintf("Filter protocol without registry new exporter error, url is {%v}", ivkURL))
- }
- s.exporters = append(s.exporters, exporter)
- }
- }
- s.exported.Store(true)
- return nil
-}
-
-func (s *ServiceConfig) generatorInvoker(url *common.URL, info any) base.Invoker {
- proxyFactory := extension.GetProxyFactory(s.ProxyFactoryKey)
- if info != nil {
- url.SetAttribute(constant.ServiceInfoKey, info)
- url.SetAttribute(constant.RpcServiceKey, s.rpcService)
- }
- return proxyFactory.GetInvoker(url)
-}
-
-// setRegistrySubURL set registry sub url is ivkURl
-func setRegistrySubURL(ivkURL *common.URL, regUrl *common.URL) {
- ivkURL.SetParam(constant.RegistryKey, regUrl.GetParam(constant.RegistryKey, ""))
- regUrl.SubURL = ivkURL
-}
-
-// loadProtocol filter protocols by ids
-func loadProtocol(protocolIds []string, protocols map[string]*ProtocolConfig) []*ProtocolConfig {
- returnProtocols := make([]*ProtocolConfig, 0, len(protocols))
- for _, v := range protocolIds {
- for k, config := range protocols {
- if v == k {
- returnProtocols = append(returnProtocols, config)
- }
- }
- }
- return returnProtocols
-}
-
-// Unexport will call unexport of all exporters service config exported
-func (s *ServiceConfig) Unexport() {
- if !s.exported.Load() {
- return
- }
- if s.unexported.Load() {
- return
- }
-
- func() {
- s.exportersLock.Lock()
- defer s.exportersLock.Unlock()
- for _, exporter := range s.exporters {
- exporter.UnExport()
- }
- s.exporters = nil
- }()
-
- s.exported.Store(false)
- s.unexported.Store(true)
-}
-
-// Implement only store the @s and return
-func (s *ServiceConfig) Implement(rpcService common.RPCService) {
- s.rpcService = rpcService
-}
-
-func (s *ServiceConfig) getUrlMap() url.Values {
- urlMap := url.Values{}
- // first set user params
- for k, v := range s.Params {
- urlMap.Set(k, v)
- }
- urlMap.Set(constant.InterfaceKey, s.Interface)
- urlMap.Set(constant.TimestampKey, strconv.FormatInt(time.Now().Unix(), 10))
- urlMap.Set(constant.ClusterKey, s.Cluster)
- urlMap.Set(constant.LoadbalanceKey, s.Loadbalance)
- urlMap.Set(constant.WarmupKey, s.Warmup)
- urlMap.Set(constant.RetriesKey, s.Retries)
- if s.Group != "" {
- urlMap.Set(constant.GroupKey, s.Group)
- }
- if s.Version != "" {
- urlMap.Set(constant.VersionKey, s.Version)
- }
- urlMap.Set(constant.RegistryRoleKey, strconv.Itoa(common.PROVIDER))
- urlMap.Set(constant.ReleaseKey, "dubbo-golang-"+constant.Version)
- urlMap.Set(constant.SideKey, (common.RoleType(common.PROVIDER)).Role())
- // todo: move
- urlMap.Set(constant.SerializationKey, s.Serialization)
- // application config info
- ac := GetApplicationConfig()
- urlMap.Set(constant.ApplicationKey, ac.Name)
- urlMap.Set(constant.OrganizationKey, ac.Organization)
- urlMap.Set(constant.NameKey, ac.Name)
- urlMap.Set(constant.ModuleKey, ac.Module)
- urlMap.Set(constant.AppVersionKey, ac.Version)
- urlMap.Set(constant.OwnerKey, ac.Owner)
- urlMap.Set(constant.EnvironmentKey, ac.Environment)
-
- // filter
- var filters string
- if s.Filter == "" {
- filters = constant.DefaultServiceFilters
- } else {
- filters = s.Filter
- }
- if s.adaptiveService {
- filters += fmt.Sprintf(",%s", constant.AdaptiveServiceProviderFilterKey)
- }
- if s.metricsEnable {
- filters += fmt.Sprintf(",%s", constant.MetricsFilterKey)
- }
- urlMap.Set(constant.ServiceFilterKey, filters)
-
- // filter special config
- urlMap.Set(constant.AccessLogFilterKey, s.AccessLog)
- // tps limiter
- urlMap.Set(constant.TPSLimitStrategyKey, s.TpsLimitStrategy)
- urlMap.Set(constant.TPSLimitIntervalKey, s.TpsLimitInterval)
- urlMap.Set(constant.TPSLimitRateKey, s.TpsLimitRate)
- urlMap.Set(constant.TPSLimiterKey, s.TpsLimiter)
- urlMap.Set(constant.TPSRejectedExecutionHandlerKey, s.TpsLimitRejectedHandler)
- urlMap.Set(constant.TracingConfigKey, s.TracingKey)
-
- // execute limit filter
- urlMap.Set(constant.ExecuteLimitKey, s.ExecuteLimit)
- urlMap.Set(constant.ExecuteRejectedExecutionHandlerKey, s.ExecuteLimitRejectedHandler)
-
- // auth filter
- urlMap.Set(constant.ServiceAuthKey, s.Auth)
- urlMap.Set(constant.ParameterSignatureEnableKey, s.ParamSign)
-
- // whether to export or not
- urlMap.Set(constant.ExportKey, strconv.FormatBool(s.export))
- urlMap.Set(constant.PIDKey, fmt.Sprintf("%d", os.Getpid()))
-
- for _, v := range s.Methods {
- prefix := "methods." + v.Name + "."
- urlMap.Set(prefix+constant.LoadbalanceKey, v.LoadBalance)
- urlMap.Set(prefix+constant.RetriesKey, v.Retries)
- urlMap.Set(prefix+constant.WeightKey, strconv.FormatInt(v.Weight, 10))
-
- urlMap.Set(prefix+constant.TPSLimitStrategyKey, v.TpsLimitStrategy)
- urlMap.Set(prefix+constant.TPSLimitIntervalKey, v.TpsLimitInterval)
- urlMap.Set(prefix+constant.TPSLimitRateKey, v.TpsLimitRate)
-
- urlMap.Set(constant.ExecuteLimitKey, v.ExecuteLimit)
- urlMap.Set(constant.ExecuteRejectedExecutionHandlerKey, v.ExecuteLimitRejectedHandler)
- }
-
- return urlMap
-}
-
-// GetExportedUrls will return the url in service config's exporter
-func (s *ServiceConfig) GetExportedUrls() []*common.URL {
- if s.exported.Load() {
- var urls []*common.URL
- for _, exporter := range s.exporters {
- urls = append(urls, exporter.GetInvoker().GetURL())
- }
- return urls
- }
- return nil
-}
-
-// postProcessConfig asks registered ConfigPostProcessor to post-process the current ServiceConfig.
-func (s *ServiceConfig) postProcessConfig(url *common.URL) {
- for _, p := range extension.GetConfigPostProcessors() {
- p.PostProcessServiceConfig(url)
- }
-}
-
-// newEmptyServiceConfig returns default ServiceConfig
-func newEmptyServiceConfig() *ServiceConfig {
- newServiceConfig := &ServiceConfig{
- unexported: atomic.NewBool(false),
- exported: atomic.NewBool(false),
- export: true,
- RCProtocolsMap: make(map[string]*ProtocolConfig),
- RCRegistriesMap: make(map[string]*RegistryConfig),
- }
- newServiceConfig.Params = make(map[string]string)
- newServiceConfig.Methods = make([]*MethodConfig, 0, 8)
- return newServiceConfig
-}
-
-type ServiceConfigBuilder struct {
- serviceConfig *ServiceConfig
-}
-
-func NewServiceConfigBuilder() *ServiceConfigBuilder {
- return &ServiceConfigBuilder{serviceConfig: newEmptyServiceConfig()}
-}
-
-func (pcb *ServiceConfigBuilder) SetRegistryIDs(registryIDs ...string) *ServiceConfigBuilder {
- pcb.serviceConfig.RegistryIDs = registryIDs
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) SetProtocolIDs(protocolIDs ...string) *ServiceConfigBuilder {
- pcb.serviceConfig.ProtocolIDs = protocolIDs
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) SetInterface(interfaceName string) *ServiceConfigBuilder {
- pcb.serviceConfig.Interface = interfaceName
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) SetMetadataType(setMetadataType string) *ServiceConfigBuilder {
- pcb.serviceConfig.metadataType = setMetadataType
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) SetLoadBalance(lb string) *ServiceConfigBuilder {
- pcb.serviceConfig.Loadbalance = lb
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) SetWarmUpTie(warmUp string) *ServiceConfigBuilder {
- pcb.serviceConfig.Warmup = warmUp
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) SetCluster(cluster string) *ServiceConfigBuilder {
- pcb.serviceConfig.Cluster = cluster
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) AddRCProtocol(protocolName string, protocolConfig *ProtocolConfig) *ServiceConfigBuilder {
- pcb.serviceConfig.RCProtocolsMap[protocolName] = protocolConfig
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) AddRCRegistry(registryName string, registryConfig *RegistryConfig) *ServiceConfigBuilder {
- pcb.serviceConfig.RCRegistriesMap[registryName] = registryConfig
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) SetGroup(group string) *ServiceConfigBuilder {
- pcb.serviceConfig.Group = group
- return pcb
-}
-func (pcb *ServiceConfigBuilder) SetVersion(version string) *ServiceConfigBuilder {
- pcb.serviceConfig.Version = version
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) SetProxyFactoryKey(proxyFactoryKey string) *ServiceConfigBuilder {
- pcb.serviceConfig.ProxyFactoryKey = proxyFactoryKey
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) SetRPCService(service common.RPCService) *ServiceConfigBuilder {
- pcb.serviceConfig.rpcService = service
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) SetSerialization(serialization string) *ServiceConfigBuilder {
- pcb.serviceConfig.Serialization = serialization
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) SetServiceID(id string) *ServiceConfigBuilder {
- pcb.serviceConfig.id = id
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) SetNotRegister(notRegister bool) *ServiceConfigBuilder {
- pcb.serviceConfig.NotRegister = notRegister
- return pcb
-}
-
-func (pcb *ServiceConfigBuilder) Build() *ServiceConfig {
- return pcb.serviceConfig
-}
diff --git a/config/service_config_test.go b/config/service_config_test.go
deleted file mode 100644
index 36f5f2bab..000000000
--- a/config/service_config_test.go
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * 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
-
-import (
- "context"
- "fmt"
- "strings"
- "testing"
-)
-
-import (
- gostlogger "github.com/dubbogo/gost/log/logger"
-
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
- "dubbo.apache.org/dubbo-go/v3/common/constant"
- "dubbo.apache.org/dubbo-go/v3/common/extension"
- "dubbo.apache.org/dubbo-go/v3/protocol/protocolwrapper"
- _ "dubbo.apache.org/dubbo-go/v3/proxy/proxy_factory"
-)
-
-type HelloService struct {
-}
-
-func (hs *HelloService) Say(ctx context.Context, name string) (string, error) {
- return name, nil
-}
-func (hs *HelloService) Reference() string {
- return "HelloService"
-}
-
-func (hs *HelloService) JavaClassName() string {
- return "org.apache.dubbo.HelloService"
-}
-
-type VariadicHelloService struct{}
-
-func (hs *VariadicHelloService) Fanout(ctx context.Context, names ...string) error {
- return nil
-}
-
-func (hs *VariadicHelloService) Reference() string {
- return "VariadicHelloService"
-}
-
-type serviceConfigCaptureWarnLogger struct {
- gostlogger.Logger
- warns []string
-}
-
-func (l *serviceConfigCaptureWarnLogger) Warnf(template string, args ...any) {
- l.warns = append(l.warns, fmt.Sprintf(template, args...))
-}
-
-func TestNewServiceConfigBuilder(t *testing.T) {
- SetProviderService(&HelloService{})
- var serviceConfig = newEmptyServiceConfig()
- t.Run("NewServiceConfigBuilder", func(t *testing.T) {
- registryConfig := NewRegistryConfigWithProtocolDefaultPort("nacos")
- protocolConfig := NewProtocolConfigBuilder().
- SetName("dubbo").
- SetPort("20000").
- Build()
- rc := newEmptyRootConfig()
-
- serviceConfig = NewServiceConfigBuilder().
- SetRegistryIDs("nacos").
- SetProtocolIDs("dubbo").
- SetInterface("org.apache.dubbo.HelloService").
- SetMetadataType("local").
- SetLoadBalance("random").
- SetWarmUpTie("warmup").
- SetCluster("cluster").
- AddRCRegistry("nacos", registryConfig).
- AddRCProtocol("dubbo", protocolConfig).
- SetGroup("dubbo").
- SetVersion("1.0.0").
- SetProxyFactoryKey("default").
- SetSerialization("serialization").
- SetServiceID("HelloService").
- Build()
-
- serviceConfig.InitExported()
-
- serviceConfig.Methods = []*MethodConfig{
- {
- Name: "Say",
- Retries: "3",
- },
- }
-
- err := serviceConfig.Init(rc)
- require.NoError(t, err)
- err = serviceConfig.check()
- require.NoError(t, err)
-
- assert.Equal(t, serviceConfig.Prefix(), strings.Join([]string{constant.ServiceConfigPrefix, serviceConfig.id}, "."))
- assert.False(t, serviceConfig.IsExport())
- })
-
- t.Run("LoadRegistries&loadProtocol&getRandomPort", func(t *testing.T) {
- registries := LoadRegistries(serviceConfig.RegistryIDs, serviceConfig.RCRegistriesMap, common.PROVIDER)
- assert.Len(t, registries, 1)
- assert.Equal(t, "service-discovery-registry", registries[0].Protocol)
- assert.Equal(t, "8848", registries[0].Port)
- assert.Equal(t, "3", registries[0].GetParam("registry.role", "1"))
- assert.Equal(t, "nacos", registries[0].GetParam("registry", "zk"))
-
- protocols := loadProtocol(serviceConfig.ProtocolIDs, serviceConfig.RCProtocolsMap)
- assert.Len(t, protocols, 1)
- assert.Equal(t, "dubbo", protocols[0].Name)
- assert.Equal(t, "20000", protocols[0].Port)
-
- ports := getRandomPort(protocols)
- nextPort := ports.Front()
- assert.Nil(t, nextPort)
- })
- t.Run("getUrlMap", func(t *testing.T) {
- values := serviceConfig.getUrlMap()
- assert.Equal(t, "0", values.Get("methods.Say.weight"))
- assert.Empty(t, values.Get("methods.Say.tps.limit.rate"))
- assert.Equal(t, "echo,token,accesslog,tps,generic_service,execute,pshutdown", values.Get(constant.ServiceFilterKey))
- })
-
- t.Run("Implement", func(t *testing.T) {
- serviceConfig.Implement(&HelloService{})
- //urls := serviceConfig.GetExportedUrls()
- //err := serviceConfig.Export()
- assert.NotNil(t, serviceConfig.rpcService)
- })
-}
-
-func TestServiceConfigExportWarnsOnVariadicRPCMethods(t *testing.T) {
- prev := gostlogger.GetLogger()
- capture := &serviceConfigCaptureWarnLogger{Logger: prev}
- gostlogger.SetLogger(capture)
- t.Cleanup(func() {
- gostlogger.SetLogger(prev)
- })
-
- serviceConfig := newEmptyServiceConfig()
- serviceConfig.Interface = "com.example.VariadicHelloService"
- serviceConfig.NotRegister = true
- serviceConfig.rpcService = &VariadicHelloService{}
-
- err := serviceConfig.Export()
- require.NoError(t, err)
-
- warns := strings.Join(capture.warns, "\n")
- assert.Contains(t, warns, serviceConfig.Interface)
- assert.Contains(t, warns, "Fanout")
-}
-
-func TestServiceConfigExportDoesNotWarnOnNonVariadicRPCMethods(t *testing.T) {
- prev := gostlogger.GetLogger()
- capture := &serviceConfigCaptureWarnLogger{Logger: prev}
- gostlogger.SetLogger(capture)
- t.Cleanup(func() {
- gostlogger.SetLogger(prev)
- })
-
- serviceConfig := newEmptyServiceConfig()
- serviceConfig.Interface = "org.apache.dubbo.HelloService"
- serviceConfig.NotRegister = true
- serviceConfig.rpcService = &HelloService{}
-
- err := serviceConfig.Export()
- require.NoError(t, err)
-
- for _, warn := range capture.warns {
- assert.NotContains(t, warn, "variadic RPC method")
- }
-}
-
-func TestServiceConfigExportCarriesProviderAttributes(t *testing.T) {
- extension.SetProtocol(protocolwrapper.FILTER, protocolwrapper.NewMockProtocolFilter)
-
- const interfaceName = "org.apache.dubbo.ProviderAttributeService"
- serviceConfig := newEmptyServiceConfig()
- serviceConfig.id = "ProviderAttributeService"
- serviceConfig.Interface = interfaceName
- serviceConfig.NotRegister = true
- serviceConfig.ProtocolIDs = []string{"dubbo"}
- serviceConfig.rpcService = &HelloService{}
-
- rc := newEmptyRootConfig()
- rc.Protocols["dubbo"] = NewProtocolConfigBuilder().
- SetName("dubbo").
- SetPort("20000").
- Build()
-
- err := serviceConfig.Init(rc)
- require.NoError(t, err)
- err = serviceConfig.Export()
- require.NoError(t, err)
- t.Cleanup(serviceConfig.Unexport)
- t.Cleanup(func() {
- _ = common.ServiceMap.UnRegister(interfaceName, "dubbo", common.ServiceKey(interfaceName, "", ""))
- })
-
- urls := serviceConfig.GetExportedUrls()
- require.Len(t, urls, 1)
-
- providerRaw, ok := urls[0].GetAttribute(constant.ProviderConfigKey)
- require.True(t, ok)
- assert.Same(t, rc.Provider, providerRaw)
-
- rpcServiceRaw, ok := urls[0].GetAttribute(constant.RpcServiceKey)
- require.True(t, ok)
- assert.Same(t, serviceConfig.rpcService, rpcServiceRaw)
-}
diff --git a/config/service_discovery_config.go b/config/service_discovery_config.go
deleted file mode 100644
index d93aea57f..000000000
--- a/config/service_discovery_config.go
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * 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
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-// ServiceDiscoveryConfig will be used to create
-type ServiceDiscoveryConfig struct {
- // Protocol indicate which implementation will be used.
- // for example, if the Protocol is nacos, it means that we will use nacosServiceDiscovery
- Protocol string `yaml:"protocol" json:"protocol,omitempty" property:"protocol"`
- // Group, usually you don't need to config this field.
- // you can use this to do some isolation
- Group string `yaml:"group" json:"group,omitempty"`
- // RemoteRef is the reference point to RemoteConfig which will be used to create remotes instances.
- RemoteRef string `yaml:"remote_ref" json:"remote_ref,omitempty" property:"remote_ref"`
-}
-
-func (ServiceDiscoveryConfig) Prefix() string {
- return constant.ServiceDiscPrefix
-}
-
-func (ServiceDiscoveryConfig) Init() error {
- return nil
-}
-
-func NewServiceDiscoveryConfigBuilder() *ServiceDiscoveryConfigBuilder {
- return &ServiceDiscoveryConfigBuilder{
- serviceDiscoveryConfig: &ServiceDiscoveryConfig{},
- }
-}
-
-type ServiceDiscoveryConfigBuilder struct {
- serviceDiscoveryConfig *ServiceDiscoveryConfig
-}
-
-func (sdcb *ServiceDiscoveryConfigBuilder) SetProtocol(protocol string) *ServiceDiscoveryConfigBuilder {
- sdcb.serviceDiscoveryConfig.Protocol = protocol
- return sdcb
-}
-
-func (sdcb *ServiceDiscoveryConfigBuilder) SetGroup(group string) *ServiceDiscoveryConfigBuilder {
- sdcb.serviceDiscoveryConfig.Group = group
- return sdcb
-}
-
-func (sdcb *ServiceDiscoveryConfigBuilder) SetRemoteRef(remoteRef string) *ServiceDiscoveryConfigBuilder {
- sdcb.serviceDiscoveryConfig.RemoteRef = remoteRef
- return sdcb
-}
-
-func (sdcb *ServiceDiscoveryConfigBuilder) Build() *ServiceDiscoveryConfig {
- if err := sdcb.serviceDiscoveryConfig.Init(); err != nil {
- panic(err)
- }
- return sdcb.serviceDiscoveryConfig
-}
diff --git a/config/service_discovery_config_test.go b/config/service_discovery_config_test.go
deleted file mode 100644
index f94a71588..000000000
--- a/config/service_discovery_config_test.go
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * 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
-
-import (
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common/constant"
-)
-
-func TestNewServiceDiscoveryConfigBuilder(t *testing.T) {
-
- config := NewServiceDiscoveryConfigBuilder().
- SetProtocol("protocol").
- SetGroup("group").
- SetRemoteRef("remote").
- Build()
-
- err := config.Init()
- require.NoError(t, err)
- assert.Equal(t, "protocol", config.Protocol)
- assert.Equal(t, constant.ServiceDiscPrefix, config.Prefix())
-}
diff --git a/config/service_test.go b/config/service_test.go
deleted file mode 100644
index 179ffa2f6..000000000
--- a/config/service_test.go
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * 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
-
-import (
- "maps"
- "testing"
-)
-
-import (
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/require"
-)
-
-import (
- "dubbo.apache.org/dubbo-go/v3/common"
-)
-
-func cloneRPCServiceMap(src map[string]common.RPCService) map[string]common.RPCService {
- return maps.Clone(src)
-}
-
-func TestGetConsumerService(t *testing.T) {
-
- SetConsumerService(&HelloService{})
- SetProviderService(&HelloService{})
-
- service := GetConsumerService("HelloService")
- reference := service.(*HelloService).Reference()
-
- assert.Equal(t, "HelloService", reference)
-
- SetConsumerServiceByInterfaceName("org.apache.dubbo.HelloService", &HelloService{})
- service = GetConsumerServiceByInterfaceName("org.apache.dubbo.HelloService")
- reference = service.(*HelloService).Reference()
- assert.Equal(t, "HelloService", reference)
-
- callback := GetCallback(reference)
- assert.Nil(t, callback)
-}
-
-func TestGetProviderServiceMapReturnsCopy(t *testing.T) {
- proServicesLock.Lock()
- originalProServices := cloneRPCServiceMap(proServices)
- originalProServicesInfo := maps.Clone(proServicesInfo)
- proServices = map[string]common.RPCService{}
- proServicesInfo = map[string]any{}
- proServicesLock.Unlock()
-
- defer func() {
- proServicesLock.Lock()
- proServices = originalProServices
- proServicesInfo = originalProServicesInfo
- proServicesLock.Unlock()
- }()
-
- svc := &HelloService{}
- SetProviderService(svc)
-
- got := GetProviderServiceMap()
- require.Len(t, got, 1)
-
- got["Injected"] = &HelloService{}
- got["HelloService"] = &HelloService{}
-
- proServicesLock.Lock()
- _, hasInjected := proServices["Injected"]
- _, hasHelloService := proServices["HelloService"]
- proServicesLock.Unlock()
-
- assert.False(t, hasInjected)
- assert.True(t, hasHelloService)
-}
-
-func TestGetConsumerServiceMapReturnsCopy(t *testing.T) {
- conServicesLock.Lock()
- originalConServices := cloneRPCServiceMap(conServices)
- conServices = map[string]common.RPCService{}
- conServicesLock.Unlock()
-
- defer func() {
- conServicesLock.Lock()
- conServices = originalConServices
- conServicesLock.Unlock()
- }()
-
- svc := &HelloService{}
- SetConsumerService(svc)
-
- got := GetConsumerServiceMap()
- require.Len(t, got, 1)
-
- got["Injected"] = &HelloService{}
- got["HelloService"] = &HelloService{}
-
- conServicesLock.Lock()
- _, hasInjected := conServices["Injected"]
- stored := conServices["HelloService"]
- conServicesLock.Unlock()
-
- assert.False(t, hasInjected)
- assert.Equal(t, svc, stored)
-}
diff --git a/config/ssl_config.go b/config/ssl_config.go
deleted file mode 100644
index 8551b4cf5..000000000
--- a/config/ssl_config.go
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * 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
-
-import (
- "github.com/apache/dubbo-getty"
-)
-
-var (
- // Deprecated: use TLSConfig instead.
- serverTlsConfigBuilder getty.TlsConfigBuilder
- // Deprecated: use TLSConfig instead.
- clientTlsConfigBuilder getty.TlsConfigBuilder
-)
-
-// Deprecated: use TLSConfig instead.
-func GetServerTlsConfigBuilder() getty.TlsConfigBuilder {
- return serverTlsConfigBuilder
-}
-
-// Deprecated: use TLSConfig instead.
-func GetClientTlsConfigBuilder() getty.TlsConfigBuilder {
- return clientTlsConfigBuilder
-}
-
-// Deprecated: use TLSConfig instead.
-func SetServerTlsConfigBuilder(configBuilder getty.TlsConfigBuilder) {
- serverTlsConfigBuilder = configBuilder
-}
-
-// Deprecated: use TLSConfig instead.
-func SetClientTlsConfigBuilder(configBuilder getty.TlsConfigBuilder) {
- clientTlsConfigBuilder = configBuilder
-}
diff --git a/config/ssl_config_test.go b/config/ssl_config_test.go
deleted file mode 100644
index 75a37be7e..000000000
--- a/config/ssl_config_test.go
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * 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
-
-import (
- "reflect"
- "testing"
-)
-
-import (
- getty "github.com/apache/dubbo-getty"
-
- "github.com/stretchr/testify/assert"
-)
-
-func TestServerTlsConfigBuilder(t *testing.T) {
-
- SetServerTlsConfigBuilder(&getty.ServerTlsConfigBuilder{})
- SetClientTlsConfigBuilder(&getty.ClientTlsConfigBuilder{})
-
- serverTlsConfig := GetServerTlsConfigBuilder()
- clientTlsConfig := GetClientTlsConfigBuilder()
-
- vf := reflect.ValueOf(serverTlsConfig)
- name := reflect.Indirect(vf).Type().Name()
-
- assert.Equal(t, "ServerTlsConfigBuilder", name)
-
- vf = reflect.ValueOf(clientTlsConfig)
- name = reflect.Indirect(vf).Type().Name()
- assert.Equal(t, "ClientTlsConfigBuilder", name)
-}
diff --git a/config/testdata/application.yaml b/config/testdata/application.yaml
deleted file mode 100644
index b1a90870c..000000000
--- a/config/testdata/application.yaml
+++ /dev/null
@@ -1,50 +0,0 @@
-# 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.
-
-dubbo:
- application:
- name: dubbo-go
- module: local
- version: 1.0.0
- owner: zhaoyunxing
- config-center:
- address: nacos://127.0.0.1:8848
- cluster: dev
- namespace: dubbo
- log-dir: ./logs
- protocols:
- dubbo:
- name: dubbo
- ip: 127.0.0.1
- port: 20000
- registries:
- nacos:
- timeout: 5s
- group: dev
- address: nacos://127.0.0.1:8848
- zk:
- protocol: zookeeper
- group: dev
- address: 127.0.0.1:2181
- services:
- helloService:
- interface: org.dubbo.service.HelloService
- registry-ids: nacos,zk
- orderService:
- interface: org.dubbo.service.OrderService
- registry-ids: nacos
- provider:
- register: true
- services:
\ No newline at end of file
diff --git a/config/testdata/config/active/application-local.yaml b/config/testdata/config/active/application-local.yaml
deleted file mode 100644
index a56662cd7..000000000
--- a/config/testdata/config/active/application-local.yaml
+++ /dev/null
@@ -1,31 +0,0 @@
-# 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.
-
-dubbo:
- profiles:
- active: local
- registries:
- nacos:
- timeout: 10s
- address: nacos://127.0.0.1:8848
- protocols:
- dubbo:
- name: dubbo
- port: 20000
- consumer:
- references:
- helloService:
- protocol: dubbo
- interface: org.github.dubbo.HelloService
\ No newline at end of file
diff --git a/config/testdata/config/active/application.yaml b/config/testdata/config/active/application.yaml
deleted file mode 100644
index 0555b5c94..000000000
--- a/config/testdata/config/active/application.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-# 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.
-
-dubbo:
- profiles:
- active: local
- registries:
- nacos:
- timeout: 3s
- address: nacos://127.0.0.1:8848
\ No newline at end of file
diff --git a/config/testdata/config/app/application.yaml b/config/testdata/config/app/application.yaml
deleted file mode 100644
index 21deb3eee..000000000
--- a/config/testdata/config/app/application.yaml
+++ /dev/null
@@ -1,36 +0,0 @@
-# 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.
-
-dubbo:
- registries:
- nacos:
- timeout: 3s
- address: nacos://127.0.0.1:8848
- protocols:
- dubbo:
- name: dubbo
- port: 20000
- consumer:
- references:
- helloService:
- protocol: dubbo
- interface: org.github.dubbo.HelloService # must be compatible with grpc or dubbo-java
- provider:
- register: true
- registry-ids: nacos
- services:
- helloService:
- protocol: dubbo
- interface: org.github.dubbo.HelloService # must be compatible with grpc or dubbo-java
\ No newline at end of file
diff --git a/config/testdata/config/application/application.yaml b/config/testdata/config/application/application.yaml
deleted file mode 100644
index 773e87cc6..000000000
--- a/config/testdata/config/application/application.yaml
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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.
-
-dubbo:
- registries:
- nacos:
- address: nacos://127.0.0.1:8848
\ No newline at end of file
diff --git a/config/testdata/config/center/conf-application.yaml b/config/testdata/config/center/conf-application.yaml
deleted file mode 100644
index f41cf1b50..000000000
--- a/config/testdata/config/center/conf-application.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-# 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.
-
-dubbo:
- registries:
- nacos:
- timeout: 5s
- group: dev
- address: nacos://127.0.0.1:8848
- config-center:
- address: nacos://127.0.0.1:8848
- cluster: dev
- namespace: dubbo
- log-dir: ./logs
- config-file: dubbo.yaml
- app-id: dubbo
\ No newline at end of file
diff --git a/config/testdata/config/custom/custom.yaml b/config/testdata/config/custom/custom.yaml
deleted file mode 100644
index d6da15f4e..000000000
--- a/config/testdata/config/custom/custom.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-# 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.
-
-dubbo:
- registries:
- nacos:
- timeout: 5s
- group: dev
- address: nacos://127.0.0.1:8848
- zk:
- protocol: zookeeper
- group: test
- address: 127.0.0.1:2181
- custom:
- config-map:
- test-config: true
diff --git a/config/testdata/config/custom/empty.yaml b/config/testdata/config/custom/empty.yaml
deleted file mode 100644
index 8fc58887b..000000000
--- a/config/testdata/config/custom/empty.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
-# 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.
-
-dubbo:
- custom:
- registries:
- nacos:
- timeout: 5s
- group: dev
- address: nacos://127.0.0.1:8848
- zk:
- protocol: zookeeper
- group: test
- address: 127.0.0.1:2181
diff --git a/config/testdata/config/logger/empty_log.yaml b/config/testdata/config/logger/empty_log.yaml
deleted file mode 100644
index befa55dda..000000000
--- a/config/testdata/config/logger/empty_log.yaml
+++ /dev/null
@@ -1,26 +0,0 @@
-# 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.
-
-dubbo:
- logger:
- registries:
- nacos:
- timeout: 5s
- group: dev
- address: nacos://127.0.0.1:8848
- zk:
- protocol: zookeeper
- group: test
- address: 127.0.0.1:2181
\ No newline at end of file
diff --git a/config/testdata/config/logger/file_log.yaml b/config/testdata/config/logger/file_log.yaml
deleted file mode 100644
index 0bcfd2e5d..000000000
--- a/config/testdata/config/logger/file_log.yaml
+++ /dev/null
@@ -1,37 +0,0 @@
-# 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.
-
-dubbo:
- registries:
- nacos:
- timeout: 5s
- group: dev
- address: nacos://127.0.0.1:8848
- zk:
- protocol: zookeeper
- group: test
- address: 127.0.0.1:2181
- logger:
- logger:
- level: debug
- driver: logrus
- format: text
- appender: console,file
- file:
- name: pandora.log
- max-size: 1
- max-backups: 2
- max-age: 3
- compress: true
diff --git a/config/testdata/config/logger/log.yaml b/config/testdata/config/logger/log.yaml
deleted file mode 100644
index 5e9c0bef8..000000000
--- a/config/testdata/config/logger/log.yaml
+++ /dev/null
@@ -1,51 +0,0 @@
-# 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.
-
-dubbo:
- registries:
- nacos:
- timeout: 5s
- group: dev
- address: nacos://127.0.0.1:8848
- zk:
- protocol: zookeeper
- group: test
- address: 127.0.0.1:2181
- logger:
- zap-config:
- level: debug
- development: false
- disable-caller: false
- disable-stacktrace: false
- sampling:
- encoding: console
- # encoder
- encoder-config:
- message-key: message
- level-key: level
- time-key: time
- name-key: logger
- caller-key: caller
- stacktrace-key: stacktrace
- level-encoder: capitalColor
- time-encoder: iso8601
- duration-encoder: seconds
- caller-encoder: short
- name-encoder:
- output-paths:
- - stderr
- error-output-paths:
- - stderr
- initial-fields:
diff --git a/config/testdata/config/properties/application.properties b/config/testdata/config/properties/application.properties
deleted file mode 100644
index 273dbddcf..000000000
--- a/config/testdata/config/properties/application.properties
+++ /dev/null
@@ -1,13 +0,0 @@
-dubbo.application.name=dubbo-go
-dubbo.application.module=local
-dubbo.application.version=1.0.0
-dubbo.application.owner=zhaoyunxing
-dubbo.registries.nacos.protocol=nacos
-dubbo.registries.nacos.timeout=5s
-dubbo.registries.nacos.address=127.0.0.1:8848
-dubbo.registries.zk.protocol=zookeeper
-dubbo.registries.zk.timeout=5s
-dubbo.registries.zk.group=dev
-dubbo.registries.zk.address=127.0.0.1:2181
-dubbo.services.HelloService.interface=org.dubbo.service.HelloService
-dubbo.services.HelloService.registry=nacos,zk
\ No newline at end of file
diff --git a/config/testdata/config/protocol/application.yaml b/config/testdata/config/protocol/application.yaml
deleted file mode 100644
index 9dbd0b00e..000000000
--- a/config/testdata/config/protocol/application.yaml
+++ /dev/null
@@ -1,27 +0,0 @@
-# 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.
-
-dubbo:
- registries:
- nacos:
- timeout: 5s
- group: dev
- address: nacos://127.0.0.1:8848
- protocols:
- dubbo:
- name: dubbo
- port: 20000
- max-server-send-msg-size: 4mib
- max-server-recv-msg-size: 4mib
\ No newline at end of file
diff --git a/config/testdata/config/protocol/empty_application.yaml b/config/testdata/config/protocol/empty_application.yaml
deleted file mode 100644
index f01c21abe..000000000
--- a/config/testdata/config/protocol/empty_application.yaml
+++ /dev/null
@@ -1,22 +0,0 @@
-# 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.
-
-dubbo:
- registries:
- nacos:
- timeout: 5s
- group: dev
- address: nacos://127.0.0.1:8848
- protocols:
\ No newline at end of file
diff --git a/config/testdata/config/provider/application.yaml b/config/testdata/config/provider/application.yaml
deleted file mode 100644
index 4665c3ddf..000000000
--- a/config/testdata/config/provider/application.yaml
+++ /dev/null
@@ -1,32 +0,0 @@
-# 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.
-
-dubbo:
- registries:
- nacos:
- timeout: 5s
- group: dev
- address: nacos://127.0.0.1:8848
- provider:
- register: true
- registry-ids:
- - nacos
- - zk
- services:
- helloService:
- interface: org.dubbo.service.HelloService
- registry-ids: nacos,zk
- orderService:
- interface: org.dubbo.service.OrderService
\ No newline at end of file
diff --git a/config/testdata/config/provider/empty_registry_application.yaml b/config/testdata/config/provider/empty_registry_application.yaml
deleted file mode 100644
index 4412102cb..000000000
--- a/config/testdata/config/provider/empty_registry_application.yaml
+++ /dev/null
@@ -1,23 +0,0 @@
-# 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.
-
-dubbo:
- registries:
- nacos:
- timeout: 5s
- group: dev
- address: nacos://127.0.0.1:8848
- provider:
- register: true
\ No newline at end of file
diff --git a/config/testdata/config/provider/registry_application.yaml b/config/testdata/config/provider/registry_application.yaml
deleted file mode 100644
index a1604e94d..000000000
--- a/config/testdata/config/provider/registry_application.yaml
+++ /dev/null
@@ -1,28 +0,0 @@
-# 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.
-
-dubbo:
- registries:
- nacos:
- timeout: 3s
- address: nacos://127.0.0.1:8848
- provider:
- registry-ids: nacos
- services:
- HelloService:
- interface: org.dubbo.service.HelloService
- registry-ids: nacos,zk
- OrderService:
- interface: org.dubbo.service.OrderService
\ No newline at end of file
diff --git a/config/testdata/config/registry/application.yaml b/config/testdata/config/registry/application.yaml
deleted file mode 100644
index 59d23e1fd..000000000
--- a/config/testdata/config/registry/application.yaml
+++ /dev/null
@@ -1,25 +0,0 @@
-# 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.
-
-dubbo:
- registries:
- nacos:
- timeout: 5s
- group: dev
- address: nacos://127.0.0.1:8848
- zk:
- protocol: zookeeper
- group: test
- address: 127.0.0.1:2181
\ No newline at end of file
diff --git a/config/testdata/config/registry/empty_application.yaml b/config/testdata/config/registry/empty_application.yaml
deleted file mode 100644
index 6e86eced5..000000000
--- a/config/testdata/config/registry/empty_application.yaml
+++ /dev/null
@@ -1,17 +0,0 @@
-# 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.
-
-dubbo:
- registries:
\ No newline at end of file
diff --git a/config/testdata/config/resolver/application.yaml b/config/testdata/config/resolver/application.yaml
deleted file mode 100644
index 511370b8d..000000000
--- a/config/testdata/config/resolver/application.yaml
+++ /dev/null
@@ -1,51 +0,0 @@
-# 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.
-
-localhost: 127.0.0.1
-dubbo:
- application:
- name: dubbo-go
- module: local
- version: 1.0.0
- owner: zhaoyunxing
- config-center:
- address: nacos://127.0.0.1:8848
- cluster: dev
- namespace: dubbo
- log-dir: ./logs
- protocols:
- dubbo:
... 1288 lines suppressed ...