Soul网关源码学习06

Soul网关源码学习06

Soul插件

在soul网关中每个请求,都会通过责任链的方式执行相匹配的插件,所以插件也是soul网关的核心,soul网关的插件是可插拔的,并且是插件之间依赖关系是松耦合且插件的功能实现高聚合,其次用户可根据需求定制插件满足自己的需求。

SoulConfiguration

soul插件配置类,使用 spring.factories 加载该配置。

@Bean("webHandler")
public SoulWebHandler soulWebHandler(final ObjectProvider<List<SoulPlugin>> plugins) {
    List<SoulPlugin> pluginList = plugins.getIfAvailable(Collections::emptyList);
    //对所有插件进行排序
    final List<SoulPlugin> soulPlugins = pluginList.stream()
            .sorted(Comparator.comparingInt(SoulPlugin::getOrder)).collect(Collectors.toList());
    //输出所有加载的插件
    soulPlugins.forEach(soulPlugin -> log.info("load plugin:[{}] [{}]", soulPlugin.named(), soulPlugin.getClass().getName()));
    return new SoulWebHandler(soulPlugins);
}

1、ObjectProvider 使用更宽松的方式注入SoulPlugin。
2、对所有插件进行排序,输出所有加载的插件。
3、创建SoulWebHandler对接,构造方法传递所有插件。

SoulPlugin

所有的插件实现SoulPlugin类,并重载对应的方法。

//执行插件
Mono<Void> execute(ServerWebExchange exchange, SoulPluginChain chain);
//排序
int getOrder();
//插件名
default String named() {
    return "";
}
//是否终止
default Boolean skip(ServerWebExchange exchange) {
    return false;
}

//Hystrix 插件配置
@Bean
public SoulPlugin hystrixPlugin() {
return new HystrixPlugin();
}
//WebSocket插件配置
@Bean
public SoulPlugin webSocketPlugin(WebSocketClient webSocketClient, WebSocketService webSocketService) {
return new WebSocketPlugin(webSocketClient, webSocketService);
}
//dubbo插件
@Bean
public SoulPlugin apacheDubboPlugin(ObjectProvider<DubboParamResolveService> dubboParamResolveService) {
    return new ApacheDubboPlugin(new ApacheDubboProxyService(dubboParamResolveService.getIfAvailable()));
}

SoulWebHandler

执行插件通过责任链的方式。

@Override
public Mono<Void> handle(@NonNull final ServerWebExchange exchange) {
    MetricsTrackerFacade.getInstance().counterInc(MetricsLabelEnum.REQUEST_TOTAL.getName());
    Optional<HistogramMetricsTrackerDelegate> startTimer = 	MetricsTrackerFacade.getInstance().histogramStartTimer(MetricsLabelEnum.REQUEST_LATENCY.getName());
    //责任链调用插件
    return new DefaultSoulPluginChain(plugins).execute(exchange).subscribeOn(scheduler).doOnSuccess(t -> startTimer.ifPresent(time -> MetricsTrackerFacade.getInstance().histogramObserveDuration(time)));
}

public Mono<Void> execute(final ServerWebExchange exchange) {
    return Mono.defer(() -> {
        if (this.index < plugins.size()) {
            //从集合中获取当前插件
            SoulPlugin plugin = plugins.get(this.index++);
            Boolean skip = plugin.skip(exchange);
            //判断是否中断本次执行
            if (skip) {
                return this.execute(exchange);
            }
            return plugin.execute(exchange, this);
        }
        return Mono.empty();
    });
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值