Files
monibuca/doc/arch/plugin.md
2025-01-30 18:09:11 +08:00

5.7 KiB

Plugin System

Monibuca adopts a plugin-based architecture design, extending functionality through its plugin mechanism. The plugin system is one of Monibuca's core features, allowing developers to add new functionality in a modular way without modifying the core code.

Plugin Lifecycle

The plugin system has complete lifecycle management, including the following phases:

1. Registration Phase

Plugins are registered using the InstallPlugin generic function, during which:

  • Plugin metadata (PluginMeta) is created, including:

    • Plugin name: automatically extracted from the plugin struct name (removing "Plugin" suffix)
    • Plugin version: extracted from the caller's file path or package path, defaults to "dev" if not extractable
    • Plugin type: obtained through reflection of the plugin struct type
  • Optional features are registered:

    • Exit handler (OnExitHandler)
    • Default configuration (DefaultYaml)
    • Puller
    • Pusher
    • Recorder
    • Transformer
    • Publish authentication (AuthPublisher)
    • Subscribe authentication (AuthSubscriber)
    • gRPC service (ServiceDesc)
    • gRPC gateway handler (RegisterGRPCHandler)
  • Plugin metadata is added to the global plugin list

The registration phase is the first stage in a plugin's lifecycle, providing the plugin system with basic information and functional definitions, preparing for subsequent initialization and startup.

2. Initialization Phase (Init)

Plugins are initialized through the Plugin.Init method, including these steps:

  1. Instance Verification

    • Check if the plugin implements the IPlugin interface
    • Get plugin instance through reflection
  2. Basic Setup

    • Set plugin metadata and server reference
    • Configure plugin logger
    • Set plugin name and version information
  3. Environment Check

    • Check if plugin is disabled by environment variables ({PLUGIN_NAME}_ENABLE=false)
    • Check global disable status (DisableAll)
    • Check enable status in user configuration (enable)
  4. Configuration Loading

    • Parse common configuration
    • Load default YAML configuration
    • Merge user configuration
    • Apply final configuration and log
  5. Database Initialization (if needed)

    • Check database connection configuration (DSN)
    • Establish database connection
    • Auto-migrate database tables (for recording functionality)
  6. Status Recording

    • Record plugin version
    • Record user configuration
    • Set log level
    • Record initialization status

If errors occur during initialization:

  • Plugin is marked as disabled
  • Disable reason is recorded
  • Plugin is added to the disabled plugins list

The initialization phase prepares necessary environment and resources for plugin operation, crucial for ensuring normal plugin operation.

3. Startup Phase (Start)

Plugins start through the Plugin.Start method, executing these operations in sequence:

  1. gRPC Service Registration (if configured)

    • Register gRPC service
    • Register gRPC gateway handler
    • Handle gRPC-related errors
  2. Plugin Management

    • Add plugin to server's plugin list
    • Set plugin status to running
  3. Network Listener Initialization

    • Start HTTP/HTTPS services
    • Start TCP/TLS services (if implementing ITCPPlugin interface)
    • Start UDP services (if implementing IUDPPlugin interface)
    • Start QUIC services (if implementing IQUICPlugin interface)
  4. Plugin Initialization Callback

    • Call plugin's OnInit method
    • Handle initialization errors
  5. Timer Task Setup

    • Configure server keepalive task (if enabled)
    • Set up other timer tasks

If errors occur during startup:

  • Error reason is recorded
  • Plugin is marked as disabled
  • Subsequent startup steps are stopped

The startup phase is crucial for plugins to begin providing services, with all preparations completed and ready for business logic processing.

4. Stop Phase (Stop)

The plugin stop phase is implemented through the Plugin.OnStop method and related stop handling logic, including:

  1. Service Shutdown

    • Stop all network services (HTTP/HTTPS/TCP/UDP/QUIC)
    • Close all network connections
    • Stop processing new requests
  2. Resource Cleanup

    • Stop all timer tasks
    • Close database connections (if any)
    • Clean up temporary files and cache
  3. Status Handling

    • Update plugin status to stopped
    • Remove from server's active plugin list
    • Trigger stop event notifications
  4. Callback Processing

    • Call plugin's custom OnStop method
    • Execute registered stop callback functions
    • Handle errors during stop process
  5. Connection Handling

    • Wait for current request processing to complete
    • Gracefully close existing connections
    • Reject new connection requests

The stop phase aims to ensure plugins can safely and cleanly stop running without affecting other parts of the system.

5. Destroy Phase (Destroy)

The plugin destroy phase is implemented through the Plugin.Dispose method, the final phase in a plugin's lifecycle, including:

  1. Resource Release

    • Call plugin's OnStop method for stop processing
    • Remove from server's plugin list
    • Release all allocated system resources
  2. Status Cleanup

    • Clear all plugin status information
    • Reset plugin internal variables
    • Clear plugin configuration information
  3. Connection Disconnection

    • Disconnect all connections with other plugins
    • Clean up plugin dependencies
    • Remove event listeners
  4. Data Cleanup

    • Clean up temporary data generated by plugin
    • Close and clean up database connections
    • Delete unnecessary files
  5. Final Processing

    • Execute registered destroy callback functions
    • Log destruction
    • Ensure all resources are properly released

The destroy phase aims to ensure plugins completely clean up all resources, leaving no residual state, preventing memory and resource leaks.