in server/options.go [488:578]
func (svcOpts *ServiceOptions) init(srv *Server, opts ...ServiceOption) error {
for _, opt := range opts {
opt(svcOpts)
}
if err := defaults.Set(svcOpts); err != nil {
return err
}
svcOpts.srvOpts = srv.cfg
svc := svcOpts.Service
dubboutil.CopyFields(reflect.ValueOf(srv.cfg.Provider).Elem(), reflect.ValueOf(svc).Elem())
svcOpts.exported = atomic.NewBool(false)
application := svcOpts.Application
if application != nil {
svcOpts.applicationCompat = compatApplicationConfig(application)
if err := svcOpts.applicationCompat.Init(); err != nil {
return err
}
// todo(DMwangnima): make this clearer
// this statement is responsible for setting rootConfig.Application
// since many modules would retrieve this information directly.
config.GetRootConfig().Application = svcOpts.applicationCompat
svcOpts.metadataType = svcOpts.applicationCompat.MetadataType
if svc.Group == "" {
svc.Group = svcOpts.applicationCompat.Group
}
if svc.Version == "" {
svc.Version = svcOpts.applicationCompat.Version
}
}
svcOpts.unexported = atomic.NewBool(false)
// initialize Registries
if len(svc.RCRegistriesMap) == 0 {
svc.RCRegistriesMap = svcOpts.Registries
}
if len(svc.RCRegistriesMap) > 0 {
svcOpts.registriesCompat = make(map[string]*config.RegistryConfig)
for key, reg := range svc.RCRegistriesMap {
svcOpts.registriesCompat[key] = compatRegistryConfig(reg)
if err := svcOpts.registriesCompat[key].Init(); err != nil {
return err
}
}
}
// initialize Protocols
if len(svc.RCProtocolsMap) == 0 {
svc.RCProtocolsMap = svcOpts.Protocols
}
if len(svc.RCProtocolsMap) > 0 {
svcOpts.protocolsCompat = make(map[string]*config.ProtocolConfig)
for key, pro := range svc.RCProtocolsMap {
svcOpts.protocolsCompat[key] = compatProtocolConfig(pro)
if err := svcOpts.protocolsCompat[key].Init(); err != nil {
return err
}
}
}
svc.RegistryIDs = commonCfg.TranslateIds(svc.RegistryIDs)
if len(svc.RegistryIDs) <= 0 {
svc.RegistryIDs = svcOpts.Provider.RegistryIDs
}
if svc.RegistryIDs == nil || len(svc.RegistryIDs) <= 0 {
svc.NotRegister = true
}
svc.ProtocolIDs = commonCfg.TranslateIds(svc.ProtocolIDs)
if len(svc.ProtocolIDs) <= 0 {
svc.ProtocolIDs = svcOpts.Provider.ProtocolIDs
}
if len(svc.ProtocolIDs) <= 0 {
for name := range svcOpts.Protocols {
svc.ProtocolIDs = append(svc.ProtocolIDs, name)
}
}
if svc.TracingKey == "" {
svc.TracingKey = svcOpts.Provider.TracingKey
}
err := svcOpts.check()
if err != nil {
panic(err)
}
svcOpts.needExport = true
return commonCfg.Verify(svcOpts)
}