code: func EnableConfigCenterSource(ci ConfigCenterInfo, cc config.Client) error {
  	if ci == (ConfigCenterInfo{}) {
  		return errors.New("ConfigCenterInfo can not be empty")
  	}
  	if configServerRunning {
  		openlogging.Debug("can not init config server again, call Clean first")
  		return nil
  	}
  
  	var err error
  	if cc == nil {
  		opts := config.Options{
  			DimensionInfo: ci.DefaultDimensionInfo,
  			ServerURI:     ci.URL,
  			TenantName:    ci.TenantName,
  			EnableSSL:     ci.EnableSSL,
  			TLSConfig:     ci.TLSConfig,
  			RefreshPort:   ci.RefreshPort,
  			AutoDiscovery: ci.AutoDiscovery,
  			Env:           ci.Environment,
  		}
  		cc, err = config.NewClient(ci.ClientType, opts)
  		if err != nil {
  			return err
  		}
  	}
  	configCenterSource := configcenter.NewConfigCenterSource(cc,
  		ci.DefaultDimensionInfo, ci.RefreshMode,
  		ci.RefreshInterval)
  	err = factory.AddSource(configCenterSource)
  	if err != nil {
  		return err
  	}
  
  	eventHandler := EventListener{
  		Name:    "EventHandler",
  		Factory: factory,
  	}
  
  	factory.RegisterListener(eventHandler, "a*")
  	configServerRunning = true
  	return nil
  }
docs: //EnableConfigCenterSource create a config center source singleton
  //A config center source pull remote config server key values into local memory
  //so that you can use GetXXX to get value easily