diff --git a/governance/src/main/java/org/apache/servicecomb/governance/handler/BulkheadHandler.java b/governance/src/main/java/org/apache/servicecomb/governance/handler/BulkheadHandler.java
index fea76a6..1b32119 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/handler/BulkheadHandler.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/handler/BulkheadHandler.java
@@ -49,7 +49,7 @@
   }
 
   @Override
-  protected Bulkhead createProcessor(GovernanceRequest governanceRequest, BulkheadPolicy policy) {
+  public Bulkhead createProcessor(GovernanceRequest governanceRequest, BulkheadPolicy policy) {
     return getBulkhead(policy);
   }
 
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/handler/CircuitBreakerHandler.java b/governance/src/main/java/org/apache/servicecomb/governance/handler/CircuitBreakerHandler.java
index 65f2711..9120ef9 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/handler/CircuitBreakerHandler.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/handler/CircuitBreakerHandler.java
@@ -55,7 +55,7 @@
   }
 
   @Override
-  protected CircuitBreaker createProcessor(GovernanceRequest governanceRequest, CircuitBreakerPolicy policy) {
+  public CircuitBreaker createProcessor(GovernanceRequest governanceRequest, CircuitBreakerPolicy policy) {
     return getCircuitBreaker(policy);
   }
 
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/handler/InstanceIsolationHandler.java b/governance/src/main/java/org/apache/servicecomb/governance/handler/InstanceIsolationHandler.java
index ade1987..aba959a 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/handler/InstanceIsolationHandler.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/handler/InstanceIsolationHandler.java
@@ -83,7 +83,7 @@
   }
 
   @Override
-  protected CircuitBreaker createProcessor(GovernanceRequest governanceRequest, CircuitBreakerPolicy policy) {
+  public CircuitBreaker createProcessor(GovernanceRequest governanceRequest, CircuitBreakerPolicy policy) {
     return getCircuitBreaker(governanceRequest, policy);
   }
 
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/handler/RateLimitingHandler.java b/governance/src/main/java/org/apache/servicecomb/governance/handler/RateLimitingHandler.java
index aa3ee9f..ab5795b 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/handler/RateLimitingHandler.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/handler/RateLimitingHandler.java
@@ -48,7 +48,7 @@
   }
 
   @Override
-  protected RateLimiter createProcessor(GovernanceRequest governanceRequest, RateLimitingPolicy policy) {
+  public RateLimiter createProcessor(GovernanceRequest governanceRequest, RateLimitingPolicy policy) {
     return getRateLimiter(policy);
   }
 
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/handler/RetryHandler.java b/governance/src/main/java/org/apache/servicecomb/governance/handler/RetryHandler.java
index 42898c5..a47545e 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/handler/RetryHandler.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/handler/RetryHandler.java
@@ -55,7 +55,7 @@
   }
 
   @Override
-  protected Retry createProcessor(GovernanceRequest governanceRequest, RetryPolicy policy) {
+  public Retry createProcessor(GovernanceRequest governanceRequest, RetryPolicy policy) {
     return getRetry(policy);
   }
 
@@ -67,6 +67,7 @@
         .retryOnResult(response -> retryExtension.isRetry(retryPolicy.getRetryOnResponseStatus(), response))
         .retryOnException(e -> retryExtension.isRetry(e))
         .intervalFunction(getIntervalFunction(retryPolicy))
+        .failAfterMaxAttempts(retryPolicy.isFailAfterMaxAttempts())
         .build();
 
     RetryRegistry registry = RetryRegistry.of(config);
diff --git a/governance/src/main/java/org/apache/servicecomb/governance/policy/RetryPolicy.java b/governance/src/main/java/org/apache/servicecomb/governance/policy/RetryPolicy.java
index cd6bbc3..a4b786b 100644
--- a/governance/src/main/java/org/apache/servicecomb/governance/policy/RetryPolicy.java
+++ b/governance/src/main/java/org/apache/servicecomb/governance/policy/RetryPolicy.java
@@ -16,13 +16,13 @@
  */
 package org.apache.servicecomb.governance.policy;
 
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.util.CollectionUtils;
-
 import java.time.Duration;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.CollectionUtils;
+
 public class RetryPolicy extends AbstractPolicy {
 
   public static final int DEFAULT_MAX_ATTEMPTS = 3;
@@ -39,23 +39,29 @@
 
   private static final String DEFAULT_RETRY_STRATEGY = "FixedInterval";
 
-  //最多尝试次数
+  //max retry attempts
   private int maxAttempts = DEFAULT_MAX_ATTEMPTS;
 
-  //每次重试尝试等待的时间。
+  //wait duration for each retry
   private String waitDuration = DEFAULT_WAIT_DURATION.toString();
 
-  //需要重试的http status, 逗号分隔
+  //status code that need retry
   private List<String> retryOnResponseStatus = new ArrayList<>();
 
+  //retry strategy
   private String retryStrategy = DEFAULT_RETRY_STRATEGY;
 
+  // initial interval for backoff retry
   private String initialInterval = INITIAL_INTERVAL.toString();
 
+  // multiplier for backoff retry
   private float multiplier = MULTIPLIER;
 
+  // randomization factor for backoff retry
   private double randomizationFactor = RANDOMIZATION_FACTOR;
 
+  private boolean failAfterMaxAttempts = false;
+
   public List<String> getRetryOnResponseStatus() {
     if (CollectionUtils.isEmpty(retryOnResponseStatus)) {
       this.retryOnResponseStatus.add(DEFAULT_RETRY_ON_RESPONSE_STATUS);
@@ -118,6 +124,15 @@
     this.randomizationFactor = randomizationFactor;
   }
 
+  public boolean isFailAfterMaxAttempts() {
+    return failAfterMaxAttempts;
+  }
+
+  public RetryPolicy setFailAfterMaxAttempts(boolean failAfterMaxAttempts) {
+    this.failAfterMaxAttempts = failAfterMaxAttempts;
+    return this;
+  }
+
   @Override
   public boolean isValid() {
     if (maxAttempts < 1) {
diff --git a/governance/src/test/java/org/apache/servicecomb/governance/CircuitBreakerHandlerTest.java b/governance/src/test/java/org/apache/servicecomb/governance/CircuitBreakerHandlerTest.java
new file mode 100644
index 0000000..80c4e61
--- /dev/null
+++ b/governance/src/test/java/org/apache/servicecomb/governance/CircuitBreakerHandlerTest.java
@@ -0,0 +1,83 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.servicecomb.governance;
+
+import org.apache.servicecomb.governance.handler.RetryHandler;
+import org.apache.servicecomb.governance.handler.ext.RetryExtension;
+import org.apache.servicecomb.governance.marker.GovernanceRequest;
+import org.apache.servicecomb.governance.policy.RetryPolicy;
+import org.apache.servicecomb.governance.properties.RetryProperties;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+import org.mockito.Mockito;
+
+import io.github.resilience4j.retry.MaxRetriesExceededException;
+import io.github.resilience4j.retry.Retry;
+
+public class CircuitBreakerHandlerTest {
+  @Test
+  public void testNotFailAfterMaxAttemptsWhenThrow() {
+    RetryExtension retryExtension = Mockito.mock(RetryExtension.class);
+    RetryProperties retryProperties = Mockito.mock(RetryProperties.class);
+    GovernanceRequest governanceRequest = Mockito.mock(GovernanceRequest.class);
+    Mockito.when(retryExtension.isRetry(Mockito.any())).thenReturn(true);
+
+    RetryPolicy retryPolicy = new RetryPolicy();
+    retryPolicy.setName("test");
+    retryPolicy.setFailAfterMaxAttempts(false);
+    RetryHandler retryHandler = new RetryHandler(retryProperties, retryExtension);
+
+    Retry retry = retryHandler.createProcessor(governanceRequest, retryPolicy);
+    Assertions.assertThrows(IllegalStateException.class, () -> retry.<Integer>executeCheckedSupplier(() -> {
+      throw new IllegalStateException();
+    }));
+  }
+
+  @Test
+  public void testFailAfterMaxAttemptsWhenThrow() {
+    RetryExtension retryExtension = Mockito.mock(RetryExtension.class);
+    RetryProperties retryProperties = Mockito.mock(RetryProperties.class);
+    GovernanceRequest governanceRequest = Mockito.mock(GovernanceRequest.class);
+    Mockito.when(retryExtension.isRetry(Mockito.any())).thenReturn(true);
+
+    RetryPolicy retryPolicy = new RetryPolicy();
+    retryPolicy.setName("test");
+    retryPolicy.setFailAfterMaxAttempts(true);
+    RetryHandler retryHandler = new RetryHandler(retryProperties, retryExtension);
+
+    Retry retry = retryHandler.createProcessor(governanceRequest, retryPolicy);
+    Assertions.assertThrows(IllegalStateException.class, () -> retry.<Integer>executeCheckedSupplier(() -> {
+      throw new IllegalStateException();
+    }));
+  }
+
+  @Test
+  public void testFailAfterMaxAttemptsOnResult() {
+    RetryExtension retryExtension = Mockito.mock(RetryExtension.class);
+    RetryProperties retryProperties = Mockito.mock(RetryProperties.class);
+    GovernanceRequest governanceRequest = Mockito.mock(GovernanceRequest.class);
+    Mockito.when(retryExtension.isRetry(Mockito.any(), Mockito.any())).thenReturn(true);
+
+    RetryPolicy retryPolicy = new RetryPolicy();
+    retryPolicy.setName("test");
+    retryPolicy.setFailAfterMaxAttempts(true);
+    RetryHandler retryHandler = new RetryHandler(retryProperties, retryExtension);
+
+    Retry retry = retryHandler.createProcessor(governanceRequest, retryPolicy);
+    Assertions.assertThrows(MaxRetriesExceededException.class, () -> retry.<Integer>executeCheckedSupplier(() -> -1));
+  }
+}
