序
本文次要钻研一下dubbo-go的DubboProtocol
DubboProtocol
dubbo-go-v1.4.2/protocol/dubbo/dubbo_protocol.go
// dubbo protocol constantconst ( // DUBBO ... DUBBO = "dubbo")func init() { extension.SetProtocol(DUBBO, GetProtocol)}var ( dubboProtocol *DubboProtocol)// DubboProtocol ...type DubboProtocol struct { protocol.BaseProtocol serverMap map[string]*Server serverLock sync.Mutex}
- DubboProtocol嵌套了protocol.BaseProtocol,定义了serverMap、serverLock属性
GetProtocol
dubbo-go-v1.4.2/protocol/dubbo/dubbo_protocol.go
// GetProtocol ...func GetProtocol() protocol.Protocol { if dubboProtocol == nil { dubboProtocol = NewDubboProtocol() } return dubboProtocol}
- GetProtocol办法通过NewDubboProtocol创立dubboProtocol
NewDubboProtocol
dubbo-go-v1.4.2/protocol/dubbo/dubbo_protocol.go
// NewDubboProtocol ...func NewDubboProtocol() *DubboProtocol { return &DubboProtocol{ BaseProtocol: protocol.NewBaseProtocol(), serverMap: make(map[string]*Server), }}
- NewDubboProtocol办法实例化了DubboProtocol
Export
dubbo-go-v1.4.2/protocol/dubbo/dubbo_protocol.go
// Export ...func (dp *DubboProtocol) Export(invoker protocol.Invoker) protocol.Exporter { url := invoker.GetUrl() serviceKey := url.ServiceKey() exporter := NewDubboExporter(serviceKey, invoker, dp.ExporterMap()) dp.SetExporterMap(serviceKey, exporter) logger.Infof("Export service: %s", url.String()) // start server dp.openServer(url) return exporter}
- Export办法通过NewDubboExporter创立exporter,而后更新到DubboProtocol的exporterMap中,之后执行DubboProtocol的openServer
openServer
dubbo-go-v1.4.2/protocol/dubbo/dubbo_protocol.go
func (dp *DubboProtocol) openServer(url common.URL) { _, ok := dp.serverMap[url.Location] if !ok { _, ok := dp.ExporterMap().Load(url.ServiceKey()) if !ok { panic("[DubboProtocol]" + url.Key() + "is not existing") } dp.serverLock.Lock() _, ok = dp.serverMap[url.Location] if !ok { srv := NewServer() dp.serverMap[url.Location] = srv srv.Start(url) } dp.serverLock.Unlock() }}
- openServer办法先依据url.Location从serverMap获取Server,获取不到则执行dp.ExporterMap().Load(url.ServiceKey()),之后再次应用dp.serverMap[url.Location]获取,获取不到则执行NewServer,放到dp.serverMap中,而后执行srv.Start(url)
Refer
dubbo-go-v1.4.2/protocol/dubbo/dubbo_protocol.go
// Refer ...func (dp *DubboProtocol) Refer(url common.URL) protocol.Invoker { //default requestTimeout var requestTimeout = config.GetConsumerConfig().RequestTimeout requestTimeoutStr := url.GetParam(constant.TIMEOUT_KEY, config.GetConsumerConfig().Request_Timeout) if t, err := time.ParseDuration(requestTimeoutStr); err == nil { requestTimeout = t } invoker := NewDubboInvoker(url, NewClient(Options{ ConnectTimeout: config.GetConsumerConfig().ConnectTimeout, RequestTimeout: requestTimeout, })) dp.SetInvokers(invoker) logger.Infof("Refer service: %s", url.String()) return invoker}
- Refer办法先获取requestTimeout,之后通过NewDubboInvoker创立invoker,而后执行dp.SetInvokers(invoker)
Destroy
dubbo-go-v1.4.2/protocol/dubbo/dubbo_protocol.go
// Destroy ...func (dp *DubboProtocol) Destroy() { logger.Infof("DubboProtocol destroy.") dp.BaseProtocol.Destroy() // stop server for key, server := range dp.serverMap { delete(dp.serverMap, key) server.Stop() }}
- Destroy办法先执行dp.BaseProtocol.Destroy(),之后遍历dp.serverMap,执行delete(dp.serverMap, key)及server.Stop()
小结
DubboProtocol嵌套了protocol.BaseProtocol,定义了serverMap、serverLock属性;Export办法通过NewDubboExporter创立exporter,而后更新到DubboProtocol的exporterMap中,之后执行DubboProtocol的openServer;Refer办法先获取requestTimeout,之后通过NewDubboInvoker创立invoker,而后执行dp.SetInvokers(invoker);Destroy办法先执行dp.BaseProtocol.Destroy(),之后遍历dp.serverMap,执行delete(dp.serverMap, key)及server.Stop()
doc
- dubbo_protocol