From 87fc0e66b545b994282f3b2222165665d9f8f23f Mon Sep 17 00:00:00 2001 From: Wxx <2563806166@qq.com> Date: Sun, 28 Jul 2024 22:53:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=86=94=E6=96=AD=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- version4/src/main/java/part1/Client/TestClient.java | 5 ++++- .../java/part1/Client/circuitBreaker/CircuitBreaker.java | 3 +++ .../part1/Client/circuitBreaker/CircuitBreakerProvider.java | 6 ++++-- version4/src/main/java/part1/Client/proxy/ClientProxy.java | 2 +- 4 files changed, 12 insertions(+), 4 deletions(-) diff --git a/version4/src/main/java/part1/Client/TestClient.java b/version4/src/main/java/part1/Client/TestClient.java index f622d11..ea18b2a 100644 --- a/version4/src/main/java/part1/Client/TestClient.java +++ b/version4/src/main/java/part1/Client/TestClient.java @@ -16,8 +16,11 @@ public class TestClient { public static void main(String[] args) throws InterruptedException { ClientProxy clientProxy=new ClientProxy(); UserService proxy=clientProxy.getProxy(UserService.class); - for(int i = 0; i < 15; i++) { + for(int i = 0; i < 120; i++) { Integer i1 = i; + if (i%30==0) { + Thread.sleep(10000); + } new Thread(()->{ try{ User user = proxy.getUserByUserId(i1); diff --git a/version4/src/main/java/part1/Client/circuitBreaker/CircuitBreaker.java b/version4/src/main/java/part1/Client/circuitBreaker/CircuitBreaker.java index d7b15d5..7dfba5b 100644 --- a/version4/src/main/java/part1/Client/circuitBreaker/CircuitBreaker.java +++ b/version4/src/main/java/part1/Client/circuitBreaker/CircuitBreaker.java @@ -30,6 +30,7 @@ public class CircuitBreaker { //查看当前熔断器是否允许请求通过 public synchronized boolean allowRequest() { long currentTime = System.currentTimeMillis(); + System.out.println("熔断swtich之前!!!!!!!+failureNum=="+failureCount); switch (state) { case OPEN: if (currentTime - lastFailureTime > retryTimePeriod) { @@ -37,6 +38,7 @@ public class CircuitBreaker { resetCounts(); return true; } + System.out.println("熔断生效!!!!!!!"); return false; case HALF_OPEN: requestCount.incrementAndGet(); @@ -61,6 +63,7 @@ public class CircuitBreaker { //记录失败 public synchronized void recordFailure() { failureCount.incrementAndGet(); + System.out.println("记录失败!!!!!!!失败次数"+failureCount); lastFailureTime = System.currentTimeMillis(); if (state == CircuitBreakerState.HALF_OPEN) { state = CircuitBreakerState.OPEN; diff --git a/version4/src/main/java/part1/Client/circuitBreaker/CircuitBreakerProvider.java b/version4/src/main/java/part1/Client/circuitBreaker/CircuitBreakerProvider.java index 7ce3649..527401f 100644 --- a/version4/src/main/java/part1/Client/circuitBreaker/CircuitBreakerProvider.java +++ b/version4/src/main/java/part1/Client/circuitBreaker/CircuitBreakerProvider.java @@ -11,12 +11,14 @@ import java.util.Map; public class CircuitBreakerProvider { private Map circuitBreakerMap=new HashMap<>(); - public CircuitBreaker getCircuitBreaker(String serviceName){ + public synchronized CircuitBreaker getCircuitBreaker(String serviceName){ CircuitBreaker circuitBreaker; if(circuitBreakerMap.containsKey(serviceName)){ circuitBreaker=circuitBreakerMap.get(serviceName); }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; } diff --git a/version4/src/main/java/part1/Client/proxy/ClientProxy.java b/version4/src/main/java/part1/Client/proxy/ClientProxy.java index 5de3e11..9f90383 100644 --- a/version4/src/main/java/part1/Client/proxy/ClientProxy.java +++ b/version4/src/main/java/part1/Client/proxy/ClientProxy.java @@ -52,7 +52,7 @@ public class ClientProxy implements InvocationHandler { //后续添加逻辑:为保持幂等性,只对白名单上的服务进行重试 if (serviceCenter.checkRetry(request.getInterfaceName())){ //调用retry框架进行重试操作 - response=new guavaRetry().sendServiceWithRetry(request,rpcClient); + response = new guavaRetry().sendServiceWithRetry(request, rpcClient); }else { //只调用一次 response= rpcClient.sendRequest(request);