From ddaceb59b684c5077c5cf17d6a50507b2fe70d52 Mon Sep 17 00:00:00 2001 From: Haotian Zhang Date: Wed, 18 Oct 2023 18:53:06 +0800 Subject: [PATCH] feat:optimize examples. (#1185) --- CHANGELOG.md | 1 + spring-cloud-starter-tencent-all/pom.xml | 12 -- .../src/main/resources/bootstrap.yml | 25 ++- .../README-zh.md | 66 ------- .../polaris-circuitbreaker-example/README.md | 66 ------- .../pom.xml | 61 ------ .../circuitbreaker/example/ServiceB.java | 34 ---- .../example/ServiceBController.java | 55 ------ .../src/main/resources/bootstrap.yml | 13 -- .../pom.xml | 61 ------ .../ciruitbreaker/example/ServiceB2.java | 35 ---- .../example/ServiceBController.java | 98 ---------- .../src/main/resources/bootstrap.yml | 13 -- .../pom.xml | 82 -------- .../feign/example/ServiceAController.java | 59 ------ .../feign/example/ServiceAFeign.java | 38 ---- .../src/main/resources/bootstrap.yml | 30 --- .../pom.xml | 92 --------- .../example/GatewayScgApplication.java | 35 ---- .../src/main/resources/bootstrap.yml | 65 ------ .../pom.xml | 77 -------- .../example/ServiceAController.java | 74 ------- .../example/ServiceAResTemplate.java | 71 ------- .../src/main/resources/bootstrap.yml | 26 --- .../pom.xml | 77 -------- .../webclient/example/ServiceAController.java | 59 ------ .../webclient/example/ServiceAWebClient.java | 45 ----- .../src/main/resources/bootstrap.yml | 26 --- .../polaris-circuitbreaker-example/pom.xml | 25 --- .../polaris-config-example/README-zh.md | 77 -------- .../polaris-config-ui.png | Bin 116372 -> 0 bytes .../polaris-config-example/pom.xml | 68 ------- .../config/example/ConfigController.java | 52 ----- .../cloud/polaris/config/example/Person.java | 68 ------- .../example/PersonConfigChangeListener.java | 66 ------- .../PolarisConfigExampleApplication.java | 34 ---- .../src/main/resources/bootstrap.yml | 24 --- .../polaris-discovery-example/README-zh.md | 67 ------- .../polaris-discovery-example/README.md | 81 -------- .../discovery-callee-service/pom.xml | 76 ------- .../service/callee/CustomMetadata.java | 47 ----- .../callee/DiscoveryCalleeController.java | 69 ------- .../callee/DiscoveryCalleeService.java | 34 ---- .../src/main/resources/bootstrap.yml | 53 ----- .../discovery-caller-service/pom.xml | 80 -------- .../caller/DiscoveryCalleeService.java | 40 ---- .../DiscoveryCalleeServiceFallback.java | 34 ---- .../caller/DiscoveryCallerController.java | 70 ------- .../caller/DiscoveryCallerService.java | 47 ----- .../src/main/resources/bootstrap.yml | 68 ------- .../polaris-discovery-example/pom.xml | 38 ---- .../polaris-gateway-example/README-zh.md | 68 ------- .../polaris-gateway-example/README.md | 69 ------- .../gateway-callee-service/pom.xml | 32 --- .../callee/GatewayCalleeApplication.java | 34 ---- .../callee/GatewayCalleeController.java | 72 ------- .../src/main/resources/bootstrap.yml | 14 -- .../gateway-callee-service2/pom.xml | 32 --- .../callee/GatewayCalleeApplication2.java | 34 ---- .../callee/GatewayCalleeController.java | 72 ------- .../src/main/resources/bootstrap.yml | 14 -- .../gateway-scg-service/pom.xml | 52 ----- .../example/scg/GatewayScgApplication.java | 34 ---- .../src/main/resources/bootstrap.yml | 68 ------- .../polaris-gateway-example/pom.xml | 45 ----- .../polaris-ratelimit-example/README-zh.md | 64 ------ .../polaris-ratelimit-example/README.md | 71 ------- .../polaris-ratelimit-ui.png | Bin 393571 -> 0 bytes .../polaris-ratelimit-example/pom.xml | 28 --- .../ratelimit-callee-service/pom.xml | 50 ----- .../service/callee/BusinessController.java | 183 ----------------- .../callee/RateLimitCalleeService.java | 51 ----- .../src/main/resources/bootstrap.yml | 29 --- .../ratelimit-caller-service/pom.xml | 51 ----- .../example/service/caller/Controller.java | 185 ------------------ .../caller/RateLimitCallerService.java | 52 ----- .../src/main/resources/bootstrap.yml | 21 -- .../polaris-router-example/pom.xml | 21 -- .../router-callee-service1/pom.xml | 60 ------ .../example/RouterCalleeApplication1.java | 35 ---- .../example/RouterCalleeController.java | 53 ----- .../cloud/polaris/router/example/User.java | 53 ----- .../src/main/resources/bootstrap.yml | 14 -- .../router-callee-service2/pom.xml | 60 ------ .../example/RouterCalleeApplication2.java | 35 ---- .../example/RouterCalleeController.java | 54 ----- .../cloud/polaris/router/example/User.java | 53 ----- .../src/main/resources/bootstrap.yml | 14 -- .../router-caller-service/pom.xml | 82 -------- .../CustomSpringWebRouterLabelResolver.java | 51 ----- .../router/example/RouterCalleeService.java | 36 ---- .../example/RouterCallerApplication.java | 48 ----- .../example/RouterCallerController.java | 76 ------- .../cloud/polaris/router/example/User.java | 45 ----- .../src/main/resources/bootstrap.yml | 28 --- spring-cloud-tencent-examples/pom.xml | 6 - .../quickstart-callee-service-a/pom.xml | 5 + .../callee/QuickstartCalleeController.java | 38 +++- .../config}/CustomConfigChangeListener.java | 9 +- .../{ => config}/DataSourceProperties.java | 2 +- .../ratelimit}/CustomLabelResolver.java | 5 +- .../src/main/resources/bootstrap.yml | 22 +++ .../src/main/resources/reject-tips.html | 0 .../quickstart-callee-service-b/pom.xml | 5 + .../callee/QuickstartCalleeController.java | 73 ++++++- .../config}/CustomConfigChangeListener.java | 8 +- .../{ => config}/DataSourceProperties.java | 6 +- .../CustomLabelResolverReactive.java | 22 ++- ...JsonPolarisRateLimiterLimitedFallback.java | 2 +- .../src/main/resources/bootstrap.yml | 21 ++ .../quickstart-caller-service/pom.xml | 15 ++ .../caller}/CustomMetadataProvider.java | 2 +- .../caller/QuickstartCalleeService.java | 8 - .../QuickstartCalleeServiceFallback.java | 5 - .../caller/QuickstartCallerApplication.java | 40 ++++ .../caller/QuickstartCallerController.java | 22 ++- .../CircuitBreakerController.java | 136 +++++++++++++ ...ircuitBreakerQuickstartCalleeService.java} | 14 +- ...eakerQuickstartCalleeServiceFallback.java} | 8 +- ...rQuickstartCalleeServiceWithFallback.java} | 17 +- .../circuitbreaker}/CustomFallback.java | 2 +- .../router}/CustomRouterLabelResolver.java | 6 +- .../src/main/resources/bootstrap.yml | 7 +- .../gateway}/FallbackController.java | 4 +- .../src/main/resources/bootstrap.yml | 26 +++ 125 files changed, 477 insertions(+), 4916 deletions(-) delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/README-zh.md delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/README.md delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceB.java delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceBController.java delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/src/main/java/com/tencent/cloud/polaris/ciruitbreaker/example/ServiceB2.java delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/src/main/java/com/tencent/cloud/polaris/ciruitbreaker/example/ServiceBController.java delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ServiceAController.java delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ServiceAFeign.java delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/gateway/example/GatewayScgApplication.java delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/ServiceAController.java delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/ServiceAResTemplate.java delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/webclient/example/ServiceAController.java delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/webclient/example/ServiceAWebClient.java delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-circuitbreaker-example/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-config-example/README-zh.md delete mode 100644 spring-cloud-tencent-examples/polaris-config-example/polaris-config-ui.png delete mode 100644 spring-cloud-tencent-examples/polaris-config-example/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/ConfigController.java delete mode 100644 spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/Person.java delete mode 100644 spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/PersonConfigChangeListener.java delete mode 100644 spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/PolarisConfigExampleApplication.java delete mode 100644 spring-cloud-tencent-examples/polaris-config-example/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/README-zh.md delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/README.md delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/CustomMetadata.java delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/DiscoveryCalleeController.java delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/DiscoveryCalleeService.java delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCalleeService.java delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCalleeServiceFallback.java delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCallerController.java delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCallerService.java delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-discovery-example/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/README-zh.md delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/README.md delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeApplication.java delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeController.java delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeApplication2.java delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeController.java delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/src/main/java/com/tencent/cloud/polaris/gateway/example/scg/GatewayScgApplication.java delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-gateway-example/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-ratelimit-example/README-zh.md delete mode 100644 spring-cloud-tencent-examples/polaris-ratelimit-example/README.md delete mode 100644 spring-cloud-tencent-examples/polaris-ratelimit-example/polaris-ratelimit-ui.png delete mode 100644 spring-cloud-tencent-examples/polaris-ratelimit-example/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/BusinessController.java delete mode 100644 spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/RateLimitCalleeService.java delete mode 100644 spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/src/main/java/com/tencent/cloud/ratelimit/example/service/caller/Controller.java delete mode 100644 spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/src/main/java/com/tencent/cloud/ratelimit/example/service/caller/RateLimitCallerService.java delete mode 100644 spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeApplication1.java delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeController.java delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/java/com/tencent/cloud/polaris/router/example/User.java delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeApplication2.java delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeController.java delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/java/com/tencent/cloud/polaris/router/example/User.java delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/resources/bootstrap.yml delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-caller-service/pom.xml delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/CustomSpringWebRouterLabelResolver.java delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeService.java delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/RouterCallerApplication.java delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/RouterCallerController.java delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/User.java delete mode 100644 spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/resources/bootstrap.yml rename spring-cloud-tencent-examples/quickstart-example/{quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee => quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/config}/CustomConfigChangeListener.java (84%) rename spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/{ => config}/DataSourceProperties.java (96%) rename spring-cloud-tencent-examples/{polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee => quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/ratelimit}/CustomLabelResolver.java (93%) rename spring-cloud-tencent-examples/{polaris-ratelimit-example/ratelimit-callee-service => quickstart-example/quickstart-callee-service-a}/src/main/resources/reject-tips.html (100%) rename spring-cloud-tencent-examples/quickstart-example/{quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee => quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/config}/CustomConfigChangeListener.java (84%) rename spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/{ => config}/DataSourceProperties.java (92%) rename spring-cloud-tencent-examples/{polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee => quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/ratelimit}/CustomLabelResolverReactive.java (71%) rename spring-cloud-tencent-examples/{polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee => quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/ratelimit}/JsonPolarisRateLimiterLimitedFallback.java (95%) rename spring-cloud-tencent-examples/{polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example => quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller}/CustomMetadataProvider.java (95%) create mode 100644 spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerController.java rename spring-cloud-tencent-examples/{polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderB.java => quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerQuickstartCalleeService.java} (74%) rename spring-cloud-tencent-examples/{polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderBFallback.java => quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerQuickstartCalleeServiceFallback.java} (76%) rename spring-cloud-tencent-examples/{polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderBWithFallback.java => quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerQuickstartCalleeServiceWithFallback.java} (66%) rename spring-cloud-tencent-examples/{polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example => quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker}/CustomFallback.java (95%) rename spring-cloud-tencent-examples/{polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example => quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/router}/CustomRouterLabelResolver.java (89%) rename spring-cloud-tencent-examples/{polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/gateway/example => quickstart-example/quickstart-gateway-service/src/main/java/com/tencent/cloud/quickstart/gateway}/FallbackController.java (88%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5ed05b509..5f80ad887 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -16,3 +16,4 @@ - [fix:fix header validation when using Chinese char.](https://github.com/Tencent/spring-cloud-tencent/pull/1166) - [fix:remove bcprov-jdk15on dependency.](https://github.com/Tencent/spring-cloud-tencent/pull/1177) - [feat:support configuration encryption.](https://github.com/Tencent/spring-cloud-tencent/pull/1181) +- [feat:optimize examples.](https://github.com/Tencent/spring-cloud-tencent/pull/1185) diff --git a/spring-cloud-starter-tencent-all/pom.xml b/spring-cloud-starter-tencent-all/pom.xml index fc6470e9a..50908dfa5 100644 --- a/spring-cloud-starter-tencent-all/pom.xml +++ b/spring-cloud-starter-tencent-all/pom.xml @@ -49,18 +49,6 @@ com.tencent.cloud spring-cloud-starter-tencent-polaris-contract - - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - - - org.springframework.boot - spring-boot-starter-actuator - diff --git a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/resources/bootstrap.yml index 72ecca940..187df8952 100644 --- a/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/multiple-discovery-example/multiple-discovery-nacos-example/nacos-discovery-caller/src/main/resources/bootstrap.yml @@ -15,7 +15,30 @@ spring: nacos: discovery: server-addr: 127.0.0.1:8848 - +# consul: +# port: 8500 +# host: 127.0.0.1 +# enabled: true +# discovery: +# enabled: true +# register: true +# health-check-path: /actuator/health +# health-check-interval: 10s +# instance-id: ${spring.application.name}:${server.port} +# service-name: ${spring.application.name} +# ip-address: localhost +# prefer-ip-address: true +# nacos: +# enabled: true +# password: nacos +# username: nacos +# context-path: /nacos +# discovery: +# enabled: true +# register-enabled: true +# group: polaris +# server-addr: 127.0.0.1:8848 +# cluster-name: polaris feign: circuitbreaker: enabled: true diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/README-zh.md b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/README-zh.md deleted file mode 100644 index 30679375a..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/README-zh.md +++ /dev/null @@ -1,66 +0,0 @@ -# Spring Cloud Polaris Circuitbreaker example - -## 样例简介 - -本样例将介绍如何在Spring Cloud项目中使用```spring-cloud-starter-tencent-polaris-circuitbreaker```以使用其各项功能。 - -本样例包括被调方```polaris-circuitbreaker-callee-service```、```polaris-circuitbreaker-callee-service2```和主调方```polaris-circuitbreaker-feign-example```、```polaris-circuitbreaker-gateway-example```、```polaris-circuitbreaker-webclient-example```。 - -## 使用说明 - -### 修改配置 - -配置如下所示。其中,${ip}和${port}为Polaris后端服务的IP地址与端口号。 - -```yaml -spring: - application: - name: ${application.name} - cloud: - polaris: - address: ${ip}:${port} -``` - -### 启动样例 - -#### 启动Polaris后端服务 - -参考[Polaris Getting Started](https://github.com/PolarisMesh/polaris#getting-started)。 - -#### 启动被调应用 - -分别启动```polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service```、```polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2``` - - -#### 启动主调应用 - -##### 启动Feign并验证 - -启动```polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example```。 - -发送请求`curl --location --request GET 'http://127.0.0.1:48080/example/service/a/getBServiceInfo/fallbackFromPolaris'`, 验证熔断和Polaris-server远程拉取降级。 - -发送请求`curl --location --request GET 'http://127.0.0.1:48080/example/service/a/getBServiceInfo/fallbackFromCode'`, 验证熔断和代码降级。 - -##### 启动RestTemplate并验证 - -启动```polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example```。 - -发送请求`curl --location --request GET 'http://127.0.0.1:48080/example/service/a/getBServiceInfo/fallbackFromPolaris'`, 验证熔断和Polaris-server远程拉取降级。 - -发送请求`curl --location --request GET 'http://127.0.0.1:48080/example/service/a/getBServiceInfo/fallbackFromCode'`, 验证熔断和代码降级。 - -##### 启动WebClient并验证 - -启动```polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example```。 - -发送请求`curl --location --request GET 'http://127.0.0.1:48080/example/service/a/getBServiceInfo'`, 验证熔断和代码降级。 - -##### 启动SCG并验证 - -启动```polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example```。 - -发送请求`curl --location --request GET 'http://127.0.0.1:48080/polaris-circuitbreaker-callee-service/example/service/b/info'`, 验证熔断和代码降级。 - -修改```polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/resources/bootstrap.yml```。删除本地fallback方法并重启,验证熔断和Polaris-server远程拉取降级。 - diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/README.md b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/README.md deleted file mode 100644 index 0c297ef02..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# Spring Cloud Polaris Circuitbreaker example - -## Example Introduction - -This example shows how to use```spring-cloud-starter-tencent-polaris-circuitbreaker```in Spring Cloud project for its features. - -This example contains callee-service```polaris-circuitbreaker-callee-service```、```polaris-circuitbreaker-callee-service2```and caller-service```polaris-circuitbreaker-feign-example```、```polaris-circuitbreaker-gateway-example```、```polaris-circuitbreaker-webclient-example```. - -## Instruction - -### Configuration - -The configuration is as the following shows. ${ip} and ${port} are Polaris backend IP address and port number. - -```yaml -spring: - application: - name: ${application.name} - cloud: - polaris: - address: ${ip}:${port} -``` - -### Launching Example - -#### Launching Polaris Backend Service - -Reference to [Polaris Getting Started](https://github.com/PolarisMesh/polaris#getting-started) - -#### Launching callee service - -Launching```polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service```、```polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2``` - - -#### Launching caller service - -##### Launching Feign and Verify - -Launching```polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example```. - -Sending request`curl --location --request GET 'http://127.0.0.1:48080/example/service/a/getBServiceInfo/fallbackFromPolaris'`, Verify circuit breaker and fallback from Polaris-server. - -Sending request`curl --location --request GET 'http://127.0.0.1:48080/example/service/a/getBServiceInfo/fallbackFromCode'`, Verify circuit breaker and fallback from code. - -##### Launching RestTemplate and Verify - -Launching```polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example```. - -Sending request`curl --location --request GET 'http://127.0.0.1:48080/example/service/a/getBServiceInfo/fallbackFromPolaris'`, Verify circuit breaker and fallback from Polaris-server. - -Sending request`curl --location --request GET 'http://127.0.0.1:48080/example/service/a/getBServiceInfo/fallbackFromCode'`, Verify circuit breaker and fallback from code. - -##### Launching WebClient and Verify - -Launching```polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example```。 - -Sending request`curl --location --request GET 'http://127.0.0.1:48080/example/service/a/getBServiceInfo'`, Verify circuit breaker and fallback from code. - -##### Launching SCG and Verify - -Launching```polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example```。 - -Sending request`curl --location --request GET 'http://127.0.0.1:48080/polaris-circuitbreaker-callee-service/example/service/b/info'`, Verify circuit breaker and fallback from code. - -Changing```polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/resources/bootstrap.yml```, delete local fallback and restart, Verify circuit breaker and fallback from Polaris-server. - diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/pom.xml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/pom.xml deleted file mode 100644 index d26bbbf42..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/pom.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - polaris-circuitbreaker-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - polaris-circuitbreaker-callee-service - Polaris Circuit Breaker Callee Example - - - - org.springframework.boot - spring-boot-starter-webflux - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.0 - - - attach-sources - - jar - - - - - - - \ No newline at end of file diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceB.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceB.java deleted file mode 100644 index c8c32bf24..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceB.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.example; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Circuit breaker example callee application. - * - * @author Haotian Zhang - */ -@SpringBootApplication -public class ServiceB { - - public static void main(String[] args) { - SpringApplication.run(ServiceB.class, args); - } -} diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceBController.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceBController.java deleted file mode 100644 index 8628db06a..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/src/main/java/com/tencent/cloud/polaris/circuitbreaker/example/ServiceBController.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.example; - -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * Service B Controller. - * - * @author Haotian Zhang - */ -@RestController -@RequestMapping("/example/service/b") -public class ServiceBController { - - /** - * Get service information. - * - * @return service information - */ - @GetMapping("/info") - public String info() { - return "hello world ! I'm a service B1"; - } - - @GetMapping("/health") - public String health() { - System.out.println("health check: 200 instance"); - return "hello world ! I'm a service B1"; - } - - @GetMapping("/health-svc") - public String healthsvc() { - System.out.println("health-svc check: 200 instance"); - return "hello world ! I'm a service B1"; - } -} diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/src/main/resources/bootstrap.yml deleted file mode 100644 index ffed6a22c..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,13 +0,0 @@ -server: - port: 48081 -spring: - application: - name: polaris-circuitbreaker-callee-service - cloud: - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true - stat: - enabled: true - port: 28082 diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/pom.xml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/pom.xml deleted file mode 100644 index 204331a2a..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/pom.xml +++ /dev/null @@ -1,61 +0,0 @@ - - - - polaris-circuitbreaker-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - polaris-circuitbreaker-callee-service2 - Polaris Circuit Breaker Callee Example 2 - - - - org.springframework.boot - spring-boot-starter-webflux - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.0 - - - attach-sources - - jar - - - - - - - diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/src/main/java/com/tencent/cloud/polaris/ciruitbreaker/example/ServiceB2.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/src/main/java/com/tencent/cloud/polaris/ciruitbreaker/example/ServiceB2.java deleted file mode 100644 index fb6bdc687..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/src/main/java/com/tencent/cloud/polaris/ciruitbreaker/example/ServiceB2.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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.ciruitbreaker.example; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Circuit breaker example callee application. - * - * @author Haotian Zhang - */ -@SpringBootApplication -public class ServiceB2 { - - public static void main(String[] args) { - SpringApplication.run(ServiceB2.class, args); - } -} diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/src/main/java/com/tencent/cloud/polaris/ciruitbreaker/example/ServiceBController.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/src/main/java/com/tencent/cloud/polaris/ciruitbreaker/example/ServiceBController.java deleted file mode 100644 index 2d5287c3a..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/src/main/java/com/tencent/cloud/polaris/ciruitbreaker/example/ServiceBController.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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.ciruitbreaker.example; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.springframework.http.HttpStatus; -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.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; -import org.springframework.web.bind.annotation.RestController; - -/** - * Service B Controller. - * - * @author Haotian Zhang - */ -@RestController -@RequestMapping("/example/service/b") -public class ServiceBController { - - private static final Logger LOG = LoggerFactory.getLogger(ServiceBController.class); - - private boolean ifBadGateway = true; - - private boolean ifDelay = true; - - @GetMapping("/setBadGateway") - public void setBadGateway(@RequestParam boolean param) { - if (param) { - LOG.info("info is set to return HttpStatus.BAD_GATEWAY."); - } - else { - LOG.info("info is set to return HttpStatus.OK."); - } - this.ifBadGateway = param; - } - - @GetMapping("/setDelay") - public void setDelay(@RequestParam boolean param) { - if (param) { - LOG.info("info is set to delay 100ms."); - } - else { - LOG.info("info is set to no delay."); - } - this.ifDelay = param; - } - - /** - * Get service information. - * - * @return service information - */ - @GetMapping("/info") - public ResponseEntity info() throws InterruptedException { - if (ifBadGateway) { - return new ResponseEntity<>("failed for call my service", HttpStatus.BAD_GATEWAY); - } - if (ifDelay) { - Thread.sleep(100); - } - return new ResponseEntity<>("hello world ! I'm a service B2", HttpStatus.OK); - } - - @GetMapping("/health") - @ResponseStatus(value = HttpStatus.BAD_GATEWAY, reason = "failed for call my service") - public String health() { - System.out.println("health check: 502 instance"); - return "hello world ! I'm a service B1"; - } - - @GetMapping("/health-svc") - @ResponseStatus(value = HttpStatus.BAD_GATEWAY, reason = "failed for call my service") - public String healthsvc() { - System.out.println("health-svc check: 502 instance"); - return "hello world ! I'm a service B1"; - } -} diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/src/main/resources/bootstrap.yml deleted file mode 100644 index 4909643f7..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-callee-service2/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,13 +0,0 @@ -server: - port: 48082 -spring: - application: - name: polaris-circuitbreaker-callee-service - cloud: - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true - stat: - enabled: true - port: 28083 diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/pom.xml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/pom.xml deleted file mode 100644 index a45ce9336..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/pom.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - polaris-circuitbreaker-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - polaris-circuitbreaker-feign-example - Polaris Circuit Breaker Feign Example - - - - org.springframework.boot - spring-boot-starter-web - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-circuitbreaker - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - org.springframework.boot - spring-boot-starter-actuator - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.0 - - - attach-sources - - jar - - - - - - - - \ No newline at end of file diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ServiceAController.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ServiceAController.java deleted file mode 100644 index 30aa94c49..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ServiceAController.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * Circuit breaker example caller controller. - * - * @author sean yu - */ -@RestController -@RequestMapping("/example/service/a") -public class ServiceAController { - - @Autowired - private ProviderB polarisServiceB; - - @Autowired - private ProviderBWithFallback providerBWithFallback; - - /** - * Get info of Service B by Feign. - * @return info of Service B - */ - @GetMapping("/getBServiceInfo/fallbackFromCode") - public String getBServiceInfoFallbackFromCode() { - return providerBWithFallback.info(); - } - - /** - * Get info of Service B by Feign. - * @return info of Service B - */ - @GetMapping("/getBServiceInfo/fallbackFromPolaris") - public String getBServiceInfoFallbackFromPolaris() { - return polarisServiceB.info(); - } - -} diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ServiceAFeign.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ServiceAFeign.java deleted file mode 100644 index f6a012bb0..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ServiceAFeign.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * 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.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.openfeign.EnableFeignClients; - -/** - * Circuit breaker example caller application. - * - * @author sean yu - */ -@SpringBootApplication -@EnableFeignClients -public class ServiceAFeign { - - public static void main(String[] args) { - SpringApplication.run(ServiceAFeign.class, args); - } - -} diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/resources/bootstrap.yml deleted file mode 100644 index 0afe7375d..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,30 +0,0 @@ -server: - port: 48080 -spring: - application: - name: polaris-circuitbreaker-feign-example - cloud: - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true - loadbalancer: - enabled: true - circuitbreaker: - enabled: true - -feign: - circuitbreaker: - enabled: true - -logging: - level: - root: info - com.tencent.cloud: debug - -management: - endpoints: - web: - exposure: - include: - - polaris-circuit-breaker diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/pom.xml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/pom.xml deleted file mode 100644 index 833f2e51e..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/pom.xml +++ /dev/null @@ -1,92 +0,0 @@ - - - - polaris-circuitbreaker-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - polaris-circuitbreaker-gateway-example - Polaris Circuit Breaker Gateway Example - - - - spring-cloud-starter-tencent-polaris-discovery - com.tencent.cloud - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-circuitbreaker - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-router - - - - com.tencent.cloud - spring-cloud-tencent-gateway-plugin - - - - com.tencent.cloud - spring-cloud-starter-tencent-metadata-transfer - - - - com.tencent.cloud - spring-cloud-tencent-featureenv-plugin - - - - org.springframework.cloud - spring-cloud-starter-gateway - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - org.springframework.boot - spring-boot-starter-actuator - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.0 - - - attach-sources - - jar - - - - - - - - \ No newline at end of file diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/gateway/example/GatewayScgApplication.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/gateway/example/GatewayScgApplication.java deleted file mode 100644 index ea042b2f9..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/gateway/example/GatewayScgApplication.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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.gateway.example; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * SCG application. - * - * @author sean yu - */ -@SpringBootApplication -public class GatewayScgApplication { - - public static void main(String[] args) { - SpringApplication.run(GatewayScgApplication.class, args); - } - -} diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/src/main/resources/bootstrap.yml deleted file mode 100644 index 1c946649c..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,65 +0,0 @@ -server: - session-timeout: 1800 - port: 48080 -spring: - application: - name: GatewayScgService - cloud: - tencent: - plugin: - scg: - staining: - enabled: true - rule-staining: - enabled: true - router: - feature-env: - enabled: true - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true - gateway: - discovery: - locator: - enabled: true - 'predicates[0]': - name: Path - args: - patterns: '''/'' + serviceId + ''/**''' - 'filters[0]': - name: RewritePath - args: - regexp: '''/'' + serviceId + ''/(?.*)''' - replacement: '''/$\{remaining}''' - 'filters[1]': - name: CircuitBreaker - args: - # statusCodes 缺省时会自动识别 "5**" 为错误 - # statusCodes: '''404,5**''' - # fallbackUri 缺省时会在熔断触发后拉取 plaris server 配置的降级作为 response - fallbackUri: '''forward:/polaris-fallback''' -# routes: -# - id: polaris-circuitbreaker-callee-service -# uri: lb://polaris-circuitbreaker-callee-service -# predicates: -# - Path=/polaris-circuitbreaker-callee-service/** -# filters: -# - StripPrefix=1 -# - name: CircuitBreaker -# args: -# statusCodes: 502 -# fallbackUri: forward:/polaris-fallback -logging: - level: - root: info - com.tencent.polaris.discovery.client.flow.RegisterFlow: off - com.tencent.polaris.plugins.registry: off - com.tencent.cloud: debug - -management: - endpoints: - web: - exposure: - include: - - polaris-circuit-breaker diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/pom.xml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/pom.xml deleted file mode 100644 index 942c7587f..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - polaris-circuitbreaker-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - polaris-circuitbreaker-resttemplate-example - Polaris Circuit Breaker RestTemplate Example - - - - org.springframework.boot - spring-boot-starter-web - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-circuitbreaker - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - org.springframework.boot - spring-boot-starter-actuator - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.0 - - - attach-sources - - jar - - - - - - - - \ No newline at end of file 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 deleted file mode 100644 index d17744ce3..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/ServiceAController.java +++ /dev/null @@ -1,74 +0,0 @@ -/* - * 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.resttemplate.example; - - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.cloud.client.circuitbreaker.CircuitBreakerFactory; -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; - -/** - * Circuit breaker example caller controller. - * - * @author sean yu - */ -@RestController -@RequestMapping("/example/service/a") -public class ServiceAController { - - @Autowired - @Qualifier("defaultRestTemplate") - private RestTemplate defaultRestTemplate; - - @Autowired - @Qualifier("restTemplateFallbackFromPolaris") - private RestTemplate restTemplateFallbackFromPolaris; - - @Autowired - @Qualifier("restTemplateFallbackFromCode") - private RestTemplate restTemplateFallbackFromCode; - - @Autowired - private CircuitBreakerFactory circuitBreakerFactory; - - @GetMapping("/getBServiceInfo") - public String getBServiceInfo() { - return circuitBreakerFactory - .create("polaris-circuitbreaker-callee-service#/example/service/b/info") - .run(() -> - defaultRestTemplate.getForObject("/example/service/b/info", String.class), - throwable -> "trigger the refuse for service b" - ); - } - - @GetMapping("/getBServiceInfo/fallbackFromPolaris") - public ResponseEntity getBServiceInfoFallback() { - return restTemplateFallbackFromPolaris.getForEntity("/example/service/b/info", String.class); - } - - @GetMapping("/getBServiceInfo/fallbackFromCode") - public ResponseEntity getBServiceInfoFallbackClass() { - return restTemplateFallbackFromCode.getForEntity("/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 deleted file mode 100644 index fb6495912..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/ServiceAResTemplate.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * 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.resttemplate.example; - -import com.tencent.cloud.polaris.circuitbreaker.resttemplate.PolarisCircuitBreaker; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.util.DefaultUriBuilderFactory; - -/** - * Circuit breaker example caller application. - * - * @author sean yu - */ -@SpringBootApplication -public class ServiceAResTemplate { - - public static void main(String[] args) { - SpringApplication.run(ServiceAResTemplate.class, args); - } - - @Bean - @LoadBalanced - public RestTemplate defaultRestTemplate() { - DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory("http://polaris-circuitbreaker-callee-service"); - RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(uriBuilderFactory); - return restTemplate; - } - - @Bean - @LoadBalanced - @PolarisCircuitBreaker - public RestTemplate restTemplateFallbackFromPolaris() { - DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory("http://polaris-circuitbreaker-callee-service"); - RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(uriBuilderFactory); - return restTemplate; - } - - @Bean - @LoadBalanced - @PolarisCircuitBreaker(fallbackClass = CustomFallback.class) - public RestTemplate restTemplateFallbackFromCode() { - DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory("http://polaris-circuitbreaker-callee-service"); - RestTemplate restTemplate = new RestTemplate(); - restTemplate.setUriTemplateHandler(uriBuilderFactory); - return restTemplate; - } - -} diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/resources/bootstrap.yml deleted file mode 100644 index 9cd52b817..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,26 +0,0 @@ -server: - port: 48080 -spring: - application: - name: polaris-circuitbreaker-resttemplate-example - cloud: - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true - loadbalancer: - enabled: true - circuitbreaker: - enabled: true - -logging: - level: - root: info - com.tencent.cloud: debug - -management: - endpoints: - web: - exposure: - include: - - polaris-circuit-breaker diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/pom.xml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/pom.xml deleted file mode 100644 index 5e85be2d8..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/pom.xml +++ /dev/null @@ -1,77 +0,0 @@ - - - - polaris-circuitbreaker-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - polaris-circuitbreaker-webclient-example - Polaris Circuit Breaker WebClient Example - - - - org.springframework.boot - spring-boot-starter-webflux - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - org.springframework.cloud - spring-cloud-starter-loadbalancer - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-circuitbreaker - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - org.springframework.boot - spring-boot-starter-actuator - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.0 - - - attach-sources - - jar - - - - - - - - \ No newline at end of file diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/webclient/example/ServiceAController.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/webclient/example/ServiceAController.java deleted file mode 100644 index 72f3c80d5..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/webclient/example/ServiceAController.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.webclient.example; - -import reactor.core.publisher.Mono; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.cloud.client.circuitbreaker.ReactiveCircuitBreakerFactory; -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.reactive.function.client.WebClient; - -/** - * Circuit breaker example caller controller. - * - * @author sean yu - */ -@RestController -@RequestMapping("/example/service/a") -public class ServiceAController { - - @Autowired - private ReactiveCircuitBreakerFactory reactiveCircuitBreakerFactory; - - @Autowired - private WebClient.Builder webClientBuilder; - - @GetMapping("/getBServiceInfo") - public Mono getBServiceInfo() { - return webClientBuilder - .build() - .get() - .uri("/example/service/b/info") - .retrieve() - .bodyToMono(String.class) - .transform(it -> - reactiveCircuitBreakerFactory - .create("polaris-circuitbreaker-callee-service#/example/service/b/info") - .run(it, throwable -> Mono.just("fallback: trigger the refuse for service b")) - ); - } - -} diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/webclient/example/ServiceAWebClient.java b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/webclient/example/ServiceAWebClient.java deleted file mode 100644 index 8104ae873..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/webclient/example/ServiceAWebClient.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.webclient.example; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.web.reactive.function.client.WebClient; - -/** - * Circuit breaker example caller application. - * - * @author sean yu - */ -@SpringBootApplication -public class ServiceAWebClient { - - public static void main(String[] args) { - SpringApplication.run(ServiceAWebClient.class, args); - } - - @LoadBalanced - @Bean - WebClient.Builder webClientBuilder() { - return WebClient.builder() - .baseUrl("http://polaris-circuitbreaker-callee-service"); - } -} diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/resources/bootstrap.yml deleted file mode 100644 index 9c6f22fde..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-webclient-example/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,26 +0,0 @@ -server: - port: 48080 -spring: - application: - name: polaris-circuitbreaker-webclient-example - cloud: - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true - loadbalancer: - enabled: true - circuitbreaker: - enabled: true - -logging: - level: - root: info - com.tencent.cloud: debug - -management: - endpoints: - web: - exposure: - include: - - polaris-circuit-breaker diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/pom.xml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/pom.xml deleted file mode 100644 index 8e53f8d77..000000000 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/pom.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - spring-cloud-tencent-examples - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - polaris-circuitbreaker-example - Polaris Circuit Breaker Example - pom - - - polaris-circuitbreaker-feign-example - polaris-circuitbreaker-gateway-example - polaris-circuitbreaker-resttemplate-example - polaris-circuitbreaker-webclient-example - polaris-circuitbreaker-callee-service - polaris-circuitbreaker-callee-service2 - - diff --git a/spring-cloud-tencent-examples/polaris-config-example/README-zh.md b/spring-cloud-tencent-examples/polaris-config-example/README-zh.md deleted file mode 100644 index f131d319e..000000000 --- a/spring-cloud-tencent-examples/polaris-config-example/README-zh.md +++ /dev/null @@ -1,77 +0,0 @@ -# Polaris Config Example 使用指南 - -## 1. bootstrap.yml 配置 - -修改 resources/bootstrap.yml ```spring.cloud.polaris.config.address``` 北极星服务端地址。 -> 注意是在 bootstrap.yml 里配置,而不是在 application.yml 里配置。因为配置中心相关的配置是在 bootstrap 阶段依赖的配置。 - -```` yaml -spring: - application: - name: polaris-config-example - cloud: - polaris: - namespace: dev - config: - address: grpc://127.0.0.1:8093 # the address of polaris config server - auto-refresh: true # auto refresh when config file changed - groups: - - name: ${spring.application.name} # group name - files: [ "config/application.properties", "config/bootstrap.yml" ] # config/application.properties takes precedence over config/bootstrap.yml -```` - -## 2. 在北极星服务端创建配置文件 - -### 2.1 创建 namespace (dev) -### 2.2 创建配置文件分组(polaris-config-example) - -北极星的配置文件分组概念为一组配置文件的集合,推荐应用名=分组名,例如在我们的示例中,新建一个 polaris-config-example 的分组。 -把 polaris-config-example 应用的配置文件都放在 polaris-config-example 分组下,这样便于配置管理。 - -### 2.3 创建两个配置文件 config/application.properties 、config/bootstrap.yml - -北极星配置中心的控制台,配置文件名可以通过 / 来按树状目录结构展示,通过树状结构可以清晰的管理配置文件。 - -#### 2.3.1 config/application.properties 文件内容 - - ```` properties -timeout = 3000 -```` - -#### 2.3.2 config/bootstrap.yml 文件内容 - -````yaml -teacher: - name : 张三 - age: 38 -```` - -页面样例如下图所示: - -![](polaris-config-ui.png) - -## 3. 运行 PolarisConfigExampleApplication - -## 4. 访问接口 - -```` -curl "http://localhost:48084/timeout" - -curl "http://localhost:48084/person" -```` - -## 5. 动态推送能力 - -### 5.1 管控台动态修改并发布 config/application.properties - - ```` properties -timeout = 5000 -```` - -### 5.2 再次访问接口 -```` -curl "http://localhost:48084/timeout" -```` - - - diff --git a/spring-cloud-tencent-examples/polaris-config-example/polaris-config-ui.png b/spring-cloud-tencent-examples/polaris-config-example/polaris-config-ui.png deleted file mode 100644 index ebc5a0c0685add833b80398afe158c6313960be9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116372 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
KFN5nov7T#yQ{b5QS^- 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 z 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 V(zwO=-8}er - - - - spring-cloud-tencent-examples - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - polaris-config-example - - - - org.springframework.boot - spring-boot-starter-web - - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-config - - - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.0 - - - attach-sources - - jar - - - - - - - - diff --git a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/ConfigController.java b/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/ConfigController.java deleted file mode 100644 index b4fe1a3e7..000000000 --- a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/ConfigController.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.config.example; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.env.Environment; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * the endpoint for get config. - * - * @author lepdou 2022-03-10 - */ -@RestController -public class ConfigController { - - @Value("${timeout:1000}") - private int timeout; - - @Autowired - private Person person; - - @Autowired - private Environment environment; - - @GetMapping("/timeout") - public int timeout() { - environment.getProperty("timeout", "1000"); - return timeout; - } - - @GetMapping("/person") - public String person() { - return person.toString(); - } -} diff --git a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/Person.java b/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/Person.java deleted file mode 100644 index 3b3348ea4..000000000 --- a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/Person.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * 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.config.example; - -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - * example property object. - * - * @author lepdou 2022-03-28 - */ -@Component -@ConfigurationProperties(prefix = "teacher") -public class Person { - - private String name; - - private int age; - - private boolean isDirector; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - - public boolean isDirector() { - return isDirector; - } - - public void setIsDirector(boolean isDirector) { - this.isDirector = isDirector; - } - - @Override - public String toString() { - return "User{" + "name='" + name + '\'' + ", age=" + age + ", isDirector=" + isDirector + '\'' + '}'; - } -} diff --git a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/PersonConfigChangeListener.java b/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/PersonConfigChangeListener.java deleted file mode 100644 index 108b22038..000000000 --- a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/PersonConfigChangeListener.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * 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.config.example; - -import java.util.Set; - -import com.tencent.cloud.polaris.config.annotation.PolarisConfigKVFileChangeListener; -import com.tencent.cloud.polaris.config.listener.ConfigChangeEvent; - -import org.springframework.stereotype.Component; - -/** - * Custom Config Listener Example . - * - * @author Palmer Xu 2022-06-06 - */ -@Component -public final class PersonConfigChangeListener { - - /** - * PolarisConfigKVFileChangeListener Example . - * @param event instance of {@link ConfigChangeEvent} - */ - @PolarisConfigKVFileChangeListener(interestedKeyPrefixes = "teacher") - public void onChange(ConfigChangeEvent event) { - Set changedKeys = event.changedKeys(); - - for (String changedKey : changedKeys) { - System.out.printf("%s = %s , ThreadId: %s\n", changedKey, event.getChange(changedKey), Thread.currentThread().getId()); - } - } - - @PolarisConfigKVFileChangeListener(interestedKeyPrefixes = "teacher", async = false) - public void syncListen(ConfigChangeEvent event) { - Set changedKeys = event.changedKeys(); - - for (String changedKey : changedKeys) { - System.out.printf("%s = %s , ThreadId: %s\n", changedKey, event.getChange(changedKey), Thread.currentThread().getId()); - } - } - - @PolarisConfigKVFileChangeListener(interestedKeyPrefixes = "teacher", async = false) - public void syncListen2(ConfigChangeEvent event) { - Set changedKeys = event.changedKeys(); - - for (String changedKey : changedKeys) { - System.out.printf("%s = %s , ThreadId: %s\n", changedKey, event.getChange(changedKey), Thread.currentThread().getId()); - } - } -} diff --git a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/PolarisConfigExampleApplication.java b/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/PolarisConfigExampleApplication.java deleted file mode 100644 index 37544956b..000000000 --- a/spring-cloud-tencent-examples/polaris-config-example/src/main/java/com/tencent/cloud/polaris/config/example/PolarisConfigExampleApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.config.example; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * example application starter. - * - * @author lepdou 2022-03-10 - */ -@SpringBootApplication -public class PolarisConfigExampleApplication { - - public static void main(String[] args) { - SpringApplication.run(PolarisConfigExampleApplication.class, args); - } -} diff --git a/spring-cloud-tencent-examples/polaris-config-example/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-config-example/src/main/resources/bootstrap.yml deleted file mode 100644 index b06e6de23..000000000 --- a/spring-cloud-tencent-examples/polaris-config-example/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,24 +0,0 @@ -server: - port: 48084 -spring: - application: - name: polaris-config-example - profiles: - active: abc - cloud: - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - config: - auto-refresh: true # auto refresh when config file changed - # data-source: local # config data source default is polaris. - # local-file-root-path: # set root path for reading config file, when in local data source - groups: - - name: ${spring.application.name} # group name - files: [ "config/application.properties", "config/bootstrap.yml" ] # config/application.properties takes precedence over config/bootstrap.yml -management: - endpoints: - web: - exposure: - include: - - polaris-config diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/README-zh.md b/spring-cloud-tencent-examples/polaris-discovery-example/README-zh.md deleted file mode 100644 index 851860f06..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/README-zh.md +++ /dev/null @@ -1,67 +0,0 @@ -# Spring Cloud Polaris Discovery example - -## 样例简介 - -本样例将介绍如何在Spring Cloud项目中使用```spring-cloud-starter-tencent-polaris-discovery```以使用其各项功能。 - -该样例分为两个微服务,即 ```discovery-caller-service``` 和 ```discovery-callee-service ```。 -其中 ```discovery-caller-service``` 调用 ```discovery-callee-service``` - -## 使用说明 - -### 修改配置 - -修改 resource/bootstrap.yml 中北极星的服务端地址 - -```yaml -spring: - cloud: - polaris: - address: grpc://${ip}:8091 -``` - -### 启动样例 - -#### 启动Polaris后端服务 - -参考[Polaris Getting Started](https://github.com/PolarisMesh/polaris#getting-started)。 - -#### 启动应用 - -- IDEA启动 - -分别启动 - -1. ```spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service```下的```DiscoveryCallerService``` -2. ```spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service```下的```DiscoveryCalleeService``` - -### 验证 - -#### 调用 discovery-caller-service 暴露的接口 - -执行以下命令发起Feign调用,其逻辑为```DiscoveryCalleeService```返回 value1+value2 的和 - -```shell -curl -L -X GET 'http://localhost:48080/discovery/service/caller/feign?value1=1&value2=2' -``` - -预期返回值 - -``` -3 -``` - -#### RestTemplate调用 - -执行以下命令发起RestTemplate调用,其逻辑为```DiscoveryCalleeService```返回一段字符串 - -```shell -curl -L -X GET 'http://localhost:48080/discovery/service/caller/rest' -``` - -预期返回值 - -``` -Discovery Service Callee -``` - diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/README.md b/spring-cloud-tencent-examples/polaris-discovery-example/README.md deleted file mode 100644 index c9280f6f4..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# Spring Cloud Polaris Discovery example - -## Example Introduction - -This example shows how to use ```spring-cloud-starter-tencent-polaris-discovery`` in Spring Cloud project for its features. - -This example is divided to two microservice, discovery-caller-service and discovery-callee-service. In these two microservices, discovery-caller-service invokes discovery-callee-service. - -## Instruction - -### Configuration - -The configuration is as the following shows. ${ip} and ${port} are Polaris backend IP address and port number. - -```yaml -spring: - application: - name: ${application.name} - cloud: - polaris: - address: ${ip}:${port} -``` - -### Launching Example - -#### Launching Polaris Backend Service - -Reference to [Polaris Getting Started](https://github.com/PolarisMesh/polaris#getting-started) - -#### Launching Application - -- IDEA Launching - -Launching ```spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service```'s ```DiscoveryCallerService``` and ```spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service```'s ```DiscoveryCalleeService``` - -- Maven Package Launching - -Execute under ```spring-cloud-tencent-examples/polaris-discovery-example``` - -```sh -mvn clean package -``` - -Then at ```discovery-caller-service``` and ```discovery-callee-service``` find the package that generates jar, and run it - -``` -java -jar ${app.jar} -``` - -Launch application, change ${app.jar} to jar's package name - -### Verify - -#### Feign Invoke - -Execute the following orders to invoke Feign, ```DiscoveryCalleeService``` goes bank to the sum of value1+value2 - -```shell -curl -L -X GET 'http://localhost:48080/discovery/service/caller/feign?value1=1&value2=2' -``` - -Expected return rate - -``` -3 -``` - -#### RestTemplate Invoke - -Execute the following orders to invoke RestTemplate, ```DiscoveryCalleeService``` goes back to string characters - -```shell -curl -L -X GET 'http://localhost:48080/discovery/service/caller/rest' -``` - -Expected return rate - -``` -Discovery Service Callee -``` - diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml deleted file mode 100644 index 312b45c1a..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/pom.xml +++ /dev/null @@ -1,76 +0,0 @@ - - - - polaris-discovery-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - discovery-callee-service - Polaris Discovery Callee Service - - - - org.springframework.boot - spring-boot-starter-webflux - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-contract - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - - - - - - - - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.0 - - - attach-sources - - jar - - - - - - - diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/CustomMetadata.java b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/CustomMetadata.java deleted file mode 100644 index fbfa22614..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/CustomMetadata.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.discovery.service.callee; - -import java.util.HashMap; -import java.util.Map; - -import com.tencent.cloud.common.spi.InstanceMetadataProvider; - -import org.springframework.stereotype.Component; - -/** - * custom metadata for instance. - * - * @author lepdou 2022-06-16 - */ -@Component -public class CustomMetadata implements InstanceMetadataProvider { - - @Override - public Map getMetadata() { - Map metadata = new HashMap<>(); - metadata.put("k1", "v1"); - return metadata; - } - - @Override - public String getZone() { - return "shanghai-zone-1"; - } -} diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/DiscoveryCalleeController.java b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/DiscoveryCalleeController.java deleted file mode 100644 index a15336393..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/DiscoveryCalleeController.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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.discovery.service.callee; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -/** - * Discovery callee controller. - * - * @author Haotian Zhang - */ -@RestController -@RequestMapping("/discovery/service/callee") -public class DiscoveryCalleeController { - - private static final Logger LOG = LoggerFactory.getLogger(DiscoveryCalleeController.class); - - @Value("${server.port:0}") - private int port; - - @Value("${spring.cloud.client.ip-address:127.0.0.1}") - private String ip; - - /** - * Get information of callee. - * - * @return information of callee - */ - @GetMapping("/info") - public String info() { - LOG.info("Discovery Service Callee [{}:{}] is called.", ip, port); - return String.format("Discovery Service Callee [%s:%s] is called.", ip, port); - } - - /** - * Get sum of two value. - * - * @param value1 value 1 - * @param value2 value 2 - * @return sum - */ - @GetMapping("/sum") - public int sum(@RequestParam int value1, @RequestParam int value2) { - LOG.info("Discovery Service Callee [{}:{}] is called and sum is {}.", ip, port, value1 + value2); - return value1 + value2; - } -} diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/DiscoveryCalleeService.java b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/DiscoveryCalleeService.java deleted file mode 100644 index 9063ae984..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/java/com/tencent/cloud/polaris/discovery/service/callee/DiscoveryCalleeService.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.discovery.service.callee; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Discovery callee application. - * - * @author Haotian Zhang - */ -@SpringBootApplication -public class DiscoveryCalleeService { - - public static void main(String[] args) { - SpringApplication.run(DiscoveryCalleeService.class, args); - } -} diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/bootstrap.yml deleted file mode 100644 index 1f3a5b9e5..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-callee-service/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,53 +0,0 @@ -server: - port: ${random.int(7003,7005)} -spring: - application: - name: DiscoveryCalleeService - cloud: - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true - discovery: - enabled: true - register: true - contract: - exposure: true - stat: - enabled: true - port: 28082 - # pushgateway: - # enabled: true - # address: 127.0.0.1:9091 - tencent: - metadata: - content: - region: shanghai - rpc-enhancement: - reporter: - enabled: true -# consul: -# port: 8500 -# host: 127.0.0.1 -# enabled: true -# discovery: -# enabled: true -# register: true -# instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}:${server.port} -# service-name: ${spring.application.name} -# ip-address: localhost -# prefer-ip-address: true -# nacos: -# enabled: true -# password: nacos -# username: nacos -# discovery: -# enabled: true -# register-enabled: true -# group: polaris -# server-addr: 127.0.0.1:8848 - -#eureka: -# client: -# serviceUrl: -# defaultZone: http://127.0.0.1:7654/eureka/ diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml deleted file mode 100644 index f6a28f36e..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - polaris-discovery-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - discovery-caller-service - Polaris Discovery Caller Service - - - 1.8 - - - - - org.springframework.boot - spring-boot-starter-web - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-contract - - - - - - - - - - - - - - - - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.0 - - - attach-sources - - jar - - - - - - - diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCalleeService.java b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCalleeService.java deleted file mode 100644 index 44d20df14..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCalleeService.java +++ /dev/null @@ -1,40 +0,0 @@ -/* - * 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.discovery.service.caller; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestParam; - -/** - * Discovery callee feign client. - * - * @author Haotian Zhang - */ -@FeignClient(value = "DiscoveryCalleeService", fallback = DiscoveryCalleeServiceFallback.class) -public interface DiscoveryCalleeService { - - /** - * Get sum of two value. - * @param value1 value 1 - * @param value2 value 2 - * @return sum - */ - @GetMapping("/discovery/service/callee/sum") - int sum(@RequestParam("value1") int value1, @RequestParam("value2") int value2); -} diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCalleeServiceFallback.java b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCalleeServiceFallback.java deleted file mode 100644 index 3b78eb3bc..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCalleeServiceFallback.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.discovery.service.caller; - -import org.springframework.stereotype.Component; - -/** - * Discovery callee feign client fallback. - * - * @author Haotian Zhang - */ -@Component -public class DiscoveryCalleeServiceFallback implements DiscoveryCalleeService { - - @Override - public int sum(int value1, int value2) { - return 0; - } -} diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCallerController.java b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCallerController.java deleted file mode 100644 index 166441cd6..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCallerController.java +++ /dev/null @@ -1,70 +0,0 @@ -/* - * 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.discovery.service.caller; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; - -/** - * Discovery caller controller. - * - * @author Haotian Zhang - */ -@RestController -@RequestMapping("/discovery/service/caller") -public class DiscoveryCallerController { - - @Autowired - private RestTemplate restTemplate; - - @Autowired - private DiscoveryCalleeService discoveryCalleeService; - - /** - * Get sum of two value. - * @param value1 value 1 - * @param value2 value 2 - * @return sum - */ - @RequestMapping("/feign") - public int feign(@RequestParam int value1, @RequestParam int value2) { - return discoveryCalleeService.sum(value1, value2); - } - - /** - * Get information of callee. - * @return information of callee - */ - @GetMapping("/rest") - public String rest() { - return restTemplate.getForObject("http://DiscoveryCalleeService/discovery/service/callee/info", String.class); - } - - /** - * health check. - * @return health check info - */ - @GetMapping("/healthCheck") - public String healthCheck() { - return "pk ok"; - } -} diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCallerService.java b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCallerService.java deleted file mode 100644 index 5c447313c..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/java/com/tencent/cloud/polaris/discovery/service/caller/DiscoveryCallerService.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.discovery.service.caller; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -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; - -/** - * Discovery caller application. - * - * @author Haotian Zhang - */ -@SpringBootApplication -@EnableDiscoveryClient -@EnableFeignClients -public class DiscoveryCallerService { - - public static void main(String[] args) { - SpringApplication.run(DiscoveryCallerService.class, args); - } - - @Bean - @LoadBalanced - public RestTemplate restTemplate() { - return new RestTemplate(); - } -} diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml deleted file mode 100644 index f75a5c4a6..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/discovery-caller-service/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,68 +0,0 @@ -server: - session-timeout: 1800 - port: 48080 -spring: - application: - name: DiscoveryCallerService - cloud: - tencent: - metadata: - content: - region: shanghai - rpc-enhancement: - reporter: - enabled: true - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true - discovery: - enabled: true - register: true - heartbeat: - enabled: true - health-check-url: /discovery/service/caller/healthCheck - contract: - exposure: true - report: - enabled: true - stat: - enabled: true - port: 28081 -# pushgateway: -# enabled: true -# address: 127.0.0.1:9091 -# consul: -# port: 8500 -# host: 127.0.0.1 -# enabled: true -# discovery: -# enabled: true -# register: true -# health-check-path: /actuator/health -# health-check-interval: 10s -# instance-id: ${spring.application.name}:${server.port} -# service-name: ${spring.application.name} -# ip-address: localhost -# prefer-ip-address: true -# nacos: -# enabled: true -# password: nacos -# username: nacos -# context-path: /nacos -# discovery: -# enabled: true -# register-enabled: true -# group: polaris -# server-addr: 127.0.0.1:8848 -# cluster-name: polaris -#eureka: -# client: -# serviceUrl: -# defaultZone: http://127.0.0.1:7654/eureka/ -management: - endpoints: - web: - exposure: - include: - - polaris-discovery diff --git a/spring-cloud-tencent-examples/polaris-discovery-example/pom.xml b/spring-cloud-tencent-examples/polaris-discovery-example/pom.xml deleted file mode 100644 index 17280e0c3..000000000 --- a/spring-cloud-tencent-examples/polaris-discovery-example/pom.xml +++ /dev/null @@ -1,38 +0,0 @@ - - - - spring-cloud-tencent-examples - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - polaris-discovery-example - pom - Spring Cloud Starter Tencent Polaris Discovery Example - - - discovery-callee-service - discovery-caller-service - - - - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/README-zh.md b/spring-cloud-tencent-examples/polaris-gateway-example/README-zh.md deleted file mode 100644 index ff4d480f3..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/README-zh.md +++ /dev/null @@ -1,68 +0,0 @@ -# Spring Cloud Polaris Gateway example - -## 样例简介 - -本样例将介绍如何在Spring Cloud项目中使用```spring-cloud-tencent-polaris-gateway```以使用其各项功能。 - -本样例包括 ```gateway-scg-service```和```gateway-callee-service```。```gateway-scg-service```调用```gateway-callee-service```。 - -## 使用说明 - -### 修改配置 - -配置如下所示。其中,${ip}和${port}为Polaris后端服务的IP地址与端口号。 - -```yaml -spring: - application: - name: ${application.name} - cloud: - polaris: - address: ${ip}:${port} -``` - -### 启动样例 - -#### 启动Polaris后端服务 - -参考[Polaris Getting Started](https://github.com/PolarisMesh/polaris#getting-started)。 - -#### 启动应用 - -- IDEA启动 - -分别启动```spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service```的```GatewayScgService```和```spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service```的```GatewayCalleeService``` - -- Maven打包启动 - -在```spring-cloud-tencent-examples/polaris-gateway-example```下执行 - -```sh -mvn clean package -``` - -然后在 ```gateway-scg-service```和```gateway-callee-service```下找到生成的jar包,运行 - -``` -java -jar ${app.jar} -``` - -启动应用,其中${app.jar}替换为对应的jar包名。 - -### 验证 - -#### Spring-Cloud-Gateway调用 - -```shell -curl -L -X GET 'http://localhost:48083/GatewayCalleeService/gateway/example/callee/echo' -H 'SCT-CUSTOM-METADATA: {"b": 2}' -``` - -预期返回值 - -``` -{"a":"1","b":2} -``` - -#### 网关限流 - -参考[Polaris RateLimit Example](../polaris-ratelimit-example/README-zh.md) diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/README.md b/spring-cloud-tencent-examples/polaris-gateway-example/README.md deleted file mode 100644 index 4f33c625b..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/README.md +++ /dev/null @@ -1,69 +0,0 @@ -# Spring Cloud Polaris Gateway example - -## Example Introduction - -This example shows how to use ```spring-cloud-tencent-polaris-gateway``` in Spring Cloud project for its features. - -This example contains ```gateway-scg-service``` and ```gateway-callee-service```. ```gateway-scg-service``` invoke ```gateway-callee-service```. - -## Instruction - -### Configuration - -The configuration is as the following shows. ${ip} and ${port} are Polaris backend IP address and port number. - -```yaml -spring: - application: - name: ${application.name} - cloud: - polaris: - address: ${ip}:${port} -``` - -### Launching Example - -#### Launching Polaris Backend Service - -Reference to [Polaris Getting Started](https://github.com/PolarisMesh/polaris#getting-started) - -#### Launching Application - -- IDEA Launching - -Launching ```spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service```'s ```GatewayScgService``` and ```spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service```'s ```GatewayCalleeService``` - -- Maven Package Launching - -Execute under ```spring-cloud-tencent-examples/polaris-gateway-example``` - -```sh -mvn clean package -``` - -Then find the jars under ```gateway-scg-service``` and ```gateway-callee-service```, and run it: - -``` -java -jar ${app.jar} -``` - -Launch application, change ${app.jar} to jar's package name. - -### Verify - -#### Spring-Cloud-Gateway Invoke - -```shell -curl -L -X GET 'http://localhost:48083/GatewayCalleeService/gateway/example/callee/echo' -H 'SCT-CUSTOM-METADATA: {"b": 2}' -``` - -Expected return rate - -``` -{"a":"1","b":2} -``` - -#### Gateway Rate Limit - -See [Polaris RateLimit Example](../polaris-ratelimit-example/README.md) - diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/pom.xml b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/pom.xml deleted file mode 100644 index cc37a455b..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - polaris-gateway-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - gateway-callee-service - Spring Cloud Starter Tencent Polaris Gateway Callee Example - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - com.tencent.cloud - spring-cloud-starter-tencent-metadata-transfer - - - - org.springframework.boot - spring-boot-starter-web - - - diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeApplication.java b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeApplication.java deleted file mode 100644 index 57d205e5e..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.gateway.example.callee; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Gateway callee application. - * - * @author Haotian Zhang - */ -@SpringBootApplication -public class GatewayCalleeApplication { - - public static void main(String[] args) { - SpringApplication.run(GatewayCalleeApplication.class, args); - } -} diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeController.java b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeController.java deleted file mode 100644 index 7736ed640..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeController.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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.gateway.example.callee; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; - -import com.tencent.cloud.common.constant.MetadataConstant; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; - -/** - * Gateway callee controller. - * - * @author Haotian Zhang - */ -@RestController -@RequestMapping("/gateway/example/callee") -public class GatewayCalleeController { - - private static Logger LOG = LoggerFactory.getLogger(GatewayCalleeController.class); - - @Value("${server.port:0}") - private int port; - - /** - * Get information of callee. - * @return information of callee - */ - @RequestMapping("/info") - public String info() { - LOG.info("Gateway Example Callee [{}] is called.", port); - return String.format("Gateway Example Callee [%s] is called.", port); - } - - /** - * Get metadata in HTTP header. - * - * @param metadataStr metadata string - * @return metadata in HTTP header - * @throws UnsupportedEncodingException encoding exception - */ - @RequestMapping("/echo") - public String echoHeader(@RequestHeader(MetadataConstant.HeaderName.CUSTOM_METADATA) String metadataStr) - throws UnsupportedEncodingException { - LOG.info(URLDecoder.decode(metadataStr, UTF_8)); - metadataStr = URLDecoder.decode(metadataStr, UTF_8); - return metadataStr; - } -} diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/resources/bootstrap.yml deleted file mode 100644 index 9bf39bb82..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,14 +0,0 @@ -server: - session-timeout: 1800 - port: 48081 -spring: - application: - name: GatewayCalleeService - cloud: - tencent: - metadata: - content: - env: blue - polaris: - address: grpc://119.91.66.223:8091 - namespace: default diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/pom.xml b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/pom.xml deleted file mode 100644 index 1f0a2d1b9..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - - polaris-gateway-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - gateway-callee-service2 - Spring Cloud Starter Tencent Polaris Gateway Callee Example - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - com.tencent.cloud - spring-cloud-starter-tencent-metadata-transfer - - - - org.springframework.boot - spring-boot-starter-web - - - diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeApplication2.java b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeApplication2.java deleted file mode 100644 index f6a942abd..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeApplication2.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.gateway.example.callee; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Gateway callee application. - * - * @author Haotian Zhang - */ -@SpringBootApplication -public class GatewayCalleeApplication2 { - - public static void main(String[] args) { - SpringApplication.run(GatewayCalleeApplication2.class, args); - } -} diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeController.java b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeController.java deleted file mode 100644 index 7736ed640..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/src/main/java/com/tencent/cloud/polaris/gateway/example/callee/GatewayCalleeController.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * 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.gateway.example.callee; - -import java.io.UnsupportedEncodingException; -import java.net.URLDecoder; - -import com.tencent.cloud.common.constant.MetadataConstant; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; - -/** - * Gateway callee controller. - * - * @author Haotian Zhang - */ -@RestController -@RequestMapping("/gateway/example/callee") -public class GatewayCalleeController { - - private static Logger LOG = LoggerFactory.getLogger(GatewayCalleeController.class); - - @Value("${server.port:0}") - private int port; - - /** - * Get information of callee. - * @return information of callee - */ - @RequestMapping("/info") - public String info() { - LOG.info("Gateway Example Callee [{}] is called.", port); - return String.format("Gateway Example Callee [%s] is called.", port); - } - - /** - * Get metadata in HTTP header. - * - * @param metadataStr metadata string - * @return metadata in HTTP header - * @throws UnsupportedEncodingException encoding exception - */ - @RequestMapping("/echo") - public String echoHeader(@RequestHeader(MetadataConstant.HeaderName.CUSTOM_METADATA) String metadataStr) - throws UnsupportedEncodingException { - LOG.info(URLDecoder.decode(metadataStr, UTF_8)); - metadataStr = URLDecoder.decode(metadataStr, UTF_8); - return metadataStr; - } -} diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/src/main/resources/bootstrap.yml deleted file mode 100644 index 83f98b12f..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-callee-service2/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,14 +0,0 @@ -server: - session-timeout: 1800 - port: 48082 -spring: - application: - name: GatewayCalleeService - cloud: - tencent: - metadata: - content: - env: green - polaris: - address: grpc://119.91.66.223:8091 - namespace: default diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/pom.xml b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/pom.xml deleted file mode 100644 index 1d9887427..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - - polaris-gateway-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - gateway-scg-service - Spring Cloud Starter Tencent Polaris Gateway SCG Example - - - - spring-cloud-starter-tencent-polaris-discovery - com.tencent.cloud - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-ratelimit - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-router - - - - com.tencent.cloud - spring-cloud-tencent-gateway-plugin - - - - com.tencent.cloud - spring-cloud-starter-tencent-metadata-transfer - - - - com.tencent.cloud - spring-cloud-tencent-featureenv-plugin - - - - org.springframework.cloud - spring-cloud-starter-gateway - - - diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/src/main/java/com/tencent/cloud/polaris/gateway/example/scg/GatewayScgApplication.java b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/src/main/java/com/tencent/cloud/polaris/gateway/example/scg/GatewayScgApplication.java deleted file mode 100644 index 7bf729994..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/src/main/java/com/tencent/cloud/polaris/gateway/example/scg/GatewayScgApplication.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * 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.gateway.example.scg; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * SCG application. - * - * @author Haotian Zhang - */ -@SpringBootApplication -public class GatewayScgApplication { - - public static void main(String[] args) { - SpringApplication.run(GatewayScgApplication.class, args); - } -} diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/src/main/resources/bootstrap.yml deleted file mode 100644 index 7f1aa5671..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/gateway-scg-service/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,68 +0,0 @@ -server: - session-timeout: 1800 - port: 48083 -spring: - application: - name: GatewayScgService - cloud: - tencent: - plugin: - scg: - staining: - enabled: true - rule-staining: - enabled: true - router: - feature-env: - enabled: true - metadata: - content: - a: 1 - transitive: - - a - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true - gateway: - discovery: - locator: - enabled: true - 'predicates[0]': - name: Path - args: - patterns: '''/'' + serviceId + ''/**''' - 'filters[0]': - name: RewritePath - args: - regexp: '''/'' + serviceId + ''/(?.*)''' - replacement: '''/$\{remaining}''' - 'filters[1]': - name: Retry - args: - retries: 3 - exceptions: - '[0]': '''java.net.ConnectException''' - '[1]': '''java.io.IOException''' - statuses: - '[0]': '''BAD_GATEWAY''' - '[1]': '''SERVICE_UNAVAILABLE''' - series: - '[0]': '''CLIENT_ERROR''' - methods: - '[0]': '''GET''' - '[1]': '''POST''' - '[2]': '''PUT''' - '[3]': '''DELETE''' - backoff: - firstBackoff: '''100ms''' - maxBackoff: '''500ms''' - factor: 2 - basedOnPreviousValue: false - routes: - - id: GatewayCalleeService - uri: lb://GatewayCalleeService - predicates: - - Path=/GatewayCalleeService/** - filters: - - StripPrefix=1 diff --git a/spring-cloud-tencent-examples/polaris-gateway-example/pom.xml b/spring-cloud-tencent-examples/polaris-gateway-example/pom.xml deleted file mode 100644 index b2529024a..000000000 --- a/spring-cloud-tencent-examples/polaris-gateway-example/pom.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - spring-cloud-tencent-examples - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - polaris-gateway-example - pom - Spring Cloud Starter Tencent Polaris Gateway Example - - - gateway-scg-service - gateway-callee-service - gateway-callee-service2 - - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - - diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/README-zh.md b/spring-cloud-tencent-examples/polaris-ratelimit-example/README-zh.md deleted file mode 100644 index c7a952f9a..000000000 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/README-zh.md +++ /dev/null @@ -1,64 +0,0 @@ -# Spring Cloud Polaris RateLimit Example - -## 项目说明 - -本项目演示如何使用 Polaris ratelimit starter 完成 Spring Cloud 应用的限流管理。 - -## 示例 - -### 如何接入 - -在启动示例进行演示之前,我们先了解一下如何接入 Polaris 限流组件。 - -> **注意:本章节只是为了便于您理解接入方式,本示例代码中已经完成接入工作,您无需再进行修改。** - -1. 首先,修改 `pom.xml` 文件,引入 Polaris ratelimit starter。 - ```xml - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-ratelimit - - ``` - -2. 启动应用 - - 北极星提供的example都支持在IDE中直接运行,或者编译打包后通过命令行方式进行运行。 - - 在本地启动Polaris服务端。 - - 在北极星服务端,可以通过控制台,在命名空间Production下,添加服务RateLimitCalleeService。 - - 启动服务被调方: - 1. IDE直接启动:找到主类 `RateLimitCalleeService`,执行 main 方法启动应用。 - 2. 打包编译后启动:首先执行 `mvn clean package` 将工程编译打包 - - 执行 `java -jar ratelimit-callee-sevice-${verion}.jar`启动应用 - - 执行 `java -jar ratelimit-caller-sevice-${verion}.jar`启动应用 - - 启动后,可以在北极星控制台上看到注册上来的服务实例信息。 - -3. 调用服务 - - 通过浏览器访问http://127.0.0.1:58080/business/invoke,可以看到以下输出信息: - ```` - hello world for ratelimit service 1 - hello world for ratelimit service 2 - hello world for ratelimit service 3 - ... - ```` - -4. 配置限流规则并验证 - 北极星提供了三个方式进行限流规则的配置(控制台、HTTP接口以及本地文件)。 - - - 使用的方式为通过HTTP接口进行配置。通过以下命令来配置: - ```` - curl -X POST -H "Content-Type:application/json" 127.0.0.1:8090/naming/v1/ratelimits -d @rule.json - ```` - - 通过控制台进行配置,示例如下: - ![](polaris-ratelimit-ui.png) - - -5. 验证限流效果 - 继续访问http://127.0.0.1:48081/business/invoke,可以看到,10次调用后,就开始被限流: - ```` - hello world for ratelimit service 1 - hello world for ratelimit service 2 - ... - hello world for ratelimit service 10 - request has been limited, service is RateLimitCalleeService, path is /business/invoke, 11 - ```` \ No newline at end of file diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/README.md b/spring-cloud-tencent-examples/polaris-ratelimit-example/README.md deleted file mode 100644 index 5df8f78ba..000000000 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# Spring Cloud Polaris RateLimit Example - -## Project Explanation - -This project shows how to use ratelimit feature of Polaris to complete Spring Cloud application's rate limit - -## Example - -### How to access - -Before showcasing the project, let's get to know how to access Polaris rate limit component - -> ** note: this chapter is to help you understand different ways to access, the codes in the example has been executed, you don't need to re-edit.** - -1, first, change document `pom.xml`, introduce Polaris ratelimit starter - - ```xml - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-ratelimit - - ``` - -2. Launch Application - -Examples provided by Polaris all support to run at IDE, or compile and run with orders - -- Launch Polaris locally - -- at Polaris end, through control panel, under namespace Product, add RateLimitCalleeService - -- Launch callee server: - - 1. Launch IDE directly: First find `RateLimitCalleeService`, execute main then launch application - 2. compile package then launch: first execute `mvn clean package` compile the package - - then execute `java -jar ratelimit-callee-sevice-${verion}.jar` execute the application - - then execute `java -jar ratelimit-caller-sevice-${verion}.jar` execute the application - - After launching, one can watch server instance from Polaris control panel - - 3. Invoke Service - - After visiting http://127.0.0.1:58080/business/invoke, one can see the following information: - - ```` - hello world for ratelimit service 1 - hello world for ratelimit service 2 - hello world for ratelimit service 3 - ... - ```` - -4. Configuration rate limit and verification - Polaris provide three wats to conduct rate limit configuration (control panel, HTTP port and local files) - - - HTTP configuration. One can figure with the following steps: - - ```` - curl -X POST -H "Content-Type:application/json" 127.0.0.1:8090/naming/v1/ratelimits -d @rule.json - ```` - - - Configuration is done through the console, example as follows. - - ![](polaris-ratelimit-ui.png) - -5. Verify rate limit result - continue visit http://127.0.0.1:68080/business/invoke, one can see, after 10 invokes, rate limit will start: - - ```` - hello world for ratelimit service 1 - hello world for ratelimit service 2 - - ```` \ No newline at end of file diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/polaris-ratelimit-ui.png b/spring-cloud-tencent-examples/polaris-ratelimit-example/polaris-ratelimit-ui.png deleted file mode 100644 index 402fef4f5f5525c1e2fdf77c8607a52736a60fdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 393571 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

Fsl_w(XEOhN&#xIvaYW2aX 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

    1J?NiOBRHEt)t6nL81y`oIFf{l_eyBD;? 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 DD3(fo diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/pom.xml b/spring-cloud-tencent-examples/polaris-ratelimit-example/pom.xml deleted file mode 100644 index de8c7941a..000000000 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/pom.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - spring-cloud-tencent-examples - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - polaris-ratelimit-example - pom - Spring Cloud Starter Tencent Polaris RateLimit Example - - - ratelimit-callee-service - ratelimit-caller-service - - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - \ No newline at end of file diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/pom.xml b/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/pom.xml deleted file mode 100644 index 613cf24f7..000000000 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/pom.xml +++ /dev/null @@ -1,50 +0,0 @@ - - - - polaris-ratelimit-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - ratelimit-callee-service - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-webflux - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-ratelimit - - - - org.springframework.boot - spring-boot-starter-actuator - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/BusinessController.java b/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/BusinessController.java deleted file mode 100644 index 747d657b4..000000000 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/BusinessController.java +++ /dev/null @@ -1,183 +0,0 @@ -/* - * 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.ratelimit.example.service.callee; - -import java.util.ArrayList; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import reactor.core.publisher.Mono; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -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.HttpClientErrorException.TooManyRequests; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; - -/** - * Rate limit controller. - * - * @author Haotian Zhang - */ -@Deprecated -@RestController -@RequestMapping("/business") -public class BusinessController { - - private static final Logger LOG = LoggerFactory.getLogger(BusinessController.class); - - private final AtomicInteger index = new AtomicInteger(0); - private final AtomicLong lastTimestamp = new AtomicLong(0); - @Autowired - private RestTemplate restTemplate; - @Autowired - private WebClient.Builder webClientBuilder; - @Value("${spring.application.name}") - private String appName; - - @Value("${server.port:0}") - private int port; - - @Value("${spring.cloud.client.ip-address:127.0.0.1}") - private String ip; - - /** - * Get information. - * @return information - */ - @GetMapping("/info") - public String info() { - return String.format("hello world for ratelimit service %s [%s:%s] is called.", index.incrementAndGet(), ip, port); - } - - @GetMapping("/info/webclient") - public Mono infoWebClient() { - return Mono.just(String.format("hello world for ratelimit service %s [%s:%s] is called.", index.incrementAndGet(), ip, port)); - } - - @GetMapping("/invoke/webclient") - public String invokeInfoWebClient() throws InterruptedException, ExecutionException { - StringBuffer builder = new StringBuffer(); - WebClient webClient = webClientBuilder.baseUrl("http://" + appName).build(); - List> monoList = new ArrayList<>(); - for (int i = 0; i < 30; i++) { - Mono response = webClient.get() - .uri(uriBuilder -> uriBuilder - .path("/business/info/webclient") - .queryParam("yyy", "yyy") - .build() - ) - .header("xxx", "xxx") - .retrieve() - .bodyToMono(String.class) - .doOnSuccess(s -> builder.append(s).append("\n")) - .doOnError(e -> { - if (e instanceof WebClientResponseException) { - if (((WebClientResponseException) e).getRawStatusCode() == 429) { - builder.append("TooManyRequests ").append(index.incrementAndGet()).append("\n"); - } - } - }) - .onErrorReturn(""); - monoList.add(response); - } - for (Mono mono : monoList) { - mono.toFuture().get(); - } - index.set(0); - return builder.toString(); - } - - /** - * Get information 30 times per 1 second. - * - * @return result of 30 calls. - * @throws InterruptedException exception - */ - @GetMapping("/invoke") - public String invokeInfo() throws InterruptedException { - StringBuffer builder = new StringBuffer(); - CountDownLatch count = new CountDownLatch(30); - for (int i = 0; i < 30; i++) { - new Thread(() -> { - try { - HttpHeaders httpHeaders = new HttpHeaders(); - httpHeaders.add("xxx", "xxx"); - ResponseEntity entity = restTemplate.exchange( - "http://" + appName + "/business/info?yyy={yyy}", - HttpMethod.GET, - new HttpEntity<>(httpHeaders), - String.class, - "yyy" - ); - builder.append(entity.getBody()).append("\n"); - } - catch (RestClientException e) { - if (e instanceof TooManyRequests) { - builder.append("TooManyRequests ").append(index.incrementAndGet()).append("\n"); - } - else { - throw e; - } - } - catch (Exception e) { - e.printStackTrace(); - } - finally { - count.countDown(); - } - }).start(); - } - count.await(); - index.set(0); - return builder.toString(); - } - - /** - * Get information with unirate. - * - * @return information - */ - @GetMapping("/unirate") - public String unirate() { - long currentTimestamp = System.currentTimeMillis(); - long lastTime = lastTimestamp.get(); - if (lastTime != 0) { - LOG.info("Current timestamp:" + currentTimestamp + ", diff from last timestamp:" + (currentTimestamp - lastTime)); - } - else { - LOG.info("Current timestamp:" + currentTimestamp); - } - lastTimestamp.set(currentTimestamp); - return "hello world for ratelimit service with diff from last request:" + (currentTimestamp - lastTime) + "ms."; - } -} diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/RateLimitCalleeService.java b/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/RateLimitCalleeService.java deleted file mode 100644 index c8a49d2a7..000000000 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/RateLimitCalleeService.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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.ratelimit.example.service.callee; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.reactive.function.client.WebClient; - -/** - * Rate limit application. - * - * @author Haotian Zhang - */ -@SpringBootApplication -public class RateLimitCalleeService { - - public static void main(String[] args) { - SpringApplication.run(RateLimitCalleeService.class, args); - } - - @Bean - @LoadBalanced - public RestTemplate restTemplate() { - return new RestTemplate(); - } - - - @LoadBalanced - @Bean - WebClient.Builder webClientBuilder() { - return WebClient.builder(); - } -} diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/resources/bootstrap.yml deleted file mode 100644 index 59a592e6c..000000000 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,29 +0,0 @@ -server: - port: 48081 -spring: - application: - name: RateLimitCalleeService - cloud: - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true - ratelimit: - enabled: true - rejectRequestTipsFilePath: reject-tips.html - maxQueuingTime: 500 - stat: - enabled: true - port: 28083 -management: - endpoints: - web: - exposure: - include: - - polaris-ratelimit -logging: - level: - com.tencent.cloud.polaris: debug - -label: - key-value: user:zhangsan, user2:lisi diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/pom.xml b/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/pom.xml deleted file mode 100644 index a2b3f4dcc..000000000 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/pom.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - 4.0.0 - - polaris-ratelimit-example - com.tencent.cloud - ${revision} - ../pom.xml - - - ratelimit-caller-service - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-webflux - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-ratelimit - - - - org.springframework.boot - spring-boot-starter-actuator - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - - \ No newline at end of file diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/src/main/java/com/tencent/cloud/ratelimit/example/service/caller/Controller.java b/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/src/main/java/com/tencent/cloud/ratelimit/example/service/caller/Controller.java deleted file mode 100644 index f169e0116..000000000 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/src/main/java/com/tencent/cloud/ratelimit/example/service/caller/Controller.java +++ /dev/null @@ -1,185 +0,0 @@ -/* - * 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.ratelimit.example.service.caller; - -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.atomic.AtomicInteger; -import java.util.concurrent.atomic.AtomicLong; -import java.util.function.Consumer; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import reactor.core.publisher.Mono; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestHeader; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.HttpClientErrorException.TooManyRequests; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.reactive.function.client.WebClient; -import org.springframework.web.reactive.function.client.WebClientResponseException; - -@RestController -@RequestMapping("/business") -public class Controller { - - private static final Logger LOG = LoggerFactory.getLogger(Controller.class); - - private final AtomicInteger index = new AtomicInteger(0); - private final AtomicLong lastTimestamp = new AtomicLong(0); - @Autowired - private RestTemplate restTemplate; - @Autowired - private WebClient.Builder webClientBuilder; - - private final String appName = "RateLimitCalleeService"; - - /** - * Get information. - * @return information - */ - @GetMapping("/info") - public String info() { - return "hello world for ratelimit service " + index.incrementAndGet(); - } - - @GetMapping("/info/webclient") - public Mono infoWebClient() { - return Mono.just("hello world for ratelimit service " + index.incrementAndGet()); - } - - @GetMapping("/invoke/webclient") - public String invokeInfoWebClient(@RequestParam(defaultValue = "value1", required = false) String value1, @RequestParam(defaultValue = "value1", required = false) String value2, @RequestHeader Map headers) throws InterruptedException, ExecutionException { - StringBuffer builder = new StringBuffer(); - WebClient webClient = webClientBuilder.baseUrl("http://" + appName).build(); - - Consumer headersConsumer = httpHeaders -> { - for (Map.Entry entry : headers.entrySet()) { - httpHeaders.add(entry.getKey(), entry.getValue()); - } - }; - - List> monoList = new ArrayList<>(); - for (int i = 0; i < 30; i++) { - Mono response = webClient.get() - .uri(uriBuilder -> uriBuilder - .path("/business/info/webclient") - .queryParam("value1", value1) - .queryParam("value2", value2) - .build() - ) - .headers(headersConsumer) - .retrieve() - .bodyToMono(String.class) - .doOnSuccess(s -> builder.append(s).append("\n")) - .doOnError(e -> { - if (e instanceof WebClientResponseException) { - if (((WebClientResponseException) e).getRawStatusCode() == 429) { - builder.append("TooManyRequests ").append(index.incrementAndGet()).append("\n"); - } - } - }) - .onErrorReturn(""); - monoList.add(response); - } - for (Mono mono : monoList) { - mono.toFuture().get(); - } - index.set(0); - return builder.toString(); - } - - /** - * Get information 30 times per 1 second. - * - * @return result of 30 calls. - * @throws InterruptedException exception - */ - @GetMapping("/invoke") - public String invokeInfo(@RequestParam(defaultValue = "value1", required = false) String value1, @RequestParam(defaultValue = "value1", required = false) String value2, @RequestHeader Map headers) throws InterruptedException { - StringBuffer builder = new StringBuffer(); - CountDownLatch count = new CountDownLatch(30); - for (int i = 0; i < 30; i++) { - new Thread(() -> { - try { - HttpHeaders httpHeaders = new HttpHeaders(); - for (Map.Entry entry : headers.entrySet()) { - httpHeaders.add(entry.getKey(), entry.getValue()); - } - ResponseEntity entity = restTemplate.exchange( - "http://" + appName + "/business/info?value1={value1}&value2={value2}", - HttpMethod.GET, - new HttpEntity<>(httpHeaders), - String.class, - value1, value2 - ); - builder.append(entity.getBody()).append("\n"); - } - catch (RestClientException e) { - if (e instanceof TooManyRequests) { - builder.append("TooManyRequests ").append(index.incrementAndGet()).append("\n"); - } - else { - throw e; - } - } - catch (Exception e) { - e.printStackTrace(); - } - finally { - count.countDown(); - } - }).start(); - } - count.await(); - index.set(0); - return builder.toString(); - } - - /** - * Get information with unirate. - * - * @return information - */ - @GetMapping("/unirate") - public String unirate() { - long currentTimestamp = System.currentTimeMillis(); - long lastTime = lastTimestamp.get(); - if (lastTime != 0) { - LOG.info("Current timestamp:" + currentTimestamp + ", diff from last timestamp:" + (currentTimestamp - lastTime)); - } - else { - LOG.info("Current timestamp:" + currentTimestamp); - } - lastTimestamp.set(currentTimestamp); - return "hello world for ratelimit service with diff from last request:" + (currentTimestamp - lastTime) + "ms."; - } - -} diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/src/main/java/com/tencent/cloud/ratelimit/example/service/caller/RateLimitCallerService.java b/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/src/main/java/com/tencent/cloud/ratelimit/example/service/caller/RateLimitCallerService.java deleted file mode 100644 index b4d550e4a..000000000 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/src/main/java/com/tencent/cloud/ratelimit/example/service/caller/RateLimitCallerService.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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.ratelimit.example.service.caller; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.loadbalancer.LoadBalanced; -import org.springframework.context.annotation.Bean; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.reactive.function.client.WebClient; - -@SpringBootApplication -public class RateLimitCallerService { - - private static final Logger LOG = LoggerFactory.getLogger(RateLimitCallerService.class); - - public static void main(String[] args) { - SpringApplication.run(RateLimitCallerService.class, args); - } - - @Bean - @LoadBalanced - public RestTemplate restTemplate() { - return new RestTemplate(); - } - - - @LoadBalanced - @Bean - WebClient.Builder webClientBuilder() { - return WebClient.builder(); - } - -} diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/src/main/resources/bootstrap.yml deleted file mode 100644 index 7a7fb9cee..000000000 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-caller-service/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,21 +0,0 @@ -server: - port: 58080 -spring: - application: - name: RateLimitCallerService - cloud: - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true - -management: - endpoints: - web: - exposure: - include: - - polaris-ratelimit -logging: - level: - com.tencent.cloud.polaris: debug - diff --git a/spring-cloud-tencent-examples/polaris-router-example/pom.xml b/spring-cloud-tencent-examples/polaris-router-example/pom.xml deleted file mode 100644 index 5ae91d8bf..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/pom.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - spring-cloud-tencent-examples - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - polaris-router-example - pom - - - router-callee-service1 - router-callee-service2 - router-caller-service - - diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/pom.xml b/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/pom.xml deleted file mode 100644 index ee07d5401..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - polaris-router-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - router-callee-service1 - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.0 - - - attach-sources - - jar - - - - - - - diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeApplication1.java b/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeApplication1.java deleted file mode 100644 index 9c36234c4..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeApplication1.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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.router.example; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Router callee application. - * - * @author lepdou 2022-04-06 - */ -@SpringBootApplication -public class RouterCalleeApplication1 { - - public static void main(String[] args) { - SpringApplication.run(RouterCalleeApplication1.class, args); - } -} diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeController.java b/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeController.java deleted file mode 100644 index ead2c1fe1..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeController.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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.router.example; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * Discovery callee controller. - * - * @author lepdou 2022-04-06 - */ -@RestController -@RequestMapping("/router/service/callee") -public class RouterCalleeController { - - private static Logger LOG = LoggerFactory.getLogger(RouterCalleeController.class); - - @Value("${server.port:0}") - private int port; - - /** - * Get information of callee. - * @return information of callee - */ - @PostMapping("/info") - public String info(String name, @RequestBody User user) { - LOG.info("Discovery Service Callee [{}] is called.", port); - return String.format("Discovery Service Callee [%s] is called. user = %s", port, user); - } -} diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/java/com/tencent/cloud/polaris/router/example/User.java b/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/java/com/tencent/cloud/polaris/router/example/User.java deleted file mode 100644 index ff83552db..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/java/com/tencent/cloud/polaris/router/example/User.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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.router.example; - -/** - * demo object. - * @author lepdou 2022-05-12 - */ -public class User { - - private String name; - private int age; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - @Override - public String toString() { - return "User{" + - "name='" + name + '\'' + - ", age=" + age + - '}'; - } -} diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/resources/bootstrap.yml deleted file mode 100644 index e3248f4da..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service1/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,14 +0,0 @@ -server: - port: 48081 -spring: - application: - name: RouterCalleeService - cloud: - tencent: - metadata: - content: - label1: value1 - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/pom.xml b/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/pom.xml deleted file mode 100644 index 8ee075153..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/pom.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - polaris-router-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - router-callee-service2 - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - org.springframework.boot - spring-boot-starter-webflux - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.0 - - - attach-sources - - jar - - - - - - - diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeApplication2.java b/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeApplication2.java deleted file mode 100644 index 076a002f0..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeApplication2.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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.router.example; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -/** - * Router callee application. - * - * @author lepdou 2022-04-06 - */ -@SpringBootApplication -public class RouterCalleeApplication2 { - - public static void main(String[] args) { - SpringApplication.run(RouterCalleeApplication2.class, args); - } -} diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeController.java b/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeController.java deleted file mode 100644 index 075887766..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeController.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * 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.router.example; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; - -/** - * Discovery callee controller. - * - * @author lepdou 2022-04-06 - */ -@RestController -@RequestMapping("/router/service/callee") -public class RouterCalleeController { - - private static Logger LOG = LoggerFactory.getLogger(RouterCalleeController.class); - - @Value("${server.port:0}") - private int port; - - /** - * Get information of callee. - * @return information of callee - */ - @PostMapping("/info") - public String info(@RequestParam("name") String name, @RequestBody User user) { - LOG.info("Discovery Service Callee [{}] is called.", port); - return String.format("Discovery Service Callee [%s] is called. user = %s", port, user); - } -} diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/java/com/tencent/cloud/polaris/router/example/User.java b/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/java/com/tencent/cloud/polaris/router/example/User.java deleted file mode 100644 index ff83552db..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/java/com/tencent/cloud/polaris/router/example/User.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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.router.example; - -/** - * demo object. - * @author lepdou 2022-05-12 - */ -public class User { - - private String name; - private int age; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } - - @Override - public String toString() { - return "User{" + - "name='" + name + '\'' + - ", age=" + age + - '}'; - } -} diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/resources/bootstrap.yml deleted file mode 100644 index ff4805761..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-callee-service2/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,14 +0,0 @@ -server: - port: 48082 -spring: - application: - name: RouterCalleeService - cloud: - tencent: - metadata: - content: - label1: value2 - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/pom.xml b/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/pom.xml deleted file mode 100644 index b0e7fe847..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/pom.xml +++ /dev/null @@ -1,82 +0,0 @@ - - - - polaris-router-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 - - router-caller-service - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-discovery - - - - com.tencent.cloud - spring-cloud-starter-tencent-polaris-router - - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-actuator - - - - org.springframework.cloud - spring-cloud-starter-openfeign - - - - org.springframework.cloud - spring-cloud-starter-bootstrap - - - - com.google.code.gson - gson - 2.9.0 - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - repackage - - - - - - org.apache.maven.plugins - maven-source-plugin - 3.2.0 - - - attach-sources - - jar - - - - - - - - diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/CustomSpringWebRouterLabelResolver.java b/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/CustomSpringWebRouterLabelResolver.java deleted file mode 100644 index c0a84bf5f..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/CustomSpringWebRouterLabelResolver.java +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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.router.example; - -import java.util.HashMap; -import java.util.Map; -import java.util.Set; - -import com.google.gson.Gson; -import com.tencent.cloud.polaris.router.spi.SpringWebRouterLabelResolver; - -import org.springframework.http.HttpRequest; -import org.springframework.stereotype.Component; - -/** - * Custom router label resolver for spring web request. - * @author lepdou 2022-07-20 - */ -@Component -public class CustomSpringWebRouterLabelResolver implements SpringWebRouterLabelResolver { - private final Gson gson = new Gson(); - - @Override - public int getOrder() { - return 0; - } - - @Override - public Map resolve(HttpRequest request, byte[] body, Set expressionLabelKeys) { - Map labels = new HashMap<>(); - User user = gson.fromJson(new String(body), User.class); - - labels.put("user", user.getName()); - return labels; - } -} diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeService.java b/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeService.java deleted file mode 100644 index d8f7df0ff..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/RouterCalleeService.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * 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.router.example; - -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; - -/** - * Router callee feign client. - * - * @author lepdou 2022-04-06 - */ -@FeignClient("RouterCalleeService") -public interface RouterCalleeService { - - @PostMapping("/router/service/callee/info") - String info(@RequestParam("name") String name, @RequestBody User user); -} diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/RouterCallerApplication.java b/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/RouterCallerApplication.java deleted file mode 100644 index a3b05e6fd..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/RouterCallerApplication.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * 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.router.example; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.client.discovery.EnableDiscoveryClient; -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; - -/** - * Router caller application. - * - * @author lepdou 2022-04-06 - */ -@SpringBootApplication -@EnableDiscoveryClient -@EnableFeignClients -public class RouterCallerApplication { - - public static void main(String[] args) { - SpringApplication.run(RouterCallerApplication.class, args); - } - - @Bean - @LoadBalanced - public RestTemplate restTemplate() { - return new RestTemplate(); - } -} diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/RouterCallerController.java b/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/RouterCallerController.java deleted file mode 100644 index f296393a0..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/RouterCallerController.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * 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.router.example; - -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.client.RestTemplate; - -/** - * Discovery caller controller. - * - * @author lepdou 2022-04-06 - */ -@RestController -@RequestMapping("/router/service/caller") -public class RouterCallerController { - - @Autowired - private RestTemplate restTemplate; - - @Autowired - private RouterCalleeService routerCalleeService; - - /** - * Get info of two value. - * @return info - */ - @GetMapping("/feign") - public String feign(@RequestParam String name) { - User user = new User(); - user.setName(name); - user.setAge(18); - return routerCalleeService.info(name, user); - } - - /** - * Get information of callee. - * @return information of callee - */ - @GetMapping("/rest") - public String rest(@RequestParam String name) { - User user = new User(); - user.setName(name); - user.setAge(18); - return restTemplate.postForObject( - "http://RouterCalleeService/router/service/callee/info?name={name}", user, String.class, name); - } - - /** - * health check. - * @return health check info - */ - @GetMapping("/healthCheck") - public String healthCheck() { - return "pk ok"; - } -} diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/User.java b/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/User.java deleted file mode 100644 index f68c6fff4..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/User.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.router.example; - -/** - * demo object. - * @author lepdou 2022-05-12 - */ -public class User { - - private String name; - private int age; - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public int getAge() { - return age; - } - - public void setAge(int age) { - this.age = age; - } -} diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/resources/bootstrap.yml deleted file mode 100644 index 8a2ef8e34..000000000 --- a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/resources/bootstrap.yml +++ /dev/null @@ -1,28 +0,0 @@ -server: - port: 48083 -spring: - application: - name: RouterCallerService - cloud: - tencent: - metadata: - content: - k1: v1 - rpc-enhancement: - reporter: - enabled: true - polaris: - address: grpc://119.91.66.223:8091 - namespace: default - enabled: true - loadbalancer: - enabled: true - stat: - enabled: true - port: 28081 -management: - endpoints: - web: - exposure: - include: - - polaris-router diff --git a/spring-cloud-tencent-examples/pom.xml b/spring-cloud-tencent-examples/pom.xml index 269b55d38..2d19adca7 100644 --- a/spring-cloud-tencent-examples/pom.xml +++ b/spring-cloud-tencent-examples/pom.xml @@ -17,12 +17,6 @@ multiple-discovery-example - polaris-discovery-example - polaris-ratelimit-example - polaris-circuitbreaker-example - polaris-gateway-example - polaris-config-example - polaris-router-example metadata-transfer-example polaris-router-grayrelease-example polaris-router-featureenv-example diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/pom.xml b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/pom.xml index 24e580e18..ce6588118 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/pom.xml +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/pom.xml @@ -23,6 +23,11 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-actuator + diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/QuickstartCalleeController.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/QuickstartCalleeController.java index eecf3291f..96cdacea2 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/QuickstartCalleeController.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/QuickstartCalleeController.java @@ -17,16 +17,24 @@ package com.tencent.cloud.quickstart.callee; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; + +import com.tencent.cloud.common.constant.MetadataConstant; +import com.tencent.cloud.quickstart.callee.config.DataSourceProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; + /** * Quickstart callee controller. * @@ -41,7 +49,10 @@ public class QuickstartCalleeController { @Value("${server.port:0}") private int port; - @Value("${appName:Callee}") + @Value("${spring.cloud.client.ip-address:127.0.0.1}") + private String ip; + + @Value("${appName:${spring.application.name}}") private String appName; @Autowired @@ -55,7 +66,7 @@ public class QuickstartCalleeController { */ @GetMapping("/sum") public int sum(@RequestParam int value1, @RequestParam int value2) { - LOG.info("Quickstart Callee Service is called and sum is {}.", value1 + value2); + LOG.info("Quickstart Callee Service [{}:{}] is called and sum is [{}].", ip, port, value1 + value2); return value1 + value2; } @@ -65,8 +76,23 @@ public int sum(@RequestParam int value1, @RequestParam int value2) { */ @GetMapping("/info") public String info() { - LOG.info("Quickstart [{}] Service [{}] is called. datasource = {}", appName, port, dataSourceProperties); - return String.format("Quickstart [%s] Service [%s] is called. datasource = [%s]", appName, port, dataSourceProperties); + LOG.info("Quickstart [{}] Service [{}:{}] is called. datasource = [{}].", appName, ip, port, dataSourceProperties); + return String.format("Quickstart [%s] Service [%s:%s] is called. datasource = [%s].", appName, ip, port, dataSourceProperties); + } + + /** + * Get metadata in HTTP header. + * + * @param metadataStr metadata string + * @return metadata in HTTP header + * @throws UnsupportedEncodingException encoding exception + */ + @RequestMapping("/echo") + public String echoHeader(@RequestHeader(MetadataConstant.HeaderName.CUSTOM_METADATA) String metadataStr) + throws UnsupportedEncodingException { + LOG.info(URLDecoder.decode(metadataStr, UTF_8)); + metadataStr = URLDecoder.decode(metadataStr, UTF_8); + return metadataStr; } /** @@ -76,7 +102,7 @@ public String info() { */ @GetMapping("/circuitBreak") public String circuitBreak() { - LOG.info("Quickstart Callee Service is called right."); - return "Quickstart Callee Service is called right."; + LOG.info("Quickstart Callee Service [{}:{}] is called right.", ip, port); + return String.format("Quickstart Callee Service [%s:%s] is called right.", ip, port); } } diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/CustomConfigChangeListener.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/config/CustomConfigChangeListener.java similarity index 84% rename from spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/CustomConfigChangeListener.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/config/CustomConfigChangeListener.java index 0bcfb554a..bd2b1295b 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/CustomConfigChangeListener.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/config/CustomConfigChangeListener.java @@ -15,12 +15,14 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.quickstart.callee; +package com.tencent.cloud.quickstart.callee.config; import java.util.Set; import com.tencent.cloud.polaris.config.annotation.PolarisConfigKVFileChangeListener; import com.tencent.cloud.polaris.config.listener.ConfigChangeEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -32,6 +34,8 @@ @Component public final class CustomConfigChangeListener { + private static final Logger LOG = LoggerFactory.getLogger(CustomConfigChangeListener.class); + /** * PolarisConfigKVFileChangeListener Example . * @param event instance of {@link ConfigChangeEvent} @@ -41,8 +45,7 @@ public void onChange(ConfigChangeEvent event) { Set changedKeys = event.changedKeys(); for (String changedKey : changedKeys) { - System.out.printf("%s = %s \n", changedKey, event.getChange(changedKey)); + LOG.info("{} = {}", changedKey, event.getChange(changedKey)); } } - } diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/DataSourceProperties.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/config/DataSourceProperties.java similarity index 96% rename from spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/DataSourceProperties.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/config/DataSourceProperties.java index e676cda9c..00ac67172 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/DataSourceProperties.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/config/DataSourceProperties.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.quickstart.callee; +package com.tencent.cloud.quickstart.callee.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/CustomLabelResolver.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/ratelimit/CustomLabelResolver.java similarity index 93% rename from spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/CustomLabelResolver.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/ratelimit/CustomLabelResolver.java index a4bd4376e..cdd4b97e0 100644 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/CustomLabelResolver.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/ratelimit/CustomLabelResolver.java @@ -16,7 +16,7 @@ * */ -package com.tencent.cloud.ratelimit.example.service.callee; +package com.tencent.cloud.quickstart.callee.ratelimit; import java.util.HashMap; import java.util.Map; @@ -38,6 +38,7 @@ @Component public class CustomLabelResolver implements PolarisRateLimiterLabelServletResolver { private static final Logger LOG = LoggerFactory.getLogger(CustomLabelResolver.class); + @Value("${label.key-value:}") private String[] keyValues; @@ -48,7 +49,7 @@ public Map resolve(HttpServletRequest request) { return getLabels(keyValues); } - static Map getLabels(String[] keyValues) { + private Map getLabels(String[] keyValues) { Map labels = new HashMap<>(); for (String kv : keyValues) { String key = kv.substring(0, kv.indexOf(":")); diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/resources/bootstrap.yml index 9acadf522..bf4d56b8f 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/resources/bootstrap.yml @@ -11,6 +11,16 @@ spring: discovery: enabled: true register: true + contract: + exposure: true + report: + enabled: false + stat: + enabled: true + port: 28083 + # pushgateway: + # enabled: true + # address: 127.0.0.1:9091 config: address: grpc://119.91.66.223:8093 auto-refresh: true @@ -19,8 +29,20 @@ spring: files: [ "config/callee.properties" ] ratelimit: enabled: true + rejectRequestTipsFilePath: reject-tips.html maxQueuingTime: 500 tencent: metadata: content: + label1: value1 region: huanan +management: + endpoints: + web: + exposure: + include: + - polaris-discovery + - polaris-ratelimit + - polaris-config +label: + key-value: user:zhangsan diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/resources/reject-tips.html b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/resources/reject-tips.html similarity index 100% rename from spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/resources/reject-tips.html rename to spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/resources/reject-tips.html diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/pom.xml b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/pom.xml index e25650591..0f3495e9e 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/pom.xml +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/pom.xml @@ -23,6 +23,11 @@ org.springframework.boot spring-boot-starter-webflux + + + org.springframework.boot + spring-boot-starter-actuator + diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/QuickstartCalleeController.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/QuickstartCalleeController.java index 0baf9e208..86df17d59 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/QuickstartCalleeController.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/QuickstartCalleeController.java @@ -17,18 +17,26 @@ package com.tencent.cloud.quickstart.callee; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; + +import com.tencent.cloud.common.constant.MetadataConstant; +import com.tencent.cloud.quickstart.callee.config.DataSourceProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; +import static com.tencent.cloud.common.constant.ContextConstant.UTF_8; + /** * Quickstart callee controller. * @@ -43,11 +51,16 @@ public class QuickstartCalleeController { @Value("${server.port:0}") private int port; - @Value("${appName:Callee}") + @Value("${spring.cloud.client.ip-address:127.0.0.1}") + private String ip; + + @Value("${appName:${spring.application.name}}") private String appName; @Autowired private DataSourceProperties dataSourceProperties; + private boolean ifBadGateway = true; + private boolean ifDelay = true; /** * Get sum of two value. @@ -57,7 +70,7 @@ public class QuickstartCalleeController { */ @GetMapping("/sum") public int sum(@RequestParam int value1, @RequestParam int value2) { - LOG.info("Quickstart Callee Service is called and sum is {}.", value1 + value2); + LOG.info("Quickstart Callee Service [{}:{}] is called and sum is [{}].", ip, port, value1 + value2); return value1 + value2; } @@ -67,8 +80,23 @@ public int sum(@RequestParam int value1, @RequestParam int value2) { */ @GetMapping("/info") public String info() { - LOG.info("Quickstart [{}] Service [{}] is called. datasource = {}", appName, port, dataSourceProperties); - return String.format("Quickstart [%s] Service [%s] is called. datasource = [%s]", appName, port, dataSourceProperties); + LOG.info("Quickstart [{}] Service [{}:{}] is called. datasource = [{}].", appName, ip, port, dataSourceProperties); + return String.format("Quickstart [%s] Service [%s:%s] is called. datasource = [%s].", appName, ip, port, dataSourceProperties); + } + + /** + * Get metadata in HTTP header. + * + * @param metadataStr metadata string + * @return metadata in HTTP header + * @throws UnsupportedEncodingException encoding exception + */ + @RequestMapping("/echo") + public String echoHeader(@RequestHeader(MetadataConstant.HeaderName.CUSTOM_METADATA) String metadataStr) + throws UnsupportedEncodingException { + LOG.info(URLDecoder.decode(metadataStr, UTF_8)); + metadataStr = URLDecoder.decode(metadataStr, UTF_8); + return metadataStr; } /** @@ -77,9 +105,36 @@ public String info() { * @return circuit break info */ @GetMapping("/circuitBreak") - @ResponseStatus(value = HttpStatus.BAD_GATEWAY, reason = "failed for call quickstart callee service") - public String circuitBreak() { - LOG.info("Quickstart Callee Service [{}] is called wrong.", port); - return String.format("Quickstart Callee Service [%s] is called wrong.", port); + public ResponseEntity circuitBreak() throws InterruptedException { + if (ifBadGateway) { + return new ResponseEntity<>("failed for call quickstart callee service.", HttpStatus.BAD_GATEWAY); + } + if (ifDelay) { + Thread.sleep(100); + } + LOG.info("Quickstart Callee Service [{}:{}] is called wrong.", ip, port); + return new ResponseEntity<>(String.format("Quickstart Callee Service [%s:%s] is called wrong.", ip, port), HttpStatus.OK); + } + + @GetMapping("/setBadGateway") + public void setBadGateway(@RequestParam boolean param) { + if (param) { + LOG.info("info is set to return HttpStatus.BAD_GATEWAY."); + } + else { + LOG.info("info is set to return HttpStatus.OK."); + } + this.ifBadGateway = param; + } + + @GetMapping("/setDelay") + public void setDelay(@RequestParam boolean param) { + if (param) { + LOG.info("info is set to delay 100ms."); + } + else { + LOG.info("info is set to no delay."); + } + this.ifDelay = param; } } diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/CustomConfigChangeListener.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/config/CustomConfigChangeListener.java similarity index 84% rename from spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/CustomConfigChangeListener.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/config/CustomConfigChangeListener.java index cf2e92017..bd2b1295b 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-a/src/main/java/com/tencent/cloud/quickstart/callee/CustomConfigChangeListener.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/config/CustomConfigChangeListener.java @@ -15,12 +15,14 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.quickstart.callee; +package com.tencent.cloud.quickstart.callee.config; import java.util.Set; import com.tencent.cloud.polaris.config.annotation.PolarisConfigKVFileChangeListener; import com.tencent.cloud.polaris.config.listener.ConfigChangeEvent; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; @@ -32,6 +34,8 @@ @Component public final class CustomConfigChangeListener { + private static final Logger LOG = LoggerFactory.getLogger(CustomConfigChangeListener.class); + /** * PolarisConfigKVFileChangeListener Example . * @param event instance of {@link ConfigChangeEvent} @@ -41,7 +45,7 @@ public void onChange(ConfigChangeEvent event) { Set changedKeys = event.changedKeys(); for (String changedKey : changedKeys) { - System.out.printf("%s = %s \n", changedKey, event.getChange(changedKey)); + LOG.info("{} = {}", changedKey, event.getChange(changedKey)); } } } diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/DataSourceProperties.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/config/DataSourceProperties.java similarity index 92% rename from spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/DataSourceProperties.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/config/DataSourceProperties.java index a0c6b7922..00ac67172 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/DataSourceProperties.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/config/DataSourceProperties.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.quickstart.callee; +package com.tencent.cloud.quickstart.callee.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @@ -59,7 +59,7 @@ public void setPassword(String password) { @Override public String toString() { return "jdbcUrl='" + jdbcUrl + '\'' + - ", username='" + username + '\'' + - ", password='" + password + '\''; + ", username='" + username + '\'' + + ", password='" + password + '\''; } } diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/CustomLabelResolverReactive.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/ratelimit/CustomLabelResolverReactive.java similarity index 71% rename from spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/CustomLabelResolverReactive.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/ratelimit/CustomLabelResolverReactive.java index a94662388..4a270fc62 100644 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/CustomLabelResolverReactive.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/ratelimit/CustomLabelResolverReactive.java @@ -15,18 +15,19 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.ratelimit.example.service.callee; +package com.tencent.cloud.quickstart.callee.ratelimit; +import java.util.HashMap; import java.util.Map; import com.tencent.cloud.polaris.ratelimit.spi.PolarisRateLimiterLabelReactiveResolver; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.web.server.ServerWebExchange; -import static com.tencent.cloud.ratelimit.example.service.callee.CustomLabelResolver.getLabels; - /** * resolver custom label from request. * @@ -34,13 +35,26 @@ */ @Component public class CustomLabelResolverReactive implements PolarisRateLimiterLabelReactiveResolver { + private static final Logger LOG = LoggerFactory.getLogger(CustomLabelResolverReactive.class); + @Value("${label.key-value:}") private String[] keyValues; @Override public Map resolve(ServerWebExchange exchange) { // rate limit by some request params. such as query params, headers .. - return getLabels(keyValues); } + + private Map getLabels(String[] keyValues) { + Map labels = new HashMap<>(); + for (String kv : keyValues) { + String key = kv.substring(0, kv.indexOf(":")); + String value = kv.substring(kv.indexOf(":") + 1); + labels.put(key, value); + } + + LOG.info("Current labels:{}", labels); + return labels; + } } diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/JsonPolarisRateLimiterLimitedFallback.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/ratelimit/JsonPolarisRateLimiterLimitedFallback.java similarity index 95% rename from spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/JsonPolarisRateLimiterLimitedFallback.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/ratelimit/JsonPolarisRateLimiterLimitedFallback.java index c6979728b..9c8712870 100644 --- a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/java/com/tencent/cloud/ratelimit/example/service/callee/JsonPolarisRateLimiterLimitedFallback.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/java/com/tencent/cloud/quickstart/callee/ratelimit/JsonPolarisRateLimiterLimitedFallback.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.ratelimit.example.service.callee; +package com.tencent.cloud.quickstart.callee.ratelimit; import com.tencent.cloud.polaris.ratelimit.spi.PolarisRateLimiterLimitedFallback; diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/resources/bootstrap.yml index 467fc5a00..b5c7ec0bf 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-callee-service-b/src/main/resources/bootstrap.yml @@ -11,6 +11,16 @@ spring: discovery: enabled: true register: true + contract: + exposure: true + report: + enabled: false + stat: + enabled: true + port: 28084 + # pushgateway: + # enabled: true + # address: 127.0.0.1:9091 config: address: grpc://119.91.66.223:8093 auto-refresh: true @@ -23,4 +33,15 @@ spring: tencent: metadata: content: + label1: value2 region: huanan +management: + endpoints: + web: + exposure: + include: + - polaris-discovery + - polaris-ratelimit + - polaris-config +label: + key-value: user2:lisi diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/pom.xml b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/pom.xml index 1fd0f5f53..cc72331c6 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/pom.xml +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/pom.xml @@ -23,6 +23,21 @@ org.springframework.boot spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-webflux + + + + org.springframework.cloud + spring-cloud-starter-openfeign + + + + org.springframework.boot + spring-boot-starter-actuator + diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/CustomMetadataProvider.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/CustomMetadataProvider.java similarity index 95% rename from spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/CustomMetadataProvider.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/CustomMetadataProvider.java index c904eb1f6..002ad99a0 100644 --- a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/CustomMetadataProvider.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/CustomMetadataProvider.java @@ -16,7 +16,7 @@ * */ -package com.tencent.cloud.polaris.router.example; +package com.tencent.cloud.quickstart.caller; import com.tencent.cloud.common.spi.InstanceMetadataProvider; diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCalleeService.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCalleeService.java index 16486dfc9..58d4cc650 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCalleeService.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCalleeService.java @@ -38,12 +38,4 @@ public interface QuickstartCalleeService { */ @GetMapping("/quickstart/callee/sum") int sum(@RequestParam("value1") int value1, @RequestParam("value2") int value2); - - /** - * Check circuit break. - * - * @return circuit break info - */ - @GetMapping("/quickstart/callee/circuitBreak") - String circuitBreak(); } diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCalleeServiceFallback.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCalleeServiceFallback.java index 546e503aa..1c806faac 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCalleeServiceFallback.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCalleeServiceFallback.java @@ -31,9 +31,4 @@ public class QuickstartCalleeServiceFallback implements QuickstartCalleeService public int sum(int value1, int value2) { return 0; } - - @Override - public String circuitBreak() { - return "An exception occurred in the service call and fallback"; - } } diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCallerApplication.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCallerApplication.java index 904a2a501..26fcb7eee 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCallerApplication.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCallerApplication.java @@ -17,12 +17,17 @@ package com.tencent.cloud.quickstart.caller; +import com.tencent.cloud.polaris.circuitbreaker.resttemplate.PolarisCircuitBreaker; +import com.tencent.cloud.quickstart.caller.circuitbreaker.CustomFallback; + import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; 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; /** * Quickstart caller application. @@ -42,4 +47,39 @@ public static void main(String[] args) { public RestTemplate restTemplate() { return new RestTemplate(); } + + @Bean + @LoadBalanced + public RestTemplate defaultRestTemplate() { + DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory("http://QuickstartCalleeService"); + RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(uriBuilderFactory); + return restTemplate; + } + + @Bean + @LoadBalanced + @PolarisCircuitBreaker + public RestTemplate restTemplateFallbackFromPolaris() { + DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory("http://QuickstartCalleeService"); + RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(uriBuilderFactory); + return restTemplate; + } + + @Bean + @LoadBalanced + @PolarisCircuitBreaker(fallbackClass = CustomFallback.class) + public RestTemplate restTemplateFallbackFromCode() { + DefaultUriBuilderFactory uriBuilderFactory = new DefaultUriBuilderFactory("http://QuickstartCalleeService"); + RestTemplate restTemplate = new RestTemplate(); + restTemplate.setUriTemplateHandler(uriBuilderFactory); + return restTemplate; + } + + @LoadBalanced + @Bean + WebClient.Builder webClientBuilder() { + return WebClient.builder().baseUrl("http://QuickstartCalleeService"); + } } diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCallerController.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCallerController.java index 40b1233ab..a0c17faa2 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCallerController.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/QuickstartCallerController.java @@ -22,6 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import reactor.core.publisher.Mono; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -32,6 +33,7 @@ import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; +import org.springframework.web.reactive.function.client.WebClient; /** * Quickstart caller controller. @@ -43,11 +45,16 @@ public class QuickstartCallerController { private static final Logger LOG = LoggerFactory.getLogger(QuickstartCallerController.class); + @Autowired private RestTemplate restTemplate; + @Autowired private QuickstartCalleeService quickstartCalleeService; + @Autowired + private WebClient.Builder webClientBuilder; + /** * Get sum of two value. * @param value1 value 1 @@ -72,9 +79,14 @@ public String rest() { * Get information of callee. * @return information of callee */ - @GetMapping("/circuitBreak") - public String circuitBreak() { - return quickstartCalleeService.circuitBreak(); + @GetMapping("/webclient") + public Mono webclient() { + return webClientBuilder + .build() + .get() + .uri("/quickstart/callee/echo") + .retrieve() + .bodyToMono(String.class); } /** @@ -150,8 +162,8 @@ public String unirate() throws InterruptedException { } /** - * Get information of callee. - * @return information of callee + * Get information of caller. + * @return information of caller */ @GetMapping("/info") public String info() { diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerController.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerController.java new file mode 100644 index 000000000..4d902aaa2 --- /dev/null +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerController.java @@ -0,0 +1,136 @@ +/* + * 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.quickstart.caller.circuitbreaker; + +import reactor.core.publisher.Mono; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +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; + +/** + * Controller for circuit breaker. + * + * @author Haotian Zhang + */ +@RestController +@RequestMapping("/quickstart/caller/circuitBreak") +public class CircuitBreakerController { + + @Autowired + private CircuitBreakerQuickstartCalleeService circuitBreakerQuickstartCalleeService; + + @Autowired + private CircuitBreakerQuickstartCalleeServiceWithFallback circuitBreakerQuickstartCalleeServiceWithFallback; + + @Autowired + @Qualifier("defaultRestTemplate") + private RestTemplate defaultRestTemplate; + + @Autowired + @Qualifier("restTemplateFallbackFromPolaris") + private RestTemplate restTemplateFallbackFromPolaris; + + @Autowired + @Qualifier("restTemplateFallbackFromCode") + private RestTemplate restTemplateFallbackFromCode; + + @Autowired + private CircuitBreakerFactory circuitBreakerFactory; + + @Autowired + private ReactiveCircuitBreakerFactory reactiveCircuitBreakerFactory; + + @Autowired + private WebClient.Builder webClientBuilder; + + /** + * Feign circuit breaker with fallback from Polaris. + * @return circuit breaker information of callee + */ + @GetMapping("/feign/fallbackFromPolaris") + public String circuitBreakFeignFallbackFromPolaris() { + return circuitBreakerQuickstartCalleeService.circuitBreak(); + } + + /** + * Feign circuit breaker with fallback from Polaris. + * @return circuit breaker information of callee + */ + @GetMapping("/feign/fallbackFromCode") + public String circuitBreakFeignFallbackFromCode() { + return circuitBreakerQuickstartCalleeServiceWithFallback.circuitBreak(); + } + + /** + * RestTemplate circuit breaker. + * @return circuit breaker information of callee + */ + @GetMapping("/rest") + public String circuitBreakRestTemplate() { + return circuitBreakerFactory + .create("QuickstartCalleeService#/quickstart/callee/circuitBreak") + .run(() -> defaultRestTemplate.getForObject("/quickstart/callee/circuitBreak", String.class), + throwable -> "trigger the refuse for service callee." + ); + } + + /** + * RestTemplate circuit breaker with fallback from Polaris. + * @return circuit breaker information of callee + */ + @GetMapping("/rest/fallbackFromPolaris") + public ResponseEntity circuitBreakRestTemplateFallbackFromPolaris() { + return restTemplateFallbackFromPolaris.getForEntity("/quickstart/callee/circuitBreak", String.class); + } + + /** + * RestTemplate circuit breaker with fallback from code. + * @return circuit breaker information of callee + */ + @GetMapping("/rest/fallbackFromCode") + public ResponseEntity circuitBreakRestTemplateFallbackFromCode() { + return restTemplateFallbackFromCode.getForEntity("/quickstart/callee/circuitBreak", String.class); + } + + /** + * Get information of callee. + * @return information of callee + */ + @GetMapping("/webclient") + public Mono webclient() { + return webClientBuilder + .build() + .get() + .uri("/quickstart/callee/circuitBreak") + .retrieve() + .bodyToMono(String.class) + .transform(it -> + reactiveCircuitBreakerFactory + .create("QuickstartCalleeService#/quickstart/callee/circuitBreak") + .run(it, throwable -> Mono.just("fallback: trigger the refuse for service callee")) + ); + } +} 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/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerQuickstartCalleeService.java similarity index 74% rename from spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderB.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerQuickstartCalleeService.java index 63dbbdb17..64821b9a9 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/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerQuickstartCalleeService.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.circuitbreaker.feign.example; +package com.tencent.cloud.quickstart.caller.circuitbreaker; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; @@ -25,14 +25,14 @@ * * @author sean yu */ -@FeignClient(name = "polaris-circuitbreaker-callee-service", contextId = "fallback-from-polaris") -public interface ProviderB { +@FeignClient(name = "QuickstartCalleeService", contextId = "fallback-from-polaris") +public interface CircuitBreakerQuickstartCalleeService { /** - * Get info of service B. + * Check circuit break. * - * @return info of service B + * @return circuit break info */ - @GetMapping("/example/service/b/info") - String info(); + @GetMapping("/quickstart/callee/circuitBreak") + String circuitBreak(); } 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/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerQuickstartCalleeServiceFallback.java similarity index 76% rename from spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderBFallback.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerQuickstartCalleeServiceFallback.java index 419b18cfc..06a2df366 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/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerQuickstartCalleeServiceFallback.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.circuitbreaker.feign.example; +package com.tencent.cloud.quickstart.caller.circuitbreaker; import org.springframework.stereotype.Component; @@ -25,10 +25,10 @@ * @author sean yu */ @Component -public class ProviderBFallback implements ProviderBWithFallback { +public class CircuitBreakerQuickstartCalleeServiceFallback implements CircuitBreakerQuickstartCalleeServiceWithFallback { @Override - public String info() { - return "fallback: trigger the refuse for service b"; + public String circuitBreak() { + return "fallback: trigger the refuse for service callee."; } } diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderBWithFallback.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerQuickstartCalleeServiceWithFallback.java similarity index 66% rename from spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderBWithFallback.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerQuickstartCalleeServiceWithFallback.java index 194ac1305..f71a7650e 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-feign-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/feign/example/ProviderBWithFallback.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CircuitBreakerQuickstartCalleeServiceWithFallback.java @@ -15,25 +15,24 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.circuitbreaker.feign.example; +package com.tencent.cloud.quickstart.caller.circuitbreaker; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; /** - * ProviderBWithFallback. + * CircuitBreakerQuickstartCalleeServiceWithFallback. * * @author sean yu */ -@FeignClient(name = "polaris-circuitbreaker-callee-service", contextId = "fallback-from-code", fallback = ProviderBFallback.class) -public interface ProviderBWithFallback { +@FeignClient(name = "QuickstartCalleeService", contextId = "fallback-from-code", fallback = CircuitBreakerQuickstartCalleeServiceFallback.class) +public interface CircuitBreakerQuickstartCalleeServiceWithFallback { /** - * Get info of service B. + * Check circuit break. * - * @return info of service B + * @return circuit break info */ - @GetMapping("/example/service/b/info") - String info(); - + @GetMapping("/quickstart/callee/circuitBreak") + String circuitBreak(); } diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/CustomFallback.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CustomFallback.java similarity index 95% rename from spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/CustomFallback.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CustomFallback.java index a7f5f1a65..887d690d9 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-resttemplate-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/resttemplate/example/CustomFallback.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/circuitbreaker/CustomFallback.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.circuitbreaker.resttemplate.example; +package com.tencent.cloud.quickstart.caller.circuitbreaker; import java.util.HashMap; diff --git a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/CustomRouterLabelResolver.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/router/CustomRouterLabelResolver.java similarity index 89% rename from spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/CustomRouterLabelResolver.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/router/CustomRouterLabelResolver.java index be9b010ea..18f3d0cac 100644 --- a/spring-cloud-tencent-examples/polaris-router-example/router-caller-service/src/main/java/com/tencent/cloud/polaris/router/example/CustomRouterLabelResolver.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/java/com/tencent/cloud/quickstart/caller/router/CustomRouterLabelResolver.java @@ -16,7 +16,7 @@ * */ -package com.tencent.cloud.polaris.router.example; +package com.tencent.cloud.quickstart.caller.router; import java.util.HashMap; import java.util.Map; @@ -42,9 +42,7 @@ public class CustomRouterLabelResolver implements FeignRouterLabelResolver { public Map resolve(RequestTemplate requestTemplate, Set expressionLabelKeys) { Map labels = new HashMap<>(); - User user = gson.fromJson(new String(requestTemplate.body()), User.class); - - labels.put("user", user.getName()); + labels.put("label1", "value1"); return labels; } diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/resources/bootstrap.yml index d2d1347f4..b51cbdec5 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-caller-service/src/main/resources/bootstrap.yml @@ -14,11 +14,15 @@ spring: heartbeat: enabled: true health-check-url: /quickstart/caller/healthCheck + contract: + exposure: true + report: + enabled: false circuitbreaker: enabled: true stat: enabled: true - port: 28081 + port: 28082 # pushgateway: # enabled: true # address: 127.0.0.1:9091 @@ -39,3 +43,4 @@ management: exposure: include: - polaris-discovery + - polaris-circuit-breaker diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/gateway/example/FallbackController.java b/spring-cloud-tencent-examples/quickstart-example/quickstart-gateway-service/src/main/java/com/tencent/cloud/quickstart/gateway/FallbackController.java similarity index 88% rename from spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/gateway/example/FallbackController.java rename to spring-cloud-tencent-examples/quickstart-example/quickstart-gateway-service/src/main/java/com/tencent/cloud/quickstart/gateway/FallbackController.java index c0d964b56..16dcc0ade 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-gateway-example/src/main/java/com/tencent/cloud/polaris/circuitbreaker/gateway/example/FallbackController.java +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-gateway-service/src/main/java/com/tencent/cloud/quickstart/gateway/FallbackController.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.circuitbreaker.gateway.example; +package com.tencent.cloud.quickstart.gateway; import reactor.core.publisher.Mono; @@ -32,6 +32,6 @@ public class FallbackController { @GetMapping("/polaris-fallback") Mono getFallback() { - return Mono.just("fallback: trigger the refuse for service b"); + return Mono.just("fallback: trigger the refuse for service caller."); } } diff --git a/spring-cloud-tencent-examples/quickstart-example/quickstart-gateway-service/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/quickstart-example/quickstart-gateway-service/src/main/resources/bootstrap.yml index 2f0b00cc2..0db7fd89a 100644 --- a/spring-cloud-tencent-examples/quickstart-example/quickstart-gateway-service/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/quickstart-example/quickstart-gateway-service/src/main/resources/bootstrap.yml @@ -18,7 +18,33 @@ spring: address: grpc://119.91.66.223:8091 namespace: default enabled: true + contract: + exposure: true + report: + enabled: false + stat: + enabled: true + port: 28081 gateway: + discovery: + locator: + enabled: true + 'predicates[0]': + name: Path + args: + patterns: '''/'' + serviceId + ''/**''' + 'filters[0]': + name: RewritePath + args: + regexp: '''/'' + serviceId + ''/(?.*)''' + replacement: '''/$\{remaining}''' + 'filters[1]': + name: CircuitBreaker + args: + # statusCodes 缺省时会自动识别 "5**" 为错误 + # statusCodes: '''404,5**''' + # fallbackUri 缺省时会在熔断触发后拉取 plaris server 配置的降级作为 response + fallbackUri: '''forward:/polaris-fallback''' routes: - id: QuickstartCallerService uri: lb://QuickstartCallerService