修复熔断失效的问题
This commit is contained in:
parent
1ddaaa068a
commit
87fc0e66b5
@ -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);
|
||||||
|
|||||||
@ -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;
|
||||||
|
|||||||
@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user