alibaba / Sentinel

A powerful flow control component enabling reliability, resilience and monitoring for microservices. (面向云原生微服务的高可用流控防护组件)
https://sentinelguard.io/
Apache License 2.0
22.38k stars 8.02k forks source link

Circuit breaker for API gateway | Sentinel网关熔断降级 #2537

Open ja-peng opened 2 years ago

ja-peng commented 2 years ago

现在系统需要在网关(SpringCloud Gateway)中实现sentinel熔断降级,Sentinel网关熔断降级可否像网关限速(GatewayRuleManager.loadRules())一样以编码的方式将熔断降级规则加载到网关中?

lovegwwp commented 2 years ago

同问,支持在网关处记录异常,进行资源降级吗? 目前测试下来,无效果

ja-peng commented 2 years ago

同问,支持在网关处记录异常,进行资源降级吗? 目前测试下来,无效果

DegradeRuleManager.loadRules(List rules) 这个方法加载熔断规则好像直接没啥用,debug到网关过滤器可以看到熔断规则加载进去了,但是没有熔断降级效果,一开始我以为是没有满足熔断条件。

ja-peng commented 2 years ago

同问,支持在网关处记录异常,进行资源降级吗? 目前测试下来,无效果

Refer #1842

1083 commented 2 years ago

请问在gateway 中无法熔断。哪怕注解 @SentinelResource(value = "selectUserByName", entryType = EntryType.IN, blockHandler = "selectUserByNameBlockHandler", fallback = "selectUserByNameFallback")

如果使用上述注解,可以进入熔断方法中,但是无法根据设定的70秒熔断时间保持熔断。

Swordsman007 commented 2 years ago

同问,现在网关怎么使用熔断规则

leo2014 commented 2 years ago

可以实现gateway的局部filter,然后设置默认全部过滤。

@Slf4j
@Component
public class SpringCloudCircuitBreakerSentinelFilterFactory 
             extends SpringCloudCircuitBreakerFilterFactory {

    @Autowired(required = false)
    public SpringCloudCircuitBreakerSentinelFilterFactory (
            ReactiveCircuitBreakerFactory<SentinelConfigBuilder.SentinelCircuitBreakerConfiguration, SentinelConfigBuilder>
                    reactiveCircuitBreakerFactory,
            ObjectProvider<DispatcherHandler> dispatcherHandlerProvider) {
        super(reactiveCircuitBreakerFactory, dispatcherHandlerProvider);
        if (reactiveCircuitBreakerFactory == null) {
            log.warn("ReactiveCircuitBreakerFactory must be required!");
            return;
        }
        List<DegradeRule> degradeRules = new ArrayList<>();
        // 设置慢调用等熔断规则
        degradeRules.add(new DegradeRule()
                .setGrade(CircuitBreakerStrategy.SLOW_REQUEST_RATIO.getType())
                .setCount(30000.0d)
                .setMinRequestAmount(5)
                .setTimeWindow(10)
                .setStatIntervalMs(1000)
                .setSlowRatioThreshold(0.8d));
        Function<String, SentinelConfigBuilder.SentinelCircuitBreakerConfiguration> defaultConfiguration =
                id -> new SentinelConfigBuilder().resourceName(id).rules(degradeRules).build();
        reactiveCircuitBreakerFactory.configureDefault(defaultConfiguration);
    }

    @Override
    protected Mono<Void> handleErrorWithoutFallback(Throwable t) {
        if (t instanceof DegradeException) {
            return Mono.error(new ServiceException(ResultCode.SERVER_ERROR));
        }
        return Mono.error(t);
    }

}
spring:
  cloud:
    gateway:
      default-filters:
      - CircuitBreaker=SentinelDefault