@Override
    protected Mono<Void> doExecute(final ServerWebExchange exchange, final ShenyuPluginChain chain,
                                   final SelectorData selector, final RuleData rule) {
        if (Objects.isNull(rule)) {
            return Mono.empty();
        }
        final ShenyuContext shenyuContext = exchange.getAttribute(Constants.CONTEXT);
        assert shenyuContext != null;
        final SpringCloudSelectorHandle springCloudSelectorHandle = SpringCloudPluginDataHandler.SELECTOR_CACHED.get().obtainHandle(selector.getId());
        final SpringCloudRuleHandle ruleHandle = buildRuleHandle(rule);
        String serviceId = springCloudSelectorHandle.getServiceId();
        if (StringUtils.isBlank(serviceId)) {
            Object error = ShenyuResultWrap.error(exchange, ShenyuResultEnum.CANNOT_CONFIG_SPRINGCLOUD_SERVICEID);
            return WebFluxResultUtils.result(exchange, error);
        }
        final String ip = Objects.requireNonNull(exchange.getRequest().getRemoteAddress()).getAddress().getHostAddress();
        final Upstream upstream = serviceChooser.choose(serviceId, selector.getId(), ip, ruleHandle.getLoadBalance());
        if (Objects.isNull(upstream)) {
            Object error = ShenyuResultWrap.error(exchange, ShenyuResultEnum.SPRINGCLOUD_SERVICEID_IS_ERROR);
            return WebFluxResultUtils.result(exchange, error);
        }
        final String domain = upstream.buildDomain();
        setDomain(URI.create(domain + shenyuContext.getRealUrl()), exchange);
        //set time out.
        exchange.getAttributes().put(Constants.HTTP_TIME_OUT, ruleHandle.getTimeout());
        return chain.execute(exchange);
    }
@Test
    public void testSpringCloudPluginNormal() throws URISyntaxException {
        final SelectorData selectorData = SelectorData.builder()
                .id("springcloud")
                .handle("{\"serviceId\":\"service1\"}")
                .build();
        final RuleData rule = RuleData.builder()
                .id("springcloud")
                .selectorId("springcloud")
                .handle("{\"path\":\"service1/\"}")
                .build();
        SpringCloudSelectorHandle springCloudSelectorHandle = GsonUtils.getGson()
                .fromJson(selectorData.getHandle(), SpringCloudSelectorHandle.class);
        SpringCloudRuleHandle springCloudRuleHandle = GsonUtils.getGson()
                .fromJson(rule.getHandle(), SpringCloudRuleHandle.class);
        SpringCloudPluginDataHandler.SELECTOR_CACHED.get().cachedHandle(selectorData.getId(), springCloudSelectorHandle);
        SpringCloudPluginDataHandler.RULE_CACHED.get().cachedHandle(CacheKeyUtils.INST.getKey(rule), springCloudRuleHandle);
        exchange.getAttributes().put(Constants.CONTEXT, shenyuContext);
        Mono<Void> execute = springCloudPlugin.doExecute(exchange, chain, selectorData, rule);
        StepVerifier.create(execute).expectSubscription().verifyComplete();
    }