Skip to content

Commit

Permalink
Merge pull request #1099 from qq5272689/3.0
Browse files Browse the repository at this point in the history
Imp: load the configure file in another way
  • Loading branch information
AlexStocks authored Apr 5, 2021
2 parents e53721e + 5c0f7ba commit abbd985
Show file tree
Hide file tree
Showing 3 changed files with 172 additions and 42 deletions.
14 changes: 14 additions & 0 deletions config/base_config.go
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import (
import (
"github.com/apache/dubbo-go/common/config"
"github.com/apache/dubbo-go/common/logger"
"github.com/apache/dubbo-go/common/yaml"
)

// BaseConfig is the common configuration for provider and consumer
Expand All @@ -55,6 +56,19 @@ type BaseConfig struct {
CacheFile string `yaml:"cache_file" json:"cache_file,omitempty" property:"cache_file"`
}

func BaseInit(confBaseFile string) error {
if confBaseFile == "" {
return perrors.Errorf("application configure(base) file name is nil")
}
baseConfig = &BaseConfig{}
fileStream, err := yaml.UnmarshalYMLConfig(confBaseFile, baseConfig)
if err != nil {
return perrors.Errorf("unmarshalYmlConfig error %v", perrors.WithStack(err))
}
baseConfig.fileStream = bytes.NewBuffer(fileStream)
return nil
}

// nolint
func (c *BaseConfig) GetServiceDiscoveries(name string) (config *ServiceDiscoveryConfig, ok bool) {
config, ok = c.ServiceDiscoveries[name]
Expand Down
58 changes: 16 additions & 42 deletions config/config_loader.go
Original file line number Diff line number Diff line change
Expand Up @@ -54,15 +54,16 @@ var (
// it should be used combine with double-check to avoid the race condition
configAccessMutex sync.Mutex

maxWait = 3
confRouterFile string
maxWait = 3
confRouterFile string
confBaseFile string
uniformVirturlServiceConfigPath string
uniformDestRuleConfigPath string
)

// loaded consumer & provider config from xxx.yml, and log config from xxx.xml
// Namely: dubbo.consumer.xml & dubbo.provider.xml in java dubbo
func init() {
func DefaultInit() []LoaderInitOption {
var (
confConFile string
confProFile string
Expand All @@ -89,30 +90,7 @@ func init() {
if confRouterFile == "" {
confRouterFile = constant.DEFAULT_ROUTER_CONF_FILE_PATH
}

if errCon := ConsumerInit(confConFile); errCon != nil {
log.Printf("[consumerInit] %#v", errCon)
consumerConfig = nil
} else {
// Check if there are some important key fields missing,
// if so, we set a default value for it
setDefaultValue(consumerConfig)
// Even though baseConfig has been initialized, we override it
// because we think read from config file is correct config
baseConfig = &consumerConfig.BaseConfig
}

if errPro := ProviderInit(confProFile); errPro != nil {
log.Printf("[providerInit] %#v", errPro)
providerConfig = nil
} else {
// Check if there are some important key fields missing,
// if so, we set a default value for it
setDefaultValue(providerConfig)
// Even though baseConfig has been initialized, we override it
// because we think read from config file is correct config
baseConfig = &providerConfig.BaseConfig
}
return []LoaderInitOption{RouterInitOption(confRouterFile), BaseInitOption(""), ConsumerInitOption(confConFile), ProviderInitOption(confProFile)}
}

// setDefaultValue set default value for providerConfig or consumerConfig if it is null
Expand Down Expand Up @@ -391,23 +369,19 @@ func initRouter() {

// Load Dubbo Init
func Load() {
// init router
initRouter()

// init the global event dispatcher
extension.SetAndInitGlobalDispatcher(GetBaseConfig().EventDispatcherType)
options := DefaultInit()
LoadWithOptions(options...)
}

// start the metadata report if config set
if err := startMetadataReport(GetApplicationConfig().MetadataType, GetBaseConfig().MetadataReportConfig); err != nil {
logger.Errorf("Provider starts metadata report error, and the error is {%#v}", err)
return
func LoadWithOptions(options ...LoaderInitOption) {
for _, option := range options {
option.init()
}

// reference config
loadConsumerConfig()

// service config
loadProviderConfig()
for _, option := range options {
option.apply()
}
// init router
initRouter()

// init the shutdown callback
GracefulShutdownInit()
Expand Down
142 changes: 142 additions & 0 deletions config/config_loader_options.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,142 @@
/*
* 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-go/common/extension"
"github.com/apache/dubbo-go/common/logger"
"log"
)

type LoaderInitOption interface {
init()
apply()
}

type optionFunc struct {
initFunc func()
applyFunc func()
}

func (f *optionFunc) init() {
f.initFunc()
}

func (f *optionFunc) apply() {
f.applyFunc()
}

func ConsumerInitOption(confConFile string) LoaderInitOption {
return consumerInitOption(confConFile, false)
}

func ConsumerMustInitOption(confConFile string) LoaderInitOption {
return consumerInitOption(confConFile, true)
}

func consumerInitOption(confConFile string, must bool) LoaderInitOption {
return &optionFunc{
func() {
if consumerConfig != nil && !must {
return
}
if errCon := ConsumerInit(confConFile); errCon != nil {
log.Printf("[consumerInit] %#v", errCon)
consumerConfig = nil
} else if confBaseFile == "" {
// Check if there are some important key fields missing,
// if so, we set a default value for it
setDefaultValue(consumerConfig)
// Even though baseConfig has been initialized, we override it
// because we think read from config file is correct config
baseConfig = &consumerConfig.BaseConfig
}
},
func() {
loadConsumerConfig()
},
}
}

func ProviderInitOption(confProFile string) LoaderInitOption {
return providerInitOption(confProFile, false)
}

func ProviderMustInitOption(confProFile string) LoaderInitOption {
return providerInitOption(confProFile, true)
}

func providerInitOption(confProFile string, must bool) LoaderInitOption {
return &optionFunc{
func() {
if providerConfig != nil && !must {
return
}
if errPro := ProviderInit(confProFile); errPro != nil {
log.Printf("[providerInit] %#v", errPro)
providerConfig = nil
} else if confBaseFile == "" {
// Check if there are some important key fields missing,
// if so, we set a default value for it
setDefaultValue(providerConfig)
// Even though baseConfig has been initialized, we override it
// because we think read from config file is correct config
baseConfig = &providerConfig.BaseConfig
}
},
func() {
loadProviderConfig()
},
}
}

func RouterInitOption(crf string) LoaderInitOption {
return &optionFunc{
func() {
confRouterFile = crf
},
func() {
initRouter()
},
}
}

func BaseInitOption(cbf string) LoaderInitOption {
return &optionFunc{
func() {
if cbf == "" {
return
}
confBaseFile = cbf
if err := BaseInit(cbf); err != nil {
log.Printf("[BaseInit] %#v", err)
baseConfig = nil
}
},
func() {
// init the global event dispatcher
extension.SetAndInitGlobalDispatcher(GetBaseConfig().EventDispatcherType)

// start the metadata report if config set
if err := startMetadataReport(GetApplicationConfig().MetadataType, GetBaseConfig().MetadataReportConfig); err != nil {
logger.Errorf("Provider starts metadata report error, and the error is {%#v}", err)
return
}
},
}
}

0 comments on commit abbd985

Please sign in to comment.