AOP 和扩展性机制

AOP 和可扩展性机制

1. 扩展模块和 init 方法

1.1 接口和实现

golang 中的一个接口通常伴随着多个实现类,dubbo-go 为接口实现类提供了一种可插拔和可扩展的机制。减少模块之间的耦合,使开发者更容易引入和定制组件。

1.2 golang 中的 init 方法

init 方法是 golang 中的一个特殊方法。用户引入一组模块后,程序启动执行加载逻辑时,会先执行这些模块中的 init 方法。该方法是 dubbogo 注册扩展组件的重要方式。

1.3 扩展模块

在框架源码中,有一个特殊的模块:common/extension,负责缓存所有可扩展组件的实现。

以负载均衡模块为例:common/extension/loadbalance.go

package extension

import (
"dubbo.apache.org/dubbo-go/v3/cluster/loadbalance"
)

var loadbalances = make(map[string]func() loadbalance. LoadBalance)

// SetLoadbalance sets the loadbalance extension with @name
// For example: random/round_robin/consistent_hash/least_active/...
func SetLoadbalance(name string, fcn func() loadbalance. LoadBalance) {
loadbalances[name] = fcn
}

// GetLoadbalance finds the loadbalance extension with @name
func GetLoadbalance(name string) loadbalance. LoadBalance {
if loadbalances[name] == nil {
panic("loadbalance for " + name + " is not existing, make sure you have import the package.")
}

return loadbalances[name]()
}

该模块包含 Get 方法和 Set 方法。Get 返回实例化的 LoadBalance 接口,Set 方法用于注册工厂函数,map 用于缓存工厂函数。

当用户导入 _ “dubbo.apache.org/dubbo-go/v3/cluster/loadbalance/random” 时,会加载对应模块的 init 函数,并调用 Set 方法注册唯一 key 和工厂函数,并将其添加到上述 map 中。

cluster/loadbalance/random/loadbalance.go

package random

import (
"math/rand"
)

import (
"dubbo.apache.org/dubbo-go/v3/cluster/loadbalance"
"dubbo.apache.org/dubbo-go/v3/common/constant"
"dubbo.apache.org/dubbo-go/v3/common/extension"
"dubbo.apache.org/dubbo-go/v3/protocol"
)

func init() {
extension.SetLoadbalance(constant.LoadBalanceKeyRandom, NewRandomLoadBalance)
}

到目前为止,当所有 init 方法执行完毕后,就可以通过扩展模块的 Get 方法获取实例化对象。

1.4 imports 模块

dubbogo 将所有内置模块放在 imports/imports.go 中。用户使用框架时,需要导入该模块才能使用框架提供的基本功能。

import (
_ "dubbo.apache.org/dubbo-go/v3/imports"
)

2. 组件加载流程

  1. 用户在代码中引入 _ “dubbo.apache.org/dubbo-go/v3/imports”

  2. 程序启动,依次执行 init 函数,将工厂函数/实例化对象注册到扩展模块。

  3. 框架启动,加载配置,在配置中获取要加载的模块的 key,根据 key 获取实例化对象。

  4. 用户也可以手动调用扩展的 Get 方法获取实例化对象并直接使用。

3. 自定义组件

在以上介绍的基础上,开发者可以仿照内置模块,编写自定义的扩展组件。

4. 面向切面编程设计 (AOP)

在 Dubbo-go 服务框架中,很多接口的设计都是基于 AOP 的思想。例如 Invoker、Filter、LoadBalance、Router。

这些接口的多个实现往往会形成一组调用链,单个实现类只处理自己关心的逻辑。

相关阅读:[AOP 维基百科]


上次修改时间:2023 年 1 月 2 日:增强 Dubbogo 文档 (#1800) (71c8e722740)