sentinel 熔断降级

article/2025/9/25 18:40:16

sentinel 熔断降级

            

官网:https://sentinelguard.io/zh-cn/docs/circuit-breaking.html

             

                   

                                   

熔断降级

           

熔断降级:服务由于响应慢、异常等原因触发熔断策略后,快速失败,避免线程堆积造成服务雪崩(熔断降级通常在调用端配置)

                 

           

熔断策略

# 慢调用比例:SLOW_REQUEST_RATIO,以慢调用比例作为阈值
慢调用:如果一个请求的响应时间需要大于设置的慢调用响应时间(RT),该请求统计为慢调用;
熔断触发:单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,在熔断时长内自动触发熔断(调用方法时,抛出DegradeException)
熔断恢复:在熔断时长后,熔断器进入探测恢复状态(half-open状态),如果接下来的请求响应时间 < 设置的慢调用响应时间,则结束熔断如果接下来的请求响应时间 > 设置的慢调用响应时间,则继续在熔断时长内保持熔断# 异常比例 :ERROR_RATIO,以请求异常比例作为阀值,阈值范围是[0.0, 1.0]
异常请求:请求调用抛出异常,则该请求统计为异常请求
熔断触发:单位统计时长(statIntervalMs)内请求数目 > 设置的最小请求数目,并且异常的比例 > 阈值,在熔断时长内自动被熔断
熔断恢复:在熔断时长后,熔断器进入探测恢复状态(HALF-OPEN 状态),如果接下来的一个请求执行成功,则结束熔断;如果请求执行失败,则继续在熔断时长内保持熔断# 异常数:ERROR_COUNT,以异常请求数作为阀值
异常请求:请求调用抛出异常,则该请求统计为异常请求
熔断触发:单位统计时长(statIntervalMs)内请求数目 > 设置的最小请求数目,并且异常请求 > 设置的异常请求数阀值,在熔断时长内自动被熔断
熔断恢复:在熔断时长后,熔断器进入探测恢复状态(HALF-OPEN 状态),如果接下来的一个请求执行成功,则结束熔断;如果请求执行失败,则继续在熔断时长内保持熔断

            

DegradeRule:熔断降级规则

public class DegradeRule extends AbstractRule {private int grade = 0;            //熔断策略,支持慢调用比例(默认)、异常比例、异常数策略private double count;             //限流阀值private int timeWindow;           //熔断时间窗口,单位为秒private int minRequestAmount = 5; //最小请求数private double slowRatioThreshold = 1.0D;  //慢调用比例阈值private int statIntervalMs = 1000;         //统计时间窗口,默认1spublic DegradeRule() {}

            

AbstractRule

public abstract class AbstractRule implements Rule {private String resource;   //限流资源private String limitApp;   //调用来源、default、otherpublic AbstractRule() {}

            

                  

                                   

实现原理

      

DegradeSlot

@SpiOrder(-1000)
public class DegradeSlot extends AbstractLinkedProcessorSlot<DefaultNode> {public DegradeSlot() {}public void entry(Context context, ResourceWrapper resourceWrapper, DefaultNode node, int count, boolean prioritized, Object... args) throws Throwable {this.performChecking(context, resourceWrapper);  //检查熔断规则,如果触发熔断,直接抛出DegradeException异常this.fireEntry(context, resourceWrapper, node, count, prioritized, args);//追星后续限流操作}void performChecking(Context context, ResourceWrapper r) throws BlockException {List<CircuitBreaker> circuitBreakers = DegradeRuleManager.getCircuitBreakers(r.getName());  //获取资源相关的断路器if (circuitBreakers != null && !circuitBreakers.isEmpty()) {Iterator var4 = circuitBreakers.iterator();CircuitBreaker cb;do {if (!var4.hasNext()) {return;}cb = (CircuitBreaker)var4.next();} while(cb.tryPass(context));    //熔断窗口到期,检查单词请求是否可以通过throw new DegradeException(cb.getRule().getLimitApp(), cb.getRule());//熔断检查未通过,抛出DegradeException异常}}public void exit(Context context, ResourceWrapper r, int count, Object... args) {Entry curEntry = context.getCurEntry();if (curEntry.getBlockError() != null) {this.fireExit(context, r, count, args);} else {List<CircuitBreaker> circuitBreakers = DegradeRuleManager.getCircuitBreakers(r.getName());if (circuitBreakers != null && !circuitBreakers.isEmpty()) {if (curEntry.getBlockError() == null) {Iterator var7 = circuitBreakers.iterator();while(var7.hasNext()) {CircuitBreaker circuitBreaker = (CircuitBreaker)var7.next();circuitBreaker.onRequestComplete(context);}}this.fireExit(context, r, count, args);} else {this.fireExit(context, r, count, args);}}}
}

                

CircuitBreaker

public interface CircuitBreaker {DegradeRule getRule();boolean tryPass(Context var1);CircuitBreaker.State currentState();void onRequestComplete(Context var1);public static enum State {OPEN,HALF_OPEN,CLOSED;private State() {}}
}

          

AbstractCircuitBreaker

public abstract class AbstractCircuitBreaker implements CircuitBreaker {protected final DegradeRule rule;protected final int recoveryTimeoutMs;private final EventObserverRegistry observerRegistry;protected final AtomicReference<State> currentState;protected volatile long nextRetryTimestamp;public AbstractCircuitBreaker(DegradeRule rule) {this(rule, EventObserverRegistry.getInstance());}AbstractCircuitBreaker(DegradeRule rule, EventObserverRegistry observerRegistry) {this.currentState = new AtomicReference(State.CLOSED);AssertUtil.notNull(observerRegistry, "observerRegistry cannot be null");if (!DegradeRuleManager.isValidRule(rule)) {throw new IllegalArgumentException("Invalid DegradeRule: " + rule);} else {this.observerRegistry = observerRegistry;this.rule = rule;this.recoveryTimeoutMs = rule.getTimeWindow() * 1000;}}public DegradeRule getRule() {return this.rule;}public State currentState() {return (State)this.currentState.get();}public boolean tryPass(Context context) {     //熔断检查if (this.currentState.get() == State.CLOSED) {    //断路器为closed,返回truereturn true;} else if (this.currentState.get() != State.OPEN) {  //断路器状态不为open,返回falsereturn false;} else {return this.retryTimeoutArrived() && this.fromOpenToHalfOpen(context);}   //判断是否是请求重试时间,如果不是,直接返回false//如果是,断路器状态设置为HalfOpen,异步执行单次请求,//如果单次请求不通过,断路器状态切换为open,//如果单次请求通过,返回true,可执行后续限流操作}abstract void resetStat();protected boolean retryTimeoutArrived() {return TimeUtil.currentTimeMillis() >= this.nextRetryTimestamp;}   //判断是否为请求重试时间protected void updateNextRetryTimestamp() {this.nextRetryTimestamp = TimeUtil.currentTimeMillis() + (long)this.recoveryTimeoutMs;}   //下次重试时间:当前时间 + recoveryTimeoutMs(即rule.getTimeWindow() * 1000)protected boolean fromCloseToOpen(double snapshotValue) {State prev = State.CLOSED;if (this.currentState.compareAndSet(prev, State.OPEN)) {this.updateNextRetryTimestamp();this.notifyObservers(prev, State.OPEN, snapshotValue);return true;} else {return false;}}protected boolean fromOpenToHalfOpen(Context context) {if (this.currentState.compareAndSet(State.OPEN, State.HALF_OPEN)) {//使用cas将断路器状态设置为HALF_OPENthis.notifyObservers(State.OPEN, State.HALF_OPEN, (Double)null);Entry entry = context.getCurEntry();entry.whenTerminate(new BiConsumer<Context, Entry>() {public void accept(Context context, Entry entry) {if (entry.getBlockError() != null) {//请求出现异常,状态设置为openAbstractCircuitBreaker.this.currentState.compareAndSet(State.HALF_OPEN, State.OPEN);AbstractCircuitBreaker.this.notifyObservers(State.HALF_OPEN, State.OPEN, 1.0D);}}});return true;   //如果没有异常,返回true} else {return false;}}private void notifyObservers(State prevState, State newState, Double snapshotValue) {Iterator var4 = this.observerRegistry.getStateChangeObservers().iterator();while(var4.hasNext()) {CircuitBreakerStateChangeObserver observer = (CircuitBreakerStateChangeObserver)var4.next();observer.onStateChange(prevState, newState, this.rule, snapshotValue);}}protected boolean fromHalfOpenToOpen(double snapshotValue) {if (this.currentState.compareAndSet(State.HALF_OPEN, State.OPEN)) {this.updateNextRetryTimestamp();this.notifyObservers(State.HALF_OPEN, State.OPEN, snapshotValue);return true;} else {return false;}}protected boolean fromHalfOpenToClose() {if (this.currentState.compareAndSet(State.HALF_OPEN, State.CLOSED)) {this.resetStat();this.notifyObservers(State.HALF_OPEN, State.CLOSED, (Double)null);return true;} else {return false;}}protected void transformToOpen(double triggerValue) {State cs = (State)this.currentState.get();switch(cs) {case CLOSED:this.fromCloseToOpen(triggerValue);break;case HALF_OPEN:this.fromHalfOpenToOpen(triggerValue);}}
}

             

                    

                                   

使用示例

    

**********

服务端

      

                       

       

application.yml

spring:application:name: nacos-providercloud:nacos:discovery:server-addr: localhost:8848dubbo:#registry:# address: spring-cloud://localhost:8848protocol:name: dubboport: -1

       

HelloService

public interface HelloService {String hello();
}

       

HelloServiceImpl

@DubboService
public class HelloServiceImpl implements HelloService {@Overridepublic String hello() {throw new RpcException("出错了");}
}

          

DemoApplication

@EnableDubbo    //开启dubbo
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}

           

**********

消费端

   

                       

             

application.yml

spring:application:name: nacos-providercloud:nacos:discovery:server-addr: localhost:8848dubbo:#registry:# address: spring-cloud://localhost:8848protocol:name: dubboport: -1

        

CustomDegradeRule

public class CustomDegradeRule implements InitFunc {@Overridepublic void init() throws Exception {DegradeRule degradeRule = new DegradeRule("com.example.demo.service.HelloService:hello()");degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_EXCEPTION_COUNT).setCount(1).setMinRequestAmount(5).setTimeWindow(10);DegradeRuleManager.loadRules(Collections.singletonList(degradeRule));}
}

           

HelloService

public interface HelloService {String hello();
}

         

HelloController

@RestController
public class HelloController {@DubboReference//@DubboReference(mock = "true")private HelloService helloService;@RequestMapping("/hello")public String hello(){System.out.println(helloService.hello());return "success";}
}

             

DemoApplication

@EnableDubbo
@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}}

         

META-INF/services/com.alibaba.csp.sentinel.init.InitFunc

com.example.demo.config.CustomDegradeRule

              

**********

jmeter 测试

  

线程组、http请求

                 

                 

         

查看结果树

                 

2022-04-06 17:08:19.155  WARN 4870 --- [client.listener] a.c.d.m.r.DubboServiceMetadataRepository : Current application will subscribe all services(size:2) in registry, a lot of memory and CPU cycles may be used, thus it's strongly recommend you using the externalized property 'dubbo.cloud.subscribed-services' to specify the services
2022-04-06 17:08:21.411  INFO 4870 --- [erverWorker-4-1] o.a.d.r.t.netty4.NettyServerHandler      :  [DUBBO] The connection of /192.168.5.9:54897 -> /192.168.5.9:20881 is established., dubbo version: 2.7.8, current host: 192.168.5.9
2022-04-06 17:08:23.509  INFO 4870 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-04-06 17:08:23.509  INFO 4870 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-04-06 17:08:23.523  INFO 4870 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 13 ms
2022-04-06 17:08:23.550 ERROR 4870 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.dubbo.rpc.RpcException: 出错了] with root causeorg.apache.dubbo.rpc.RpcException: 出错了at com.example.demo.service.impl.HelloServiceImpl.hello(HelloServiceImpl.java:12) ~[na:na]at org.apache.dubbo.common.bytecode.Wrapper3.invokeMethod(Wrapper3.java) ~[na:na]at org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:47) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:84) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:56) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:56) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:52) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter.invoke(SentinelDubboProviderFilter.java:80) ~[sentinel-apache-dubbo-adapter-1.8.0.jar:na]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:89) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:46) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:77) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:129) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:152) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:41) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:145) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:100) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:175) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:51) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:57) ~[dubbo-2.7.8.jar:2.7.8]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_211]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_211]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_211]2022-04-06 17:08:23.591 ERROR 4870 --- [nio-8081-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.dubbo.rpc.RpcException: 出错了] with root causeorg.apache.dubbo.rpc.RpcException: 出错了at com.example.demo.service.impl.HelloServiceImpl.hello(HelloServiceImpl.java:12) ~[na:na]at org.apache.dubbo.common.bytecode.Wrapper3.invokeMethod(Wrapper3.java) ~[na:na]at org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:47) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:84) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:56) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:56) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:52) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter.invoke(SentinelDubboProviderFilter.java:80) ~[sentinel-apache-dubbo-adapter-1.8.0.jar:na]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:89) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:46) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:77) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:129) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:152) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:41) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:145) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:100) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:175) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:51) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:57) ~[dubbo-2.7.8.jar:2.7.8]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_211]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_211]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_211]2022-04-06 17:08:23.602 ERROR 4870 --- [nio-8081-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.dubbo.rpc.RpcException: 出错了] with root causeorg.apache.dubbo.rpc.RpcException: 出错了at com.example.demo.service.impl.HelloServiceImpl.hello(HelloServiceImpl.java:12) ~[na:na]at org.apache.dubbo.common.bytecode.Wrapper3.invokeMethod(Wrapper3.java) ~[na:na]at org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:47) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:84) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:56) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:56) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:52) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter.invoke(SentinelDubboProviderFilter.java:80) ~[sentinel-apache-dubbo-adapter-1.8.0.jar:na]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:89) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:46) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:77) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:129) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:152) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:41) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:145) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:100) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:175) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:51) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:57) ~[dubbo-2.7.8.jar:2.7.8]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_211]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_211]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_211]2022-04-06 17:08:23.610 ERROR 4870 --- [nio-8081-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.dubbo.rpc.RpcException: 出错了] with root causeorg.apache.dubbo.rpc.RpcException: 出错了at com.example.demo.service.impl.HelloServiceImpl.hello(HelloServiceImpl.java:12) ~[na:na]at org.apache.dubbo.common.bytecode.Wrapper3.invokeMethod(Wrapper3.java) ~[na:na]at org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:47) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:84) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:56) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:56) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:52) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter.invoke(SentinelDubboProviderFilter.java:80) ~[sentinel-apache-dubbo-adapter-1.8.0.jar:na]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:89) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:46) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:77) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:129) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:152) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:41) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:145) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:100) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:175) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:51) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:57) ~[dubbo-2.7.8.jar:2.7.8]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_211]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_211]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_211]2022-04-06 17:08:23.618 ERROR 4870 --- [nio-8081-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.apache.dubbo.rpc.RpcException: 出错了] with root causeorg.apache.dubbo.rpc.RpcException: 出错了at com.example.demo.service.impl.HelloServiceImpl.hello(HelloServiceImpl.java:12) ~[na:na]at org.apache.dubbo.common.bytecode.Wrapper3.invokeMethod(Wrapper3.java) ~[na:na]at org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:47) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:84) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:56) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:56) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:52) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at com.alibaba.csp.sentinel.adapter.dubbo.SentinelDubboProviderFilter.invoke(SentinelDubboProviderFilter.java:80) ~[sentinel-apache-dubbo-adapter-1.8.0.jar:na]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:89) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:46) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:77) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:129) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:152) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:41) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:83) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:145) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:100) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:175) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:51) ~[dubbo-2.7.8.jar:2.7.8]at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:57) ~[dubbo-2.7.8.jar:2.7.8]at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_211]at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_211]at java.lang.Thread.run(Thread.java:748) [na:1.8.0_211]2022-04-06 17:08:23.640 ERROR 4870 --- [nio-8081-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: SentinelBlockException: DegradeException] with root causejava.lang.RuntimeException: SentinelBlockException: DegradeExceptionat com.alibaba.csp.sentinel.slots.block.BlockException.block(BlockException:0) ~[sentinel-core-1.8.0.jar:1.8.0]2022-04-06 17:08:23.644 ERROR 4870 --- [nio-8081-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: SentinelBlockException: DegradeException] with root causejava.lang.RuntimeException: SentinelBlockException: DegradeExceptionat com.alibaba.csp.sentinel.slots.block.BlockException.block(BlockException:0) ~[sentinel-core-1.8.0.jar:1.8.0]2022-04-06 17:08:23.649 ERROR 4870 --- [nio-8081-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: SentinelBlockException: DegradeException] with root causejava.lang.RuntimeException: SentinelBlockException: DegradeExceptionat com.alibaba.csp.sentinel.slots.block.BlockException.block(BlockException:0) ~[sentinel-core-1.8.0.jar:1.8.0]2022-04-06 17:08:23.653 ERROR 4870 --- [nio-8081-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: SentinelBlockException: DegradeException] with root causejava.lang.RuntimeException: SentinelBlockException: DegradeExceptionat com.alibaba.csp.sentinel.slots.block.BlockException.block(BlockException:0) ~[sentinel-core-1.8.0.jar:1.8.0]2022-04-06 17:08:23.658 ERROR 4870 --- [io-8081-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: SentinelBlockException: DegradeException] with root causejava.lang.RuntimeException: SentinelBlockException: DegradeExceptionat com.alibaba.csp.sentinel.slots.block.BlockException.block(BlockException:0) ~[sentinel-core-1.8.0.jar:1.8.0]

说明:前5次输出RpcException,后5次由于触发熔断降级,抛出DegradeException

           

**********

dubbo mock降级

         

HelloServiceMock

public class HelloServiceMock implements HelloService {@Overridepublic String hello() {return "调用出错,本地降级";}
}

          

HelloController

@RestController
public class HelloController {//@DubboReference@DubboReference(mock = "true")private HelloService helloService;@RequestMapping("/hello")public String hello(){System.out.println(helloService.hello());return "success";}
}

             

查看结果树

                 

                   

# 消费端控制台输出
2022-04-06 17:04:08.691  INFO 4800 --- [           main] com.example.demo.DemoApplication         : Started DemoApplication in 3.907 seconds (JVM running for 4.626)
2022-04-06 17:04:09.611  WARN 4800 --- [client.listener] a.c.d.m.r.DubboServiceMetadataRepository : Current application will subscribe all services(size:2) in registry, a lot of memory and CPU cycles may be used, thus it's strongly recommend you using the externalized property 'dubbo.cloud.subscribed-services' to specify the services
2022-04-06 17:04:11.063  INFO 4800 --- [erverWorker-4-1] o.a.d.r.t.netty4.NettyServerHandler      :  [DUBBO] The connection of /192.168.5.9:54787 -> /192.168.5.9:20881 is established., dubbo version: 2.7.8, current host: 192.168.5.9
2022-04-06 17:04:11.654  INFO 4800 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-04-06 17:04:11.654  INFO 4800 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-04-06 17:04:11.668  INFO 4800 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 14 ms
调用出错,本地降级
调用出错,本地降级
调用出错,本地降级
调用出错,本地降级
调用出错,本地降级
2022-04-06 17:04:11.777 ERROR 4800 --- [nio-8081-exec-5] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: SentinelBlockException: DegradeException] with root causejava.lang.RuntimeException: SentinelBlockException: DegradeExceptionat com.alibaba.csp.sentinel.slots.block.BlockException.block(BlockException:0) ~[sentinel-core-1.8.0.jar:1.8.0]2022-04-06 17:04:11.795 ERROR 4800 --- [nio-8081-exec-6] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: SentinelBlockException: DegradeException] with root causejava.lang.RuntimeException: SentinelBlockException: DegradeExceptionat com.alibaba.csp.sentinel.slots.block.BlockException.block(BlockException:0) ~[sentinel-core-1.8.0.jar:1.8.0]2022-04-06 17:04:11.800 ERROR 4800 --- [nio-8081-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: SentinelBlockException: DegradeException] with root causejava.lang.RuntimeException: SentinelBlockException: DegradeExceptionat com.alibaba.csp.sentinel.slots.block.BlockException.block(BlockException:0) ~[sentinel-core-1.8.0.jar:1.8.0]2022-04-06 17:04:11.805 ERROR 4800 --- [nio-8081-exec-8] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: SentinelBlockException: DegradeException] with root causejava.lang.RuntimeException: SentinelBlockException: DegradeExceptionat com.alibaba.csp.sentinel.slots.block.BlockException.block(BlockException:0) ~[sentinel-core-1.8.0.jar:1.8.0]2022-04-06 17:04:11.809 ERROR 4800 --- [nio-8081-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: SentinelBlockException: DegradeException] with root causejava.lang.RuntimeException: SentinelBlockException: DegradeExceptionat com.alibaba.csp.sentinel.slots.block.BlockException.block(BlockException:0) ~[sentinel-core-1.8.0.jar:1.8.0]

说明:前5次请求服务端抛出RpcExeption,消费端使用mock降级;后5次由于消费端触发sentinel熔断,直接抛出DegradeException

          

                  


http://chatgpt.dhexx.cn/article/WKnryTFF.shtml

相关文章

kong网关熔断插件

Request Termination经常被作为kong的熔断器使用。以下在自建的konga管理界面里进行了测试配置 配置参数如下&#xff1a; 客户端发起请求&#xff0c;可以通过response进行验证&#xff0c;可以看到响应的状态码和报文都能生效。 以上配置是基于kong 0.12.3&#xff0c;可…

服务熔断的实现

# 0.服务熔断的实现思路 - 引入hystrix依赖,并开启熔断器(断路器) - 模拟降级方法 - 进行调用测试 # 1.项目中引入hystrix依赖 <!--引入hystrix--> <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-start…

熔断

我们知道&#xff0c;如果一个软件系统的并发请求数目超过了系统的最佳线程数&#xff0c;那么就会导致激烈的资源竞争&#xff0c;随着资源的匮乏甚至枯竭&#xff0c;整个系统也就面临着灾难。所以&#xff0c;很多软件系统为了保证即使在出现并发用户数>最佳线程数时&…

什么是服务熔断?

一、什么是服务熔断&#xff1f; 考试过程中当断则断的方式&#xff0c;正好符合微服务架构中的一种安全机制&#xff1a;【熔断】 熔断这一概念来源于电子工程中的断路器&#xff08;Circuit Breaker&#xff09;。 在互联网系统中&#xff0c;当下游服务因访问压力过大而响应…

熔断原理分析与源码解读

熔断机制&#xff08;Circuit Breaker&#xff09;指的是在股票市场的交易时间中&#xff0c;当价格的波动幅度达到某一个限定的目标&#xff08;熔断点&#xff09;时&#xff0c;对其暂停交易一段时间的机制。此机制如同保险丝在电流过大时候熔断&#xff0c;故而得名。熔断机…

【C++程序设计语言A视频教程 全12讲 中科院】【下载链接】

C程序设计语言A视频教程 全12讲 中科院 这个是我在淘宝上面买的 杨力祥老师的教程~~ 奉献给大家~~~ *************************************************************************************************************************************** 下面是网上对杨力祥老师的…

国科大杨力祥老师操作系统答案总结

基于网上搜索的版本以及历届师兄的版本&#xff0c;进行了整合和修改 对应参考书籍如下&#xff0c;对应P页数也是指该书的页数。 1.为什么开始启动计算机的时候&#xff0c;执行的是BIOS代码而不是操作系统自身的代码&#xff1f; 最开始启动计算机的时候&#xff0c;计算机…

简述Mean shift 算法及其实现

文章目录 Mean shift 是什么Mean shift 算法的预备知识什么是特征什么是特征空间什么是核密度估计核函数的表示 Mean shift 算法Mean shift算法的公式推导Mean shift算法的流程Mean shift算法图示 Mean shift 算法应用Mean Shift 算法应用在聚类Mean Shift 算法图像分割 Mean s…

Johnson-Trotter算法求全排列

下面我将贴出Johnson-Trotter算法的JAVA代码 package JT;import java.util.Scanner;public class Johnson_Trotter {//求最大的移动元素public static int maxk(int n, int[] array, boolean[] f) {//k存储最大移动元素的下标int k -1, max 0;for(int i 0; i < n; i) {/…

全源最短路Johnson算法

最短路Johnson算法( O ( n m l o g m ) O(nmlogm) O(nmlogm)) 可以求任意两点最短路&#xff0c; 新图的边权改造为&#xff1a; w ( x , y ) h ( x ) − h ( y ) w(x,y)h(x)-h(y) w(x,y)h(x)−h(y) 构造的新图 d 1 ( x , y ) d ( x , y ) h ( x ) − h ( y ) d1(x,y)d(x,y…

流水线作业调度问题-动态规划(运用Johnson算法)

问题描述 n个作业{1&#xff0c;2&#xff0c;…&#xff0c;n},要在由机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工&#xff0c;然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi。 要求确定这n个作业的最优加工顺序&#xff0c;使得从第一…

【随机算法】Johnson-Lindenstrauss Theorem 详细解读

前言 最近经常接触降维, 主要是做图像处理和视频处理的维度实在是比较多, 降维这个可真是真正的技术活儿, 而且在不同情况下降维的选择至关重要, 可以说会影响到最终的结果,今天主要是详细讲解一下其中一种当今的降维准则. Johnson-Lindenstrauss Theorem的问题定义 首先, JL要…

最短路径算法--Dijkstra算法,Bellmanford算法,Floyd算法,Johnson算法

最短路径算法 在交通地图上&#xff0c;两地点之间的路径通常标有长度&#xff0c;我们可以用加权有向来描述地图上的交通网。加权有向图中每条路径都有一个路径权值&#xff0c;大小为该路径上所有边的权值之和。本节将重点讨论顶点之间最短路径问题。在实际问题中&#xff0c…

在有向图中找出所有简单环--Johnson算法

注&#xff1a;本算法和计算图所有结点对最短路径的Johnson算法不同。 目录 综述 代码解析 实例解析 引用 综述 Johnson算法由B. Johnson发表于1975年&#xff0c;用于在一个有向图中寻找所有简单环。时间复杂度上界为O((ne)(c1))&#xff0c;空间复杂度为O(ne)&#xff0…

C#,图论与图算法,寻找加权有向图中所有顶点对之间的最短路径的约翰逊算法(Johnson‘s Algorithm)与源程序

一、最短路径问题 问题是找到给定加权有向图中每对顶点之间的最短路径&#xff0c;权重可能为负。我们已经讨论了这个问题的Floyd-Warshall算法。Floyd-Warshall算法的时间复杂度为Θ&#xff08;V3&#xff09;。利用Johnson算法&#xff0c;我们可以在O&#xff08;V2log VV…

最短路径算法——Dijkstra,Bellman-Ford,Floyd-Warshall,Johnson

本文内容框架&#xff1a; 1 Dijkstra算法 2 Bellman-Ford算法 3 Floyd-Warshall算法 4 Johnson算算法 5 问题归约 6 小结 常用的最短路径算法有&#xff1a;Dijkstra算法、Bellman-Ford算法、Floyd-Warshall算法、Johnson算法 最短路径算法可以分为单源点最短路径和全源最短路…

0018算法笔记——【动态规划】流水作业调度问题与Johnson法则

1、问题描述&#xff1a; n个作业{1&#xff0c;2&#xff0c;…&#xff0c;n}要在由2台机器M1和M2组成的流水线上完成加工。每个作业加工的顺序都是先在M1上加工&#xff0c;然后在M2上加工。M1和M2加工作业i所需的时间分别为ai和bi。流水作业调度问题要求确定这n个作业的…

转:johnson算法的现实意义

Johnson算法是一种用于解决边数与节点数之间关系为O(n^2)的带权图的最短路径问题的算法。它是一种结合了Dijkstra算法和Bellman-Ford算法的技术&#xff0c;通过使用一个负权重的环检测器来消除负权重的影响。这种算法的时间复杂度为O(n^2m log n)。 Johnson算法是一种用于解决…

软件定义网络SDN基础实验:MiniNet常用命令、创建网络拓扑、OpenFlow流表操作

此实验基于《软件定义网络实验1-5》&#xff0c;主要内容为&#xff1a; MiniNet常用命令如何创建网络拓扑OpenFlow流表操作 00x1 搭建SDN环境 SDN 环境配置&#xff1a;Mininet Ryu 1. 测试环境是否搭建成功 启动Ryu&#xff0c;进入 /ryu/app&#xff0c;启动一个交换机…