# 概述
动态插件调用是FizzGate提供的独特能力,主要解决了以下两个问题:
1、动态热插拔插件: 允许开发者自行开发和选择市场提供的插件,实现动态热插拔,不影响节点功能。 2、ClassLoader互相隔离: 插件与节点之间以及插件之间使用ClassLoader进行互相隔离,确保即使使用不同版本的API也能兼容。
FizzGate团队与阿里Sofa团队进行了深度合作,充分利用了Sofa的隔离技术。这种合作不仅满足了Sofa在应用场景和社区反馈能力方面的需求,还充分发挥了Sofa的Serverless能力,从而显著提升了FizzGate的整体能力。
动态插件的来源主要有两个途径:
1、自行利用模板进行二次开发。 2、从官方市场下载插件。
# 组件开发
下载sample代码,https://gitee.com/fizzgate/fizz-dynamic-plugin
以下是一个插件示例的主要代码:
package com.fizzgate.plugin.extension;
import com.alipay.sofa.runtime.api.annotation.SofaService;
import com.alipay.sofa.runtime.api.annotation.SofaServiceBinding;
import com.fizzgate.plugin.FizzPluginFilter;
import com.fizzgate.plugin.FizzPluginFilterChain;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.Map;
@SofaService(uniqueId = LogPlugin.PLUGIN_ID, bindings = {@SofaServiceBinding(serialize = false)})
@Component
public class LogPlugin implements FizzPluginFilter {
public static final String PLUGIN_ID = "logPlugin"; // 插件 id
public void init(String pluginConfig) {
FizzPluginFilter.super.init(pluginConfig);
}
public Mono<Void> filter(ServerWebExchange exchange, Map<String, Object> config) {
System.err.println("this is my plugin"); // 本插件只输出这个
return FizzPluginFilterChain.next(exchange); // 执行后续逻辑
}
}
上述代码中,@SofaService 注解声明了该组件为动态组件,需要暴露服务能力给节点调用。
需要注意的是,uniqueId 必须与插件后台配置一致。其他开发细节可以参考静态插件开发方式。
# 后台配置
在后台配置中,需要进行以下步骤:
点击扩展中心,然后点击新增;
编辑插件相关信息,确保插件名与 uniqueId 一致;
上传动态插件文件;
点击保存。
这些步骤能够确保插件被成功配置并能够在系统中使用。