Soul 源码分析17 Sentinel Plugin 分析

本文深入分析Soul框架中的Sentinel Plugin,讲解如何在bootstrap pom.xml中引入Sentinel支持,以及在Soul Admin中配置Sentinel plugin、selector和rule来制定熔断策略。Sentinel Plugin基于AbstractSoulPlugin实现,通过SentinelReactorTransformer进行函数式编程,实现在所有插件执行后的熔断操作,SentinelReactorSubscriber则负责在插件链执行的最后进行hook操作,利用webflux编程模型完成Sentinel的集成。
摘要由CSDN通过智能技术生成

Sentinel Plugin

[reference]https://dromara.org/zh/projects/soul/sentinel-plugin/

在bootstrap pom.xml 中添加 sentinel的支持

        <!-- soul sentinel plugin start-->
        <dependency>
            <groupId>org.dromara</groupId>
            <artifactId>soul-spring-boot-starter-plugin-sentinel</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!-- soul sentinel plugin end-->

然后再SOUL admin中开启 Sentinel plugin

同时配置selector以及相关rule, 制定相应的熔断策略, 相关 selector 配置

Sentinel plugin与其他插件一样继承了AbstractSoulPlugin, 核心逻辑如下

    protected Mono<Void> doExecute(final ServerWebExchange exchange, final SoulPluginChain chain, final SelectorData selector, final RuleData rule) {
        final SoulContext soulContext = exchange.getAttribute(Constants.CONTEXT);
        assert soulContext != null;
        String resourceName = SentinelRuleHandle.getResourceName(rule);
        SentinelHandle sentinelHandle = GsonUtils.getInstance().fromJson(rule.getHandle(), SentinelHandle.class);
        return chain.execute(exchange).transform(new SentinelReactorTransformer<>(resourceName)).doOnSuccess(v -> {
            HttpStatus status = exchange.getResponse().getStatusCode();
            if (status == null || !status.is2xxSuccessful()) {
                exchange.getResponse().setStatusCode(null);
                throw new SentinelFallbackException(status == null ? HttpStatus.INTERNAL_SERVER_ERROR : status);
            }
        }).onErrorResume(throwable -> sentinelFallbackHandler.fallback(exchange, UriUtils.createUri(sentinelHandle.getFallbackUri()), throwable));
    }

这里使用 transform 加入一个函数作用于所有订阅者

SentinelReactorTransformer 是Sentinel提供的主要的熔断实现类,会在所有插件执行完毕后执行,实现完美的解耦

SentinelReactorTransformer 继承了 publisher, 使用发布订阅的工作模式, 对应订阅类 SentinelReactorSubscriber, 在执行插件链的最后执行 SentinelReactorSubscriber 中的 hookOnSubscribe(),之后完全交给 Sentinal 做处理

   @Override
    protected void hookOnSubscribe(Subscription subscription) {
        doWithContextOrCurrent(() -> currentContext().getOrEmpty(SentinelReactorConstants.SENTINEL_CONTEXT_KEY),
            this::entryWhenSubscribed);
    }

这个里面用到大量 webflux 编程,后续搞定出Reactor

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值