in config/consumer_config.go [123:188]
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(rootConfig); 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
}
}
}