diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/pom.xml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/pom.xml index 6811c6230..a20045728 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/pom.xml +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/pom.xml @@ -20,13 +20,13 @@ - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery + org.springframework.boot + spring-boot-starter-webflux com.tencent.cloud - spring-cloud-starter-tencent-polaris-circuitbreaker + spring-cloud-starter-tencent-polaris-discovery @@ -40,8 +40,8 @@ - org.springframework.cloud - spring-cloud-circuitbreaker-spring-retry + com.tencent.cloud + spring-cloud-starter-tencent-polaris-circuitbreaker diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ProviderB.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ProviderB.java index f0c05217a..7fa0830c6 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ProviderB.java +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ProviderB.java @@ -18,6 +18,7 @@ package com.tencent.cloud.polaris.circuitbreaker.example; import org.springframework.cloud.openfeign.FeignClient; +import org.springframework.context.annotation.Primary; import org.springframework.web.bind.annotation.GetMapping; /** @@ -25,7 +26,8 @@ import org.springframework.web.bind.annotation.GetMapping; * * @author Haotian Zhang */ -@FeignClient(name = "polaris-circuitbreaker-example-b", fallback = ProviderBFallback.class) +@Primary +@FeignClient(name = ProviderBFallbackConstant.SERVICE_NAME, fallback = ProviderBFallback.class) public interface ProviderB { /** @@ -33,6 +35,6 @@ public interface ProviderB { * * @return info of service B */ - @GetMapping("/example/service/b/info") + @GetMapping(ProviderBFallbackConstant.API) String info(); } diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ProviderBFallback.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ProviderBFallback.java index bf47d49dd..cb015bbe0 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ProviderBFallback.java +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ProviderBFallback.java @@ -29,6 +29,6 @@ public class ProviderBFallback implements ProviderB { @Override public String info() { - return "trigger the refuse for service b"; + return ProviderBFallbackConstant.FALLBACK_MESSAGE; } } diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ProviderBFallbackConstant.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ProviderBFallbackConstant.java new file mode 100644 index 000000000..3c1f34a66 --- /dev/null +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ProviderBFallbackConstant.java @@ -0,0 +1,10 @@ +package com.tencent.cloud.polaris.circuitbreaker.example; + +public class ProviderBFallbackConstant { + + public static final String SERVICE_NAME = "polaris-circuitbreaker-example-b"; + + public static final String API = "/example/service/b/info"; + + public static final String FALLBACK_MESSAGE = "trigger the refuse for service b"; +} diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceA.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceA.java index 3db7df8f3..12876cf95 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceA.java +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceA.java @@ -24,6 +24,8 @@ import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; +import org.springframework.web.reactive.function.client.WebClient; +import org.springframework.web.util.DefaultUriBuilderFactory; /** * Circuit breaker example caller application. @@ -41,6 +43,16 @@ public class ServiceA { @Bean @LoadBalanced public RestTemplate restTemplate() { - return new RestTemplate(); + DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory("http://" + ProviderBFallbackConstant.SERVICE_NAME); + RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(uriBuilderFactory); + return restTemplate; + } + + @LoadBalanced + @Bean + WebClient.Builder webClientBuilder() { + return WebClient.builder() + .baseUrl("http://" + ProviderBFallbackConstant.SERVICE_NAME); } } diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceAController.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceAController.java index 79ba2c0ef..b22c7dd8c 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceAController.java +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceAController.java @@ -17,12 +17,17 @@ package com.tencent.cloud.polaris.circuitbreaker.example; +import reactor.core.publisher.Mono; + import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory; +import org.springframework.cloud.client.circuitbreaker.ReactiveCircuitBreakerFactory; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; +import org.springframework.web.reactive.function.client.WebClient; /** * Circuit breaker example caller controller. @@ -39,6 +44,15 @@ public class ServiceAController { @Autowired private RestTemplate restTemplate; + @Autowired + private ReactiveCircuitBreakerFactory reactiveCircuitBreakerFactory; + + @Autowired + private CircuitBreakerFactory circuitBreakerFactory; + + @Autowired + private WebClient.Builder webClientBuilder; + /** * Get info of Service B by Feign. * @return info of Service B @@ -48,9 +62,34 @@ public class ServiceAController { return polarisServiceB.info(); } + @GetMapping("/getBServiceInfoByRestTemplate1") + public String getBServiceInfoByRestTemplate1() { + return restTemplate.getForObject(ProviderBFallbackConstant.API, String.class); + } + @GetMapping("/getBServiceInfoByRestTemplate") public String getBServiceInfoByRestTemplate() { - return restTemplate.getForObject("http://polaris-circuitbreaker-example-b/example/service/b/info", String.class); + return circuitBreakerFactory + .create(ProviderBFallbackConstant.SERVICE_NAME) + .run(() -> + restTemplate.getForObject(ProviderBFallbackConstant.API, String.class), + throwable -> ProviderBFallbackConstant.FALLBACK_MESSAGE + ); + } + + @GetMapping("/getBServiceInfoByWebClient") + public Mono getBServiceInfoByWebClient() { + return webClientBuilder + .build() + .get() + .uri(ProviderBFallbackConstant.API) + .retrieve() + .bodyToMono(String.class) + .transform(it -> + reactiveCircuitBreakerFactory + .create(ProviderBFallbackConstant.SERVICE_NAME) + .run(it, throwable -> Mono.just(ProviderBFallbackConstant.FALLBACK_MESSAGE)) + ); } /** @@ -64,4 +103,5 @@ public class ServiceAController { String.class); return entity.getBody(); } + } diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/resources/bootstrap.yml index de8c607b2..1010c99b2 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/resources/bootstrap.yml @@ -5,7 +5,7 @@ spring: name: polaris-circuitbreaker-example-a cloud: polaris: - address: grpc://183.47.111.80:8091 + address: grpc://127.0.0.1:8091 namespace: default enabled: true circuitbreaker: @@ -36,3 +36,8 @@ feign: serivceB: url: http://localhost:48081 +logging: + level: + root: info + com.tencent.cloud: debug + diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-b/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-b/src/main/resources/bootstrap.yml index d6945b5b4..dfdcb3bb9 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-b/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-b/src/main/resources/bootstrap.yml @@ -5,7 +5,7 @@ spring: name: polaris-circuitbreaker-example-b cloud: polaris: - address: grpc://183.47.111.80:8091 + address: grpc://127.0.0.1:8091 namespace: default enabled: true stat: diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-b2/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-b2/src/main/resources/bootstrap.yml index 5ef89145c..240710181 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-b2/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-b2/src/main/resources/bootstrap.yml @@ -5,7 +5,7 @@ spring: name: polaris-circuitbreaker-example-b cloud: polaris: - address: grpc://183.47.111.80:8091 + address: grpc://127.0.0.1:8091 namespace: default enabled: true stat: