修复熔断失效的问题

This commit is contained in:
Wxx 2024-07-28 22:53:33 +08:00
parent 1ddaaa068a
commit 87fc0e66b5
4 changed files with 12 additions and 4 deletions

View File

@ -16,8 +16,11 @@ public class TestClient {
public static void main(String[] args) throws InterruptedException { public static void main(String[] args) throws InterruptedException {
ClientProxy clientProxy=new ClientProxy(); ClientProxy clientProxy=new ClientProxy();
UserService proxy=clientProxy.getProxy(UserService.class); UserService proxy=clientProxy.getProxy(UserService.class);
for(int i = 0; i < 15; i++) { for(int i = 0; i < 120; i++) {
Integer i1 = i; Integer i1 = i;
if (i%30==0) {
Thread.sleep(10000);
}
new Thread(()->{ new Thread(()->{
try{ try{
User user = proxy.getUserByUserId(i1); User user = proxy.getUserByUserId(i1);

View File

@ -30,6 +30,7 @@ public class CircuitBreaker {
//查看当前熔断器是否允许请求通过 //查看当前熔断器是否允许请求通过
public synchronized boolean allowRequest() { public synchronized boolean allowRequest() {
long currentTime = System.currentTimeMillis(); long currentTime = System.currentTimeMillis();
System.out.println("熔断swtich之前!!!!!!!+failureNum=="+failureCount);
switch (state) { switch (state) {
case OPEN: case OPEN:
if (currentTime - lastFailureTime > retryTimePeriod) { if (currentTime - lastFailureTime > retryTimePeriod) {
@ -37,6 +38,7 @@ public class CircuitBreaker {
resetCounts(); resetCounts();
return true; return true;
} }
System.out.println("熔断生效!!!!!!!");
return false; return false;
case HALF_OPEN: case HALF_OPEN:
requestCount.incrementAndGet(); requestCount.incrementAndGet();
@ -61,6 +63,7 @@ public class CircuitBreaker {
//记录失败 //记录失败
public synchronized void recordFailure() { public synchronized void recordFailure() {
failureCount.incrementAndGet(); failureCount.incrementAndGet();
System.out.println("记录失败!!!!!!!失败次数"+failureCount);
lastFailureTime = System.currentTimeMillis(); lastFailureTime = System.currentTimeMillis();
if (state == CircuitBreakerState.HALF_OPEN) { if (state == CircuitBreakerState.HALF_OPEN) {
state = CircuitBreakerState.OPEN; state = CircuitBreakerState.OPEN;

View File

@ -11,12 +11,14 @@ import java.util.Map;
public class CircuitBreakerProvider { public class CircuitBreakerProvider {
private Map<String,CircuitBreaker> circuitBreakerMap=new HashMap<>(); private Map<String,CircuitBreaker> circuitBreakerMap=new HashMap<>();
public CircuitBreaker getCircuitBreaker(String serviceName){ public synchronized CircuitBreaker getCircuitBreaker(String serviceName){
CircuitBreaker circuitBreaker; CircuitBreaker circuitBreaker;
if(circuitBreakerMap.containsKey(serviceName)){ if(circuitBreakerMap.containsKey(serviceName)){
circuitBreaker=circuitBreakerMap.get(serviceName); circuitBreaker=circuitBreakerMap.get(serviceName);
}else { }else {
circuitBreaker=new CircuitBreaker(3,0.5,10000); System.out.println("serviceName="+serviceName+"创建一个新的熔断器");
circuitBreaker=new CircuitBreaker(1,0.5,10000);
circuitBreakerMap.put(serviceName,circuitBreaker);
} }
return circuitBreaker; return circuitBreaker;
} }

View File

@ -52,7 +52,7 @@ public class ClientProxy implements InvocationHandler {
//后续添加逻辑为保持幂等性只对白名单上的服务进行重试 //后续添加逻辑为保持幂等性只对白名单上的服务进行重试
if (serviceCenter.checkRetry(request.getInterfaceName())){ if (serviceCenter.checkRetry(request.getInterfaceName())){
//调用retry框架进行重试操作 //调用retry框架进行重试操作
response=new guavaRetry().sendServiceWithRetry(request,rpcClient); response = new guavaRetry().sendServiceWithRetry(request, rpcClient);
}else { }else {
//只调用一次 //只调用一次
response= rpcClient.sendRequest(request); response= rpcClient.sendRequest(request);