package instance import ( "fmt" "github.com/hashicorp/go-plugin" "os/exec" "plugins/sdk/shared" ) type PkgConf struct { Cmd string // 插件的执行路径 Tag string // 插件的tag,对应插件 } var ManageMap manage // Get 获取服务 func Get(tag string) shared.PluginService { if _, ok := ManageMap[tag]; ok { return ManageMap[tag].service } return nil } func Load(load []*PkgConf) error { ManageMap = make(manage) for _, v := range load { srv, err := service(v.Cmd, v.Tag) if err != nil { return err } err = ManageMap.add(server{ tag: v.Tag, service: srv, }) if err != nil { return err } } return nil } func service(cmd, tag string) (shared.PluginService, error) { pluginClientConfig := &plugin.ClientConfig{ HandshakeConfig: shared.Handshake, Cmd: exec.Command(cmd), Plugins: map[string]plugin.Plugin{tag: &shared.GRPCPlugin{}}, AllowedProtocols: []plugin.Protocol{plugin.ProtocolGRPC}, } client := plugin.NewClient(pluginClientConfig) pluginClientConfig.Reattach = client.ReattachConfig() protocol, err := client.Client() if err != nil { return nil, fmt.Errorf("plugin.NewClient err:%v", err) } raw, err := protocol.Dispense(tag) if err != nil { return nil, fmt.Errorf("protocol.Dispense err:%v", err) } // 类型断言为PluginService接口 return raw.(shared.PluginService), nil }