引言
本文将接上篇Velero代码深入分析(一),
目录
插件框架
插件框架的主要代码在pkg/plugin/framework/
。插件框架主要定义了插件的各个类型以及数据结构,并实现了服务端同go-plugin
的集成。以下是插件框架的数据结构关系图:
插件框架的核心是Server
,其中主要包括了velero实现的第一级插件的指针。每一个第一级插件会嵌入一个PluginBase
的结构,这个结构主要作用是指向一个ServerMux
的结构。ServerMux
包含的数据结构会定位到第二级插件操作,并实现注册插件操作、Get
等操作,从而可以得到每一个具体的第二级插件操作的实现。
插件类型的实现
对每一个一级插件,都要实现go-plugin
插件库的plugin
接口。例如,以下是BackupItemActionPlugin
的实现,在pkg/plugin/framework/backup_item_action.go
:
type BackupItemActionPlugin struct {
plugin.NetRPCUnsupportedPlugin
*pluginBase
}
// GRPCClient returns a clientDispenser for BackupItemAction gRPC clients.
func (p *BackupItemActionPlugin) GRPCClient(_ context.Context, _ *plugin.GRPCBroker, clientConn *grpc.ClientConn) (interface{}, error) {
return newClientDispenser(p.clientLogger, clientConn, newBackupItemActionGRPCClient), nil
}
// GRPCServer registers a BackupItemAction gRPC server.
func (p *BackupItemActionPlugin) GRPCServer(_ *plugin.GRPCBroker, server *grpc.Server) error {
proto.RegisterBackupItemActionServer(server, &BackupItemActionGRPCServer{mux: p.serverMux})
return nil
}
可以看到,BackupItemActionPlugin
的GRPCClient
主要是返回一个BackupItemAction
的gRPC客户端的分发器,并且参数会带一个gRPC的通道;而GRPCServer
主要是为了注册一个BackupItemAction
的gRPC服务端的实现,在服务端初始化时会被go-plugin
调用到。