diff --git a/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/main/java/com/alibaba/cloud/circuitbreaker/sentinel/feign/FeignClientCircuitNameResolver.java b/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/main/java/com/alibaba/cloud/circuitbreaker/sentinel/feign/FeignClientCircuitNameResolver.java index 208e2f05f..2d749f186 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/main/java/com/alibaba/cloud/circuitbreaker/sentinel/feign/FeignClientCircuitNameResolver.java +++ b/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/main/java/com/alibaba/cloud/circuitbreaker/sentinel/feign/FeignClientCircuitNameResolver.java @@ -13,39 +13,47 @@ import org.springframework.cloud.openfeign.CircuitBreakerNameResolver; /** * Feign client circuit breaker name resolver. * - *

note: spring cloud openfeign version need greater than 3.0.4. + *

+ * note: spring cloud openfeign version need greater than 3.0.4. * * @author freeman * @see CircuitBreakerNameResolver */ public class FeignClientCircuitNameResolver implements CircuitBreakerNameResolver { - private Map configurations; - - public FeignClientCircuitNameResolver(AbstractCircuitBreakerFactory factory) { - configurations = getConfigurations(factory); - } - - @Override - public String resolveCircuitBreakerName(String feignClientName, - Target target, Method method) { - String key = Feign.configKey(target.type(), method); - - if (configurations != null && configurations.containsKey(key)) { - return key; - } - - return feignClientName; - } - - private Map getConfigurations(AbstractCircuitBreakerFactory factory) { - try { - Method getConfigurations = AbstractCircuitBreakerFactory.class.getDeclaredMethod("getConfigurations"); - getConfigurations.setAccessible(true); - return (Map) getConfigurations.invoke(factory); - } catch (Exception ignored) { - } - return Collections.emptyMap(); - } + private final Map configurations; + + public FeignClientCircuitNameResolver(AbstractCircuitBreakerFactory factory) { + configurations = getConfigurations(factory); + } + + @Override + public String resolveCircuitBreakerName(String feignClientName, Target target, + Method method) { + String key = getKey(feignClientName, target, method); + + if (configurations != null && configurations.containsKey(key)) { + return key; + } + + return feignClientName; + } + + private String getKey(String feignClientName, Target target, Method method) { + String key = Feign.configKey(target.type(), method); + return feignClientName + key.substring(key.indexOf('#')); + } + + private Map getConfigurations(AbstractCircuitBreakerFactory factory) { + try { + Method getConfigurations = AbstractCircuitBreakerFactory.class + .getDeclaredMethod("getConfigurations"); + getConfigurations.setAccessible(true); + return (Map) getConfigurations.invoke(factory); + } + catch (Exception ignored) { + } + return Collections.emptyMap(); + } } diff --git a/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/feign/FeignClientCircuitBreakerRuleIntegrationTest.java b/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/feign/FeignClientCircuitBreakerRuleIntegrationTest.java index e4569ae57..f86735634 100644 --- a/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/feign/FeignClientCircuitBreakerRuleIntegrationTest.java +++ b/spring-cloud-alibaba-starters/spring-cloud-circuitbreaker-sentinel/src/test/java/com/alibaba/cloud/circuitbreaker/sentinel/feign/FeignClientCircuitBreakerRuleIntegrationTest.java @@ -50,11 +50,11 @@ import static org.springframework.boot.test.context.SpringBootTest.WebEnvironmen "feign.sentinel.rules.user[0].timeWindow=1", "feign.sentinel.rules.user[0].statIntervalMs=1000", "feign.sentinel.rules.user[0].minRequestAmount=5", - "feign.sentinel.rules.[UserClient#specificFeignMethod(boolean)][0].grade=2", - "feign.sentinel.rules.[UserClient#specificFeignMethod(boolean)][0].count=1", - "feign.sentinel.rules.[UserClient#specificFeignMethod(boolean)][0].timeWindow=1", - "feign.sentinel.rules.[UserClient#specificFeignMethod(boolean)][0].statIntervalMs=1000", - "feign.sentinel.rules.[UserClient#specificFeignMethod(boolean)][0].minRequestAmount=5" }) + "feign.sentinel.rules.[user#specificFeignMethod(boolean)][0].grade=2", + "feign.sentinel.rules.[user#specificFeignMethod(boolean)][0].count=1", + "feign.sentinel.rules.[user#specificFeignMethod(boolean)][0].timeWindow=1", + "feign.sentinel.rules.[user#specificFeignMethod(boolean)][0].statIntervalMs=1000", + "feign.sentinel.rules.[user#specificFeignMethod(boolean)][0].minRequestAmount=5" }) public class FeignClientCircuitBreakerRuleIntegrationTest { @Autowired