# 概述

动态插件调用是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 一致;

  • 上传动态插件文件;

  • 点击保存。

这些步骤能够确保插件被成功配置并能够在系统中使用。