聊聊dubbo-go的DubboProtocol
时间:2022-07-22
本文章向大家介绍聊聊dubbo-go的DubboProtocol,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
序
本文主要研究一下dubbo-go的DubboProtocol
DubboProtocol
dubbo-go-v1.4.2/protocol/dubbo/dubbo_protocol.go
// dubbo protocol constant
const (
// 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
- 漏洞追踪:如何检查并修复GHOST(幽灵)漏洞
- 锁的实现原理解锁的实现加锁的实现
- 幽灵漏洞(GHOST)影响大量Linux操作系统及其发行版(更新修复方案)
- openfire中mysql的前期设置
- android中最先被执行的activity
- Spring Boot微服务架构入门
- 测序文章数据上传找哪里
- Volatile实现原理实现原子性happens-before关系从happends-before规则分析可见性编译器层面实现可见性处理器层面实现可见性
- java中的toString方法
- 简单可视化-送你一双发现美的眼睛
- 享元模式
- 揭秘:针对中国移动用户的强大网银木马剖析
- 从源代码到Runtime发生的重排序编译器重排序指令重排序内存系统重排序阻止重排序
- 内存屏障保证缓存一致性优化
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Fiddler Everywhere工具答疑
- Groovy重载操作符(终极版)
- HTTP异步连接池和多线程实践
- 测试仓库推介(上)
- 测试仓库推介(下)
- 如何进行数据标注(1)
- 百度黄埔学院:交通枢纽高密人流下的防疫筛查解决方案技术理解(1)
- 百度黄埔学院:交通枢纽高密人流下的防疫筛查解决方案技术理解(2)
- 百度黄埔学院:十行代码高效完成深度学习POC
- 【数据相关】目标检测中的数据标注及格式转换代码
- 科学与艺术的融合:遗传算法绘制蒙娜丽莎
- “工业听诊”中多声源事件检测与定位
- 工业党福利:使用PaddleX高效实现指针型表计读取系列文章(2)
- 【三维点云系列】PCL点云库之数据文件与IO操作
- Jvm故障处理工具