一. 示例demo
1. maven依赖
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-circuitbreaker</artifactId>
<version>0.13.2</version>
</dependency>
2. ServerB
public class ServerB {
private CircuitBreakerRegistry breakerRegistry;
private ServerC serverC = new ServerC();
ServerB() {
breakerRegistry = CircuitBreakerRegistry.of(CircuitBreakerConfig.custom()
.enableAutomaticTransitionFromOpenToHalfOpen()
.failureRateThreshold(50)
.ringBufferSizeInClosedState(100)
.ringBufferSizeInHalfOpenState(10)
.waitDurationInOpenState(Duration.ofMillis(1000L))
.build());
}
public String getCInfo(int id) {
CircuitBreaker breaker = breakerRegistry.circuitBreaker("getCInfo");
try {
return breaker.executeCallable(() -> serverC.getCInfo(id));
} catch (CircuitBreakerOpenException e) {
return "服务C出错,触发服务B的降级逻辑";
} catch (Exception e) {
return "调用服务C出错";
}
}
public CircuitBreaker getBreaker() {
return breakerRegistry.circuitBreaker("getCInfo");
}
}
3. ServerC
public class ServerC {
public String getCInfo(int id) {
if (id == 0) {
throw new RuntimeException("输入0异常");
}
return "id=" + id + "的C信息";
}
}
4. Test01
public class Test01 {
private static ServerB serverB = new ServerB();
public static void main(String[] args) throws Exception {
testBreak();
}
public static void testBreak() throws Exception {
for (int i = 0; i < 100; i++) {
if (i < 50) {
serverB.getCInfo(0);
} else {
serverB.getCInfo(1);
}
}
System.out.println(serverB.getBreaker().getState().equals(CircuitBreaker.State.OPEN));
System.out.println(serverB.getCInfo(1));
System.out.println("-----------我是分隔符------------");
Thread.sleep(500L);
System.out.println(serverB.getBreaker().getState().equals(CircuitBreaker.State.OPEN));
Thread.sleep(500L);
System.out.println(serverB.getBreaker().getState().equals(CircuitBreaker.State.HALF_OPEN));
System.out.println(serverB.getCInfo(1));
System.out.println(serverB.getCInfo(0));
System.out.println("-----------我是分隔符------------");
for (int i = 0; i < 10; i++) {
if (i < 4) {
serverB.getCInfo(0);
} else {
serverB.getCInfo(1);
}
}
System.out.println(serverB.getBreaker().getState().equals(CircuitBreaker.State.OPEN));
System.out.println(serverB.getCInfo(1));
System.out.println("-----------我是分隔符------------");
Thread.sleep(1000L);
for (int i = 0; i < 10; i++) {
if (i < 6) {
serverB.getCInfo(1);
} else {
serverB.getCInfo(0);
}
}
System.out.println(serverB.getBreaker().getState().equals(CircuitBreaker.State.CLOSED));
System.out.println(serverB.getCInfo(1));
System.out.println(serverB.getCInfo(0));
System.out.println("-----------我是分隔符------------");
}
}
5. Test02
public class Test02 {
private static ServerB serverB = new ServerB();
public static void main(String[] args) throws Exception {
testRate2();
}
public static void testRate1() {
for (int i = 0; i < 100; i++) {
if (i < 49) {
serverB.getCInfo(0);
} else {
serverB.getCInfo(1);
}
}
System.out.println(serverB.getBreaker().getState().equals(CircuitBreaker.State.CLOSED));
serverB.getCInfo(0);
System.out.println(serverB.getBreaker().getState().equals(CircuitBreaker.State.CLOSED));
}
public static void testRate2() throws InterruptedException {
for (int i = 0; i < 100; i++) {
if (i != 0 && i < 50) {
serverB.getCInfo(0);
} else {
serverB.getCInfo(1);
}
}
System.out.println(serverB.getBreaker().getState().equals(CircuitBreaker.State.CLOSED));
serverB.getCInfo(0);
System.out.println(serverB.getBreaker().getState().equals(CircuitBreaker.State.OPEN));
}
}