From 9ef157f7c1e890e5099108483dc23a6015f30087 Mon Sep 17 00:00:00 2001 From: seanyu Date: Thu, 16 Mar 2023 21:10:23 +0800 Subject: [PATCH] add PolarisCircuitBreakerRestTemplate support --- ...olarisCircuitBreakerAutoConfiguration.java | 12 +++ .../PolarisCircuitBreakerFallback.java | 7 ++ .../PolarisCircuitBreakerHttpResponse.java | 68 +++++++++++++ .../PolarisCircuitBreakerRestTemplate.java | 18 ++++ ...tBreakerRestTemplateBeanPostProcessor.java | 98 +++++++++++++++++++ ...CircuitBreakerRestTemplateInterceptor.java | 68 +++++++++++++ .../feign/example/ProviderB.java | 2 +- .../feign/example/ProviderBFallback.java | 68 ++++++------- .../example/ServiceAController.java | 17 ++-- .../example/ServiceAResTemplate.java | 4 + 10 files changed, 321 insertions(+), 41 deletions(-) create mode 100644 spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerFallback.java create mode 100644 spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerHttpResponse.java create mode 100644 spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplate.java create mode 100644 spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplateBeanPostProcessor.java create mode 100644 spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplateInterceptor.java diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java index f838214f2..b6f3b4c89 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java @@ -22,6 +22,7 @@ import java.util.List; import com.tencent.cloud.polaris.circuitbreaker.PolarisCircuitBreakerFactory; import com.tencent.cloud.polaris.circuitbreaker.common.CircuitBreakerConfigModifier; +import com.tencent.cloud.polaris.circuitbreaker.resttemplate.PolarisCircuitBreakerRestTemplateBeanPostProcessor; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementAutoConfiguration; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; import com.tencent.polaris.circuitbreak.api.CircuitBreakAPI; @@ -31,9 +32,12 @@ import com.tencent.polaris.client.api.SDKContext; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.AutoConfigureAfter; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory; import org.springframework.cloud.client.circuitbreaker.Customizer; +import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -72,4 +76,12 @@ public class PolarisCircuitBreakerAutoConfiguration { return new CircuitBreakerConfigModifier(properties); } + @Bean + @ConditionalOnMissingBean + @ConditionalOnClass(name = "org.springframework.web.client.RestTemplate") + public static PolarisCircuitBreakerRestTemplateBeanPostProcessor sentinelBeanPostProcessor( + ApplicationContext applicationContext, CircuitBreakerFactory circuitBreakerFactory) { + return new PolarisCircuitBreakerRestTemplateBeanPostProcessor(applicationContext, circuitBreakerFactory); + } + } diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerFallback.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerFallback.java new file mode 100644 index 000000000..1f24e562f --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerFallback.java @@ -0,0 +1,7 @@ +package com.tencent.cloud.polaris.circuitbreaker.resttemplate; + +public interface PolarisCircuitBreakerFallback { + + PolarisCircuitBreakerHttpResponse fallback(); + +} diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerHttpResponse.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerHttpResponse.java new file mode 100644 index 000000000..67e868e31 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerHttpResponse.java @@ -0,0 +1,68 @@ +package com.tencent.cloud.polaris.circuitbreaker.resttemplate; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Map; + +import com.tencent.polaris.api.pojo.CircuitBreakerStatus; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.client.AbstractClientHttpResponse; + +public class PolarisCircuitBreakerHttpResponse extends AbstractClientHttpResponse { + + private final CircuitBreakerStatus.FallbackInfo fallbackInfo; + + public PolarisCircuitBreakerHttpResponse(int code){ + this(new CircuitBreakerStatus.FallbackInfo(code, null, null)); + } + + public PolarisCircuitBreakerHttpResponse(int code, String body){ + this(new CircuitBreakerStatus.FallbackInfo(code, null, body)); + } + + public PolarisCircuitBreakerHttpResponse(int code, Map headers, String body){ + this(new CircuitBreakerStatus.FallbackInfo(code, headers, body)); + } + + public PolarisCircuitBreakerHttpResponse(CircuitBreakerStatus.FallbackInfo fallbackInfo){ + this.fallbackInfo = fallbackInfo; + } + + @Override + public int getRawStatusCode() throws IOException { + return fallbackInfo.getCode(); + } + + @Override + public String getStatusText() throws IOException { + HttpStatus status = HttpStatus.resolve(getRawStatusCode()); + return (status != null ? status.getReasonPhrase() : ""); + } + + @Override + public void close() { + + } + + @Override + public InputStream getBody() throws IOException { + if (fallbackInfo.getBody() != null) { + return new ByteArrayInputStream(fallbackInfo.getBody().getBytes()); + } + return null; + } + + @Override + public HttpHeaders getHeaders() { + if (fallbackInfo.getHeaders() != null) { + HttpHeaders headers = new HttpHeaders(); + fallbackInfo.getHeaders().forEach(headers::add); + return headers; + } + return null; + } + +} diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplate.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplate.java new file mode 100644 index 000000000..9d98b98c2 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplate.java @@ -0,0 +1,18 @@ +package com.tencent.cloud.polaris.circuitbreaker.resttemplate; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface PolarisCircuitBreakerRestTemplate { + + String fallback() default ""; + + Class fallbackClass() default PolarisCircuitBreakerFallback.class; + +} diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplateBeanPostProcessor.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplateBeanPostProcessor.java new file mode 100644 index 000000000..315ebfb9b --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplateBeanPostProcessor.java @@ -0,0 +1,98 @@ +package com.tencent.cloud.polaris.circuitbreaker.resttemplate; + +import java.util.concurrent.ConcurrentHashMap; + +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.config.BeanDefinition; +import org.springframework.beans.factory.support.BeanDefinitionBuilder; +import org.springframework.beans.factory.support.DefaultListableBeanFactory; +import org.springframework.beans.factory.support.MergedBeanDefinitionPostProcessor; +import org.springframework.beans.factory.support.RootBeanDefinition; +import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory; +import org.springframework.context.ApplicationContext; +import org.springframework.core.type.MethodMetadata; +import org.springframework.core.type.StandardMethodMetadata; +import org.springframework.util.StringUtils; +import org.springframework.web.client.RestTemplate; + +public class PolarisCircuitBreakerRestTemplateBeanPostProcessor implements MergedBeanDefinitionPostProcessor { + + private final ApplicationContext applicationContext; + + private final CircuitBreakerFactory circuitBreakerFactory; + + public PolarisCircuitBreakerRestTemplateBeanPostProcessor(ApplicationContext applicationContext, CircuitBreakerFactory circuitBreakerFactory) { + this.applicationContext = applicationContext; + this.circuitBreakerFactory = circuitBreakerFactory; + } + + private ConcurrentHashMap cache = new ConcurrentHashMap<>(); + + private void checkPolarisCircuitBreakerRestTemplate(PolarisCircuitBreakerRestTemplate polarisCircuitBreakerRestTemplate, + String beanName) { + + } + + @Override + public void postProcessMergedBeanDefinition(RootBeanDefinition beanDefinition, Class beanType, String beanName) { + if (checkAnnotated(beanDefinition, beanType, beanName)) { + PolarisCircuitBreakerRestTemplate polarisCircuitBreakerRestTemplate; + if (beanDefinition.getSource() instanceof StandardMethodMetadata) { + polarisCircuitBreakerRestTemplate = ((StandardMethodMetadata) beanDefinition.getSource()).getIntrospectedMethod() + .getAnnotation(PolarisCircuitBreakerRestTemplate.class); + } + else { + polarisCircuitBreakerRestTemplate = beanDefinition.getResolvedFactoryMethod() + .getAnnotation(PolarisCircuitBreakerRestTemplate.class); + } + checkPolarisCircuitBreakerRestTemplate(polarisCircuitBreakerRestTemplate, beanName); + cache.put(beanName, polarisCircuitBreakerRestTemplate); + } + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + if (cache.containsKey(beanName)) { + // add interceptor for each RestTemplate with @PolarisCircuitBreakerRestTemplate annotation + StringBuilder interceptorBeanNamePrefix = new StringBuilder(); + PolarisCircuitBreakerRestTemplate polarisCircuitBreakerRestTemplate = cache.get(beanName); + interceptorBeanNamePrefix + .append(StringUtils.uncapitalize( + PolarisCircuitBreakerRestTemplate.class.getSimpleName())) + .append("_") + .append(polarisCircuitBreakerRestTemplate.fallbackClass().getSimpleName()); + RestTemplate restTemplate = (RestTemplate) bean; + String interceptorBeanName = interceptorBeanNamePrefix + "@" + bean; + registerBean(interceptorBeanName, polarisCircuitBreakerRestTemplate, applicationContext, circuitBreakerFactory); + PolarisCircuitBreakerRestTemplateInterceptor polarisCircuitBreakerRestTemplateInterceptor = applicationContext + .getBean(interceptorBeanName, PolarisCircuitBreakerRestTemplateInterceptor.class); + restTemplate.getInterceptors().add(0, polarisCircuitBreakerRestTemplateInterceptor); + } + return bean; + } + + private boolean checkAnnotated(RootBeanDefinition beanDefinition, + Class beanType, String beanName) { + return beanName != null && beanType == RestTemplate.class + && beanDefinition.getSource() instanceof MethodMetadata + && ((MethodMetadata) beanDefinition.getSource()) + .isAnnotated(PolarisCircuitBreakerRestTemplate.class.getName()); + } + + private void registerBean(String interceptorBeanName, + PolarisCircuitBreakerRestTemplate polarisCircuitBreakerRestTemplate, ApplicationContext applicationContext, CircuitBreakerFactory circuitBreakerFactory) { + // register PolarisCircuitBreakerRestTemplateInterceptor bean + DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext + .getAutowireCapableBeanFactory(); + BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder + .genericBeanDefinition(PolarisCircuitBreakerRestTemplateInterceptor.class); + beanDefinitionBuilder.addConstructorArgValue(polarisCircuitBreakerRestTemplate); + beanDefinitionBuilder.addConstructorArgValue(applicationContext); + beanDefinitionBuilder.addConstructorArgValue(circuitBreakerFactory); + BeanDefinition interceptorBeanDefinition = beanDefinitionBuilder + .getRawBeanDefinition(); + beanFactory.registerBeanDefinition(interceptorBeanName, + interceptorBeanDefinition); + } + +} diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplateInterceptor.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplateInterceptor.java new file mode 100644 index 000000000..204b28c90 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/PolarisCircuitBreakerRestTemplateInterceptor.java @@ -0,0 +1,68 @@ +package com.tencent.cloud.polaris.circuitbreaker.resttemplate; + +import java.io.IOException; +import java.lang.reflect.Method; + +import com.tencent.polaris.api.pojo.CircuitBreakerStatus; +import com.tencent.polaris.circuitbreak.client.exception.CallAbortedException; +import org.apache.commons.lang.StringUtils; + +import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory; +import org.springframework.context.ApplicationContext; +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.util.ReflectionUtils; + +public class PolarisCircuitBreakerRestTemplateInterceptor implements ClientHttpRequestInterceptor { + + private final PolarisCircuitBreakerRestTemplate polarisCircuitBreakerRestTemplate; + + private final ApplicationContext applicationContext; + + private final CircuitBreakerFactory circuitBreakerFactory; + + public PolarisCircuitBreakerRestTemplateInterceptor( + PolarisCircuitBreakerRestTemplate polarisCircuitBreakerRestTemplate, + ApplicationContext applicationContext, + CircuitBreakerFactory circuitBreakerFactory + ) { + this.polarisCircuitBreakerRestTemplate = polarisCircuitBreakerRestTemplate; + this.applicationContext = applicationContext; + this.circuitBreakerFactory = circuitBreakerFactory; + } + + @Override + public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { + return circuitBreakerFactory.create(request.getURI().getHost() + "#" + request.getURI().getPath()).run( + () -> { + try { + return execution.execute(request, body); + } + catch (IOException e) { + throw new IllegalStateException(e); + } + }, + t -> { + if (!StringUtils.isEmpty(polarisCircuitBreakerRestTemplate.fallback())) { + CircuitBreakerStatus.FallbackInfo fallbackInfo = new CircuitBreakerStatus.FallbackInfo(200, null, polarisCircuitBreakerRestTemplate.fallback()); + return new PolarisCircuitBreakerHttpResponse(fallbackInfo); + } + if (polarisCircuitBreakerRestTemplate.fallbackClass() != null && polarisCircuitBreakerRestTemplate.fallbackClass().getSuperclass() != null) { + Method method = ReflectionUtils.findMethod(PolarisCircuitBreakerFallback.class, "fallback"); + PolarisCircuitBreakerFallback polarisCircuitBreakerFallback = applicationContext.getBean(polarisCircuitBreakerRestTemplate.fallbackClass()); + return (PolarisCircuitBreakerHttpResponse) ReflectionUtils.invokeMethod(method, polarisCircuitBreakerFallback); + } + if (t instanceof CallAbortedException) { + CircuitBreakerStatus.FallbackInfo fallbackInfo = ((CallAbortedException) t).getFallbackInfo(); + if (fallbackInfo != null) { + return new PolarisCircuitBreakerHttpResponse(fallbackInfo); + } + } + throw new IllegalStateException(t); + } + ); + } + +} diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderB.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderB.java index 5e1160877..c26879242 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderB.java +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderB.java @@ -27,7 +27,7 @@ import org.springframework.web.bind.annotation.GetMapping; * @author sean yu */ @Primary -@FeignClient(name = "polaris-circuitbreaker-callee-service", fallback = ProviderBFallback.class) +@FeignClient(name = "polaris-circuitbreaker-callee-service") public interface ProviderB { /** diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderBFallback.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderBFallback.java index e62cbf24c..22d46f6cb 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderBFallback.java +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderBFallback.java @@ -1,34 +1,34 @@ -/* - * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. - * - * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. - * - * Licensed under the BSD 3-Clause License (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://opensource.org/licenses/BSD-3-Clause - * - * 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 com.tencent.cloud.polaris.circuitbreaker.feign.example; - -import org.springframework.stereotype.Component; - -/** - * Circuit breaker example callee fallback. - * - * @author sean yu - */ -@Component -public class ProviderBFallback implements ProviderB { - - @Override - public String info() { - return "fallback: trigger the refuse for service b"; - } -} +///* +// * Tencent is pleased to support the open source community by making Spring Cloud Tencent available. +// * +// * Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved. +// * +// * Licensed under the BSD 3-Clause License (the "License"); +// * you may not use this file except in compliance with the License. +// * You may obtain a copy of the License at +// * +// * https://opensource.org/licenses/BSD-3-Clause +// * +// * 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 com.tencent.cloud.polaris.circuitbreaker.feign.example; +// +//import org.springframework.stereotype.Component; +// +///** +// * Circuit breaker example callee fallback. +// * +// * @author sean yu +// */ +//@Component +//public class ProviderBFallback implements ProviderB { +// +// @Override +// public String info() { +// return "fallback: trigger the refuse for service b"; +// } +//} diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/ServiceAController.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/ServiceAController.java index d76816ed1..6c50b5252 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/ServiceAController.java +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/ServiceAController.java @@ -40,14 +40,19 @@ public class ServiceAController { @Autowired private CircuitBreakerFactory circuitBreakerFactory; +// @GetMapping("/getBServiceInfo") +// public String getBServiceInfo() { +// return circuitBreakerFactory +// .create("polaris-circuitbreaker-callee-service#/example/service/b/info") +// .run(() -> +// restTemplate.getForObject("/example/service/b/info", String.class), +// throwable -> "trigger the refuse for service b" +// ); +// } + @GetMapping("/getBServiceInfo") public String getBServiceInfo() { - return circuitBreakerFactory - .create("polaris-circuitbreaker-callee-service#/example/service/b/info") - .run(() -> - restTemplate.getForObject("/example/service/b/info", String.class), - throwable -> "trigger the refuse for service b" - ); + return restTemplate.getForObject("/example/service/b/info", String.class); } } diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/ServiceAResTemplate.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/ServiceAResTemplate.java index 21e2f4778..ed40e9424 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/ServiceAResTemplate.java +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/ServiceAResTemplate.java @@ -18,6 +18,9 @@ package com.tencent.cloud.polaris.circuitbreaker.resttemplate.example; +import com.tencent.cloud.polaris.circuitbreaker.resttemplate.PolarisCircuitBreakerFallback; +import com.tencent.cloud.polaris.circuitbreaker.resttemplate.PolarisCircuitBreakerRestTemplate; + import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; @@ -39,6 +42,7 @@ public class ServiceAResTemplate { @Bean @LoadBalanced + @PolarisCircuitBreakerRestTemplate public RestTemplate restTemplate() { DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory("http://polaris-circuitbreaker-callee-service"); RestTemplate restTemplate = new RestTemplate();