mirror of
https://github.com/langhuihui/monibuca.git
synced 2025-10-06 02:46:50 +08:00
170 lines
5.7 KiB
Markdown
170 lines
5.7 KiB
Markdown
# 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. |