diff --git a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelBeanPostProcessor.java b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelBeanPostProcessor.java index 7ec733b5..26641002 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelBeanPostProcessor.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelBeanPostProcessor.java @@ -168,9 +168,9 @@ public class SentinelBeanPostProcessor implements MergedBeanDefinitionPostProces throws BeansException { if (cache.containsKey(beanName)) { // add interceptor for each RestTemplate with @SentinelRestTemplate annotation - StringBuilder interceptorBeanName = new StringBuilder(); + StringBuilder interceptorBeanNamePrefix = new StringBuilder(); SentinelRestTemplate sentinelRestTemplate = cache.get(beanName); - interceptorBeanName + interceptorBeanNamePrefix .append(StringUtils.uncapitalize( SentinelProtectInterceptor.class.getSimpleName())) .append("_") @@ -179,26 +179,25 @@ public class SentinelBeanPostProcessor implements MergedBeanDefinitionPostProces .append(sentinelRestTemplate.fallbackClass().getSimpleName()) .append(sentinelRestTemplate.fallback()); RestTemplate restTemplate = (RestTemplate) bean; - registerBean(interceptorBeanName.toString(), sentinelRestTemplate); + String interceptorBeanName = interceptorBeanNamePrefix + "@" + + bean.toString(); + registerBean(interceptorBeanName, sentinelRestTemplate, (RestTemplate) bean); SentinelProtectInterceptor sentinelProtectInterceptor = applicationContext - .getBean(interceptorBeanName.toString(), - SentinelProtectInterceptor.class); + .getBean(interceptorBeanName, SentinelProtectInterceptor.class); restTemplate.getInterceptors().add(0, sentinelProtectInterceptor); } return bean; } private void registerBean(String interceptorBeanName, - SentinelRestTemplate sentinelRestTemplate) { + SentinelRestTemplate sentinelRestTemplate, RestTemplate restTemplate) { // register SentinelProtectInterceptor bean DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext .getAutowireCapableBeanFactory(); - if (beanFactory.containsBean(interceptorBeanName)) { - return; - } BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder .genericBeanDefinition(SentinelProtectInterceptor.class); beanDefinitionBuilder.addConstructorArgValue(sentinelRestTemplate); + beanDefinitionBuilder.addConstructorArgValue(restTemplate); BeanDefinition interceptorBeanDefinition = beanDefinitionBuilder .getRawBeanDefinition(); beanFactory.registerBeanDefinition(interceptorBeanName, diff --git a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelProtectInterceptor.java b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelProtectInterceptor.java index 48f63ef3..dc69efbb 100644 --- a/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelProtectInterceptor.java +++ b/spring-cloud-alibaba-sentinel/src/main/java/org/springframework/cloud/alibaba/sentinel/custom/SentinelProtectInterceptor.java @@ -27,11 +27,12 @@ import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; +import org.springframework.web.client.RestTemplate; import com.alibaba.csp.sentinel.Entry; +import com.alibaba.csp.sentinel.EntryType; import com.alibaba.csp.sentinel.SphU; import com.alibaba.csp.sentinel.Tracer; -import com.alibaba.csp.sentinel.context.ContextUtil; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException; @@ -44,8 +45,12 @@ public class SentinelProtectInterceptor implements ClientHttpRequestInterceptor private final SentinelRestTemplate sentinelRestTemplate; - public SentinelProtectInterceptor(SentinelRestTemplate sentinelRestTemplate) { + private final RestTemplate restTemplate; + + public SentinelProtectInterceptor(SentinelRestTemplate sentinelRestTemplate, + RestTemplate restTemplate) { this.sentinelRestTemplate = sentinelRestTemplate; + this.restTemplate = restTemplate; } @Override @@ -61,32 +66,33 @@ public class SentinelProtectInterceptor implements ClientHttpRequestInterceptor entryWithPath = false; } Entry hostEntry = null, hostWithPathEntry = null; - ClientHttpResponse response; + ClientHttpResponse response = null; try { - ContextUtil.enter(hostWithPathResource); + hostEntry = SphU.entry(hostResource, EntryType.OUT); if (entryWithPath) { - hostWithPathEntry = SphU.entry(hostWithPathResource); + hostWithPathEntry = SphU.entry(hostWithPathResource, EntryType.OUT); } - hostEntry = SphU.entry(hostResource); response = execution.execute(request, body); + if (this.restTemplate.getErrorHandler().hasError(response)) { + Tracer.trace( + new IllegalStateException("RestTemplate ErrorHandler has error")); + } } catch (Throwable e) { if (!BlockException.isBlockException(e)) { Tracer.trace(e); - throw new IllegalStateException(e); } else { return handleBlockException(request, body, execution, (BlockException) e); } } finally { - if (hostEntry != null) { - hostEntry.exit(); - } if (hostWithPathEntry != null) { hostWithPathEntry.exit(); } - ContextUtil.exit(); + if (hostEntry != null) { + hostEntry.exit(); + } } return response; }