From fefad2c64ca331f274445f69d83ddca1065b1ec2 Mon Sep 17 00:00:00 2001 From: lepdou Date: Mon, 9 May 2022 18:58:51 +0800 Subject: [PATCH 1/4] optimize config server address --- CHANGELOG.md | 1 + .../polaris/config/ConfigurationModifier.java | 58 ++++++++++++++++--- ...larisConfigBootstrapAutoConfiguration.java | 5 +- .../config/PolarisConfigProperties.java | 13 +++++ ...itional-spring-configuration-metadata.json | 7 +++ .../src/main/resources/bootstrap.yml | 2 +- 6 files changed, 74 insertions(+), 12 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27c131e8d..1cf129042 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,3 +9,4 @@ - [Bugfix: fix circuitbreaker http code greater than 400 as fail response bug](https://github.com/Tencent/spring-cloud-tencent/pull/118) - [Feat: optimize router dependency](https://github.com/Tencent/spring-cloud-tencent/pull/115) - [feat:add switch of polaris, discovery and register.](https://github.com/Tencent/spring-cloud-tencent/pull/129) +- [feat:optimize config server address.](https://github.com/Tencent/spring-cloud-tencent/pull/149) diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/ConfigurationModifier.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/ConfigurationModifier.java index 17b7ebb5b..495d6ec3a 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/ConfigurationModifier.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/ConfigurationModifier.java @@ -18,16 +18,19 @@ package com.tencent.cloud.polaris.config; +import java.util.ArrayList; import java.util.List; import com.tencent.cloud.common.constant.ContextConstant; import com.tencent.cloud.common.util.AddressUtils; import com.tencent.cloud.polaris.config.config.PolarisConfigProperties; import com.tencent.cloud.polaris.context.PolarisConfigModifier; +import com.tencent.cloud.polaris.context.PolarisContextProperties; import com.tencent.polaris.factory.config.ConfigurationImpl; +import org.apache.commons.lang.StringUtils; + +import org.springframework.util.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.util.StringUtils; /** * Read configuration from spring cloud's configuration file and override polaris.yaml. @@ -36,21 +39,38 @@ import org.springframework.util.StringUtils; */ public class ConfigurationModifier implements PolarisConfigModifier { - @Autowired - private PolarisConfigProperties polarisConfigProperties; + private final PolarisConfigProperties polarisConfigProperties; + + private final PolarisContextProperties polarisContextProperties; + + public ConfigurationModifier(PolarisConfigProperties polarisConfigProperties, + PolarisContextProperties polarisContextProperties) { + this.polarisConfigProperties = polarisConfigProperties; + this.polarisContextProperties = polarisContextProperties; + } @Override public void modify(ConfigurationImpl configuration) { + // set connector type configuration.getConfigFile().getServerConnector().setConnectorType("polaris"); - if (StringUtils.isEmpty(polarisConfigProperties.getAddress())) { - return; + // set config server address + List configAddresses; + String configAddressesStr = polarisConfigProperties.getAddress(); + + if (StringUtils.isNotEmpty(configAddressesStr)) { + configAddresses = AddressUtils.parseAddressList(polarisConfigProperties.getAddress()); + } + else { + configAddresses = resolveConfigAddressFromPolarisAddress(polarisContextProperties.getAddress()); } - // override polaris config server address - List addresses = AddressUtils.parseAddressList(polarisConfigProperties.getAddress()); + if (CollectionUtils.isEmpty(configAddresses)) { + throw new RuntimeException("Config server address is blank. Please check your config in bootstrap.yml" + + " with spring.cloud.polaris.address or spring.cloud.polaris.config.address"); + } - configuration.getConfigFile().getServerConnector().setAddresses(addresses); + configuration.getConfigFile().getServerConnector().setAddresses(configAddresses); } @Override @@ -58,4 +78,24 @@ public class ConfigurationModifier implements PolarisConfigModifier { return ContextConstant.ModifierOrder.CONFIG_ORDER; } + /** + * In most cases, the address of the configuration center is the same as that of Polaris, but the port is different. + * Therefore, the address of the configuration center can be deduced directly from the Polaris address. + * + */ + private List resolveConfigAddressFromPolarisAddress(String polarisAddress) { + if (StringUtils.isEmpty(polarisAddress)) { + return null; + } + + List polarisAddresses = AddressUtils.parseAddressList(polarisAddress); + List configAddresses = new ArrayList<>(polarisAddresses.size()); + + for (String address : polarisAddresses) { + String ip = StringUtils.substringBeforeLast(address, ":"); + configAddresses.add(ip + ":" + polarisConfigProperties.getPort()); + } + + return configAddresses; + } } diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/PolarisConfigBootstrapAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/PolarisConfigBootstrapAutoConfiguration.java index 2d089b228..506022e53 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/PolarisConfigBootstrapAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/PolarisConfigBootstrapAutoConfiguration.java @@ -67,8 +67,9 @@ public class PolarisConfigBootstrapAutoConfiguration { } @Bean - public ConfigurationModifier configurationModifier() { - return new ConfigurationModifier(); + public ConfigurationModifier configurationModifier(PolarisConfigProperties polarisConfigProperties, + PolarisContextProperties polarisContextProperties) { + return new ConfigurationModifier(polarisConfigProperties, polarisContextProperties); } } diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/config/PolarisConfigProperties.java b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/config/PolarisConfigProperties.java index 6ddc49f5f..a2c9032fe 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/config/PolarisConfigProperties.java +++ b/spring-cloud-starter-tencent-polaris-config/src/main/java/com/tencent/cloud/polaris/config/config/PolarisConfigProperties.java @@ -39,6 +39,11 @@ public class PolarisConfigProperties { */ private String address; + /** + * Polaris config grpc port. + */ + private int port = 8093; + /** * Whether to automatically update to the spring context when the configuration file. * is updated @@ -66,6 +71,14 @@ public class PolarisConfigProperties { this.address = address; } + public int getPort() { + return port; + } + + public void setPort(int port) { + this.port = port; + } + public boolean isAutoRefresh() { return autoRefresh; } diff --git a/spring-cloud-starter-tencent-polaris-config/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-starter-tencent-polaris-config/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 152d24d64..ee84cbd47 100644 --- a/spring-cloud-starter-tencent-polaris-config/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-starter-tencent-polaris-config/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -14,6 +14,13 @@ "description": "The polaris configuration server address.", "sourceType": "com.tencent.cloud.polaris.config.config.PolarisConfigProperties" }, + { + "name": "spring.cloud.polaris.config.port", + "type": "java.lang.Integer", + "defaultValue": "8093", + "description": "The polaris configuration server port.", + "sourceType": "com.tencent.cloud.polaris.config.config.PolarisConfigProperties" + }, { "name": "spring.cloud.polaris.config.auto-refresh", "type": "java.lang.Boolean", 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 index b8ab4e08a..bdbd643f7 100644 --- 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 @@ -5,9 +5,9 @@ spring: name: polaris-config-example cloud: polaris: + address: grpc://127.0.0.1:8091 namespace: default config: - address: grpc://127.0.0.1:8093 auto-refresh: true # auto refresh when config file changed groups: - name: ${spring.application.name} # group name From 1a9ea1a0a3b7d050015ef974c1691a7aa68115f7 Mon Sep 17 00:00:00 2001 From: lepdou Date: Wed, 20 Apr 2022 19:52:17 +0800 Subject: [PATCH 2/4] remove maven format plugin --- CHANGELOG.md | 1 + pom.xml | 4 ---- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 27c131e8d..c8836ece4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,3 +9,4 @@ - [Bugfix: fix circuitbreaker http code greater than 400 as fail response bug](https://github.com/Tencent/spring-cloud-tencent/pull/118) - [Feat: optimize router dependency](https://github.com/Tencent/spring-cloud-tencent/pull/115) - [feat:add switch of polaris, discovery and register.](https://github.com/Tencent/spring-cloud-tencent/pull/129) +- [Feature: Remove spring-javaformat-maven-plugin](https://github.com/Tencent/spring-cloud-tencent/pull/151) diff --git a/pom.xml b/pom.xml index c6e8bd4cb..1afc0f7fe 100644 --- a/pom.xml +++ b/pom.xml @@ -137,10 +137,6 @@ - - io.spring.javaformat - spring-javaformat-maven-plugin - org.apache.maven.plugins maven-checkstyle-plugin From 40b0a30f2675016de494f52b1bf72971c78b4772 Mon Sep 17 00:00:00 2001 From: lepdou Date: Wed, 20 Apr 2022 15:49:22 +0800 Subject: [PATCH 3/4] Support custom rate limit reject response info --- CHANGELOG.md | 1 + .../config/PolarisRateLimitProperties.java | 71 +++++++++++++++++++ .../config/RateLimitConfiguration.java | 17 +++-- .../filter/QuotaCheckReactiveFilter.java | 23 ++++-- .../filter/QuotaCheckServletFilter.java | 22 ++++-- .../ratelimit/utils/RateLimitUtils.java | 70 ++++++++++++++++++ ...itional-spring-configuration-metadata.json | 18 +++++ .../cloud/common/util/ResourceFileUtils.java | 54 ++++++++++++++ .../ratelimit-callee-service/pom.xml | 33 +++++---- .../src/main/resources/bootstrap.yml | 1 + .../src/main/resources/reject-tips.html | 5 ++ 11 files changed, 291 insertions(+), 24 deletions(-) create mode 100644 spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitProperties.java create mode 100644 spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/utils/RateLimitUtils.java create mode 100644 spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ResourceFileUtils.java create mode 100644 spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/resources/reject-tips.html diff --git a/CHANGELOG.md b/CHANGELOG.md index 27c131e8d..b03a47758 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,3 +9,4 @@ - [Bugfix: fix circuitbreaker http code greater than 400 as fail response bug](https://github.com/Tencent/spring-cloud-tencent/pull/118) - [Feat: optimize router dependency](https://github.com/Tencent/spring-cloud-tencent/pull/115) - [feat:add switch of polaris, discovery and register.](https://github.com/Tencent/spring-cloud-tencent/pull/129) +- [Feature: Support custom rate limit reject response info](https://github.com/Tencent/spring-cloud-tencent/pull/153) diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitProperties.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitProperties.java new file mode 100644 index 000000000..d51d90b9c --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitProperties.java @@ -0,0 +1,71 @@ +/* + * 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.ratelimit.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.http.HttpStatus; + +/** + * The properties for rate limit. + * + * @author lepdou 2022-04-20 + */ +@ConfigurationProperties("spring.cloud.polaris.ratelimit") +public class PolarisRateLimitProperties { + + /** + * custom tips when reject request. + */ + private String rejectRequestTips; + + /** + * context file path. + */ + private String rejectRequestTipsFilePath; + + /** + * custom http code when reject request. + */ + private int rejectHttpCode = HttpStatus.TOO_MANY_REQUESTS.value(); + + public String getRejectRequestTips() { + return rejectRequestTips; + } + + public void setRejectRequestTips(String rejectRequestTips) { + this.rejectRequestTips = rejectRequestTips; + } + + public String getRejectRequestTipsFilePath() { + return rejectRequestTipsFilePath; + } + + public void setRejectRequestTipsFilePath(String rejectRequestTipsFilePath) { + this.rejectRequestTipsFilePath = rejectRequestTipsFilePath; + } + + public int getRejectHttpCode() { + return rejectHttpCode; + } + + public void setRejectHttpCode(int rejectHttpCode) { + this.rejectHttpCode = rejectHttpCode; + } + +} diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/RateLimitConfiguration.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/RateLimitConfiguration.java index f45b5cd0f..6eb5451ba 100644 --- a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/RateLimitConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/RateLimitConfiguration.java @@ -49,6 +49,11 @@ import static javax.servlet.DispatcherType.REQUEST; @ConditionalOnProperty(name = "spring.cloud.polaris.ratelimit.enabled", matchIfMissing = true) public class RateLimitConfiguration { + @Bean + public PolarisRateLimitProperties polarisRateLimitProperties() { + return new PolarisRateLimitProperties(); + } + @Bean @ConditionalOnMissingBean public LimitAPI limitAPI(SDKContext polarisContext) { @@ -65,8 +70,10 @@ public class RateLimitConfiguration { @Bean @ConditionalOnMissingBean public QuotaCheckServletFilter quotaCheckFilter(LimitAPI limitAPI, - @Nullable PolarisRateLimiterLabelServletResolver labelResolver) { - return new QuotaCheckServletFilter(limitAPI, labelResolver); + @Nullable PolarisRateLimiterLabelServletResolver labelResolver, + PolarisRateLimitProperties polarisRateLimitProperties) { + return new QuotaCheckServletFilter(limitAPI, labelResolver, + polarisRateLimitProperties); } @Bean @@ -91,8 +98,10 @@ public class RateLimitConfiguration { @Bean public QuotaCheckReactiveFilter quotaCheckReactiveFilter(LimitAPI limitAPI, - @Nullable PolarisRateLimiterLabelReactiveResolver labelResolver) { - return new QuotaCheckReactiveFilter(limitAPI, labelResolver); + @Nullable PolarisRateLimiterLabelReactiveResolver labelResolver, + PolarisRateLimitProperties polarisRateLimitProperties) { + return new QuotaCheckReactiveFilter(limitAPI, labelResolver, + polarisRateLimitProperties); } } diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/filter/QuotaCheckReactiveFilter.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/filter/QuotaCheckReactiveFilter.java index ab337591e..454d1020a 100644 --- a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/filter/QuotaCheckReactiveFilter.java +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/filter/QuotaCheckReactiveFilter.java @@ -22,10 +22,14 @@ import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; +import javax.annotation.PostConstruct; + import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.cloud.polaris.ratelimit.config.PolarisRateLimitProperties; import com.tencent.cloud.polaris.ratelimit.constant.RateLimitConstant; import com.tencent.cloud.polaris.ratelimit.spi.PolarisRateLimiterLabelReactiveResolver; import com.tencent.cloud.polaris.ratelimit.utils.QuotaCheckUtils; +import com.tencent.cloud.polaris.ratelimit.utils.RateLimitUtils; import com.tencent.polaris.ratelimit.api.core.LimitAPI; import com.tencent.polaris.ratelimit.api.rpc.QuotaResponse; import com.tencent.polaris.ratelimit.api.rpc.QuotaResultCode; @@ -36,7 +40,6 @@ import reactor.core.publisher.Mono; import org.springframework.core.Ordered; import org.springframework.core.io.buffer.DataBuffer; -import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.util.CollectionUtils; @@ -59,9 +62,21 @@ public class QuotaCheckReactiveFilter implements WebFilter, Ordered { private final PolarisRateLimiterLabelReactiveResolver labelResolver; - public QuotaCheckReactiveFilter(LimitAPI limitAPI, PolarisRateLimiterLabelReactiveResolver labelResolver) { + private final PolarisRateLimitProperties polarisRateLimitProperties; + + private String rejectTips; + + public QuotaCheckReactiveFilter(LimitAPI limitAPI, + PolarisRateLimiterLabelReactiveResolver labelResolver, + PolarisRateLimitProperties polarisRateLimitProperties) { this.limitAPI = limitAPI; this.labelResolver = labelResolver; + this.polarisRateLimitProperties = polarisRateLimitProperties; + } + + @PostConstruct + public void init() { + rejectTips = RateLimitUtils.getRejectTips(polarisRateLimitProperties); } @Override @@ -101,10 +116,10 @@ public class QuotaCheckReactiveFilter implements WebFilter, Ordered { if (quotaResponse.getCode() == QuotaResultCode.QuotaResultLimited) { ServerHttpResponse response = exchange.getResponse(); - response.setStatusCode(HttpStatus.TOO_MANY_REQUESTS); + response.setRawStatusCode(polarisRateLimitProperties.getRejectHttpCode()); response.getHeaders().setContentType(MediaType.APPLICATION_JSON); DataBuffer dataBuffer = response.bufferFactory().allocateBuffer() - .write(RateLimitConstant.QUOTA_LIMITED_INFO.getBytes(StandardCharsets.UTF_8)); + .write(rejectTips.getBytes(StandardCharsets.UTF_8)); return response.writeWith(Mono.just(dataBuffer)); } } diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/filter/QuotaCheckServletFilter.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/filter/QuotaCheckServletFilter.java index b551aa797..6ad69ff1b 100644 --- a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/filter/QuotaCheckServletFilter.java +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/filter/QuotaCheckServletFilter.java @@ -22,15 +22,18 @@ import java.io.IOException; import java.util.HashMap; import java.util.Map; +import javax.annotation.PostConstruct; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.tencent.cloud.common.metadata.MetadataContext; +import com.tencent.cloud.polaris.ratelimit.config.PolarisRateLimitProperties; import com.tencent.cloud.polaris.ratelimit.constant.RateLimitConstant; import com.tencent.cloud.polaris.ratelimit.spi.PolarisRateLimiterLabelServletResolver; import com.tencent.cloud.polaris.ratelimit.utils.QuotaCheckUtils; +import com.tencent.cloud.polaris.ratelimit.utils.RateLimitUtils; import com.tencent.polaris.ratelimit.api.core.LimitAPI; import com.tencent.polaris.ratelimit.api.rpc.QuotaResponse; import com.tencent.polaris.ratelimit.api.rpc.QuotaResultCode; @@ -43,7 +46,6 @@ import org.springframework.util.CollectionUtils; import org.springframework.web.filter.OncePerRequestFilter; import static com.tencent.cloud.polaris.ratelimit.constant.RateLimitConstant.LABEL_METHOD; -import static org.springframework.http.HttpStatus.TOO_MANY_REQUESTS; /** * Servlet filter to check quota. @@ -59,9 +61,21 @@ public class QuotaCheckServletFilter extends OncePerRequestFilter { private final PolarisRateLimiterLabelServletResolver labelResolver; - public QuotaCheckServletFilter(LimitAPI limitAPI, PolarisRateLimiterLabelServletResolver labelResolver) { + private final PolarisRateLimitProperties polarisRateLimitProperties; + + private String rejectTips; + + public QuotaCheckServletFilter(LimitAPI limitAPI, + PolarisRateLimiterLabelServletResolver labelResolver, + PolarisRateLimitProperties polarisRateLimitProperties) { this.limitAPI = limitAPI; this.labelResolver = labelResolver; + this.polarisRateLimitProperties = polarisRateLimitProperties; + } + + @PostConstruct + public void init() { + rejectTips = RateLimitUtils.getRejectTips(polarisRateLimitProperties); } @Override @@ -96,8 +110,8 @@ public class QuotaCheckServletFilter extends OncePerRequestFilter { QuotaResponse quotaResponse = QuotaCheckUtils.getQuota(limitAPI, localNamespace, localService, 1, labels, null); if (quotaResponse.getCode() == QuotaResultCode.QuotaResultLimited) { - response.setStatus(TOO_MANY_REQUESTS.value()); - response.getWriter().write(RateLimitConstant.QUOTA_LIMITED_INFO); + response.setStatus(polarisRateLimitProperties.getRejectHttpCode()); + response.getWriter().write(rejectTips); } else { filterChain.doFilter(request, response); diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/utils/RateLimitUtils.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/utils/RateLimitUtils.java new file mode 100644 index 000000000..2e036909c --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/utils/RateLimitUtils.java @@ -0,0 +1,70 @@ +/* + * 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.ratelimit.utils; + +import com.tencent.cloud.common.util.ResourceFileUtils; +import com.tencent.cloud.polaris.ratelimit.config.PolarisRateLimitProperties; +import com.tencent.cloud.polaris.ratelimit.constant.RateLimitConstant; +import com.tencent.cloud.polaris.ratelimit.filter.QuotaCheckServletFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.util.StringUtils; + +/** + * Rate limit utils. + * + * @author lepdou 2022-04-20 + */ +public final class RateLimitUtils { + + private static final Logger LOG = LoggerFactory + .getLogger(QuotaCheckServletFilter.class); + + private RateLimitUtils() { + + } + + public static String getRejectTips( + PolarisRateLimitProperties polarisRateLimitProperties) { + String tips = polarisRateLimitProperties.getRejectRequestTips(); + + if (!StringUtils.isEmpty(tips)) { + return tips; + } + + String rejectFilePath = polarisRateLimitProperties.getRejectRequestTipsFilePath(); + if (!StringUtils.isEmpty(rejectFilePath)) { + try { + tips = ResourceFileUtils.readFile(rejectFilePath); + } + catch (Exception e) { + LOG.error("[RateLimit] Read custom reject tips file error. path = {}", + rejectFilePath, e); + } + } + + if (!StringUtils.isEmpty(tips)) { + return tips; + } + + return RateLimitConstant.QUOTA_LIMITED_INFO; + } + +} diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/resources/META-INF/additional-spring-configuration-metadata.json index b71a17cc4..19b37aeb5 100644 --- a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -5,6 +5,24 @@ "type": "java.lang.Boolean", "defaultValue": true, "description": "Enable polaris rate limit or not." + }, + { + "name": "spring.cloud.polaris.ratelimit.rejectRequestTips", + "type": "java.lang.String", + "defaultValue": "", + "description": "Custom tips when reject request." + }, + { + "name": "spring.cloud.polaris.ratelimit.rejectRequestTipsFilePath", + "type": "java.lang.String", + "defaultValue": "", + "description": "Custom tips file path when reject request." + }, + { + "name": "spring.cloud.polaris.ratelimit.rejectHttpCode", + "type": "java.lang.Integer", + "defaultValue": "429", + "description": "Custom http code when reject request." } ] } diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ResourceFileUtils.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ResourceFileUtils.java new file mode 100644 index 000000000..d79bfce8b --- /dev/null +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/util/ResourceFileUtils.java @@ -0,0 +1,54 @@ +/* + * 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.common.util; + +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +import org.springframework.core.io.ClassPathResource; + +/** + * Read file content from classpath resource. + * + * @author lepdou 2022-04-20 + */ +public final class ResourceFileUtils { + + private ResourceFileUtils() { + } + + public static String readFile(String path) throws IOException { + StringBuilder sb = new StringBuilder(); + + ClassPathResource classPathResource = new ClassPathResource(path); + + if (classPathResource.exists() && classPathResource.isReadable()) { + try (InputStream inputStream = classPathResource.getInputStream()) { + byte[] buffer = new byte[1024 * 10]; + int len; + while ((len = inputStream.read(buffer)) != -1) { + sb.append(new String(buffer, 0, len, StandardCharsets.UTF_8)); + } + } + } + return sb.toString(); + } + +} 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 index cf63336bf..dd28040b5 100644 --- 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 @@ -1,18 +1,18 @@ - - polaris-ratelimit-example - com.tencent.cloud - ${revision} - ../pom.xml - - 4.0.0 + xmlns="http://maven.apache.org/POM/4.0.0" + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + + polaris-ratelimit-example + com.tencent.cloud + ${revision} + ../pom.xml + + 4.0.0 - ratelimit-callee-service + ratelimit-callee-service - + org.springframework.boot spring-boot-starter-web @@ -23,5 +23,14 @@ spring-cloud-starter-tencent-polaris-ratelimit - + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + 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 index 8825b0cea..a33fc48f1 100644 --- 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 @@ -10,3 +10,4 @@ spring: enabled: true ratelimit: enabled: true + rejectRequestTipsFilePath: reject-tips.html diff --git a/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/resources/reject-tips.html b/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/resources/reject-tips.html new file mode 100644 index 000000000..693ef256b --- /dev/null +++ b/spring-cloud-tencent-examples/polaris-ratelimit-example/ratelimit-callee-service/src/main/resources/reject-tips.html @@ -0,0 +1,5 @@ +

+ + Custom reject content. + +

From 26b1a116c73b20779a9b928c36621efd6ac41134 Mon Sep 17 00:00:00 2001 From: Haotian Zhang <928016560@qq.com> Date: Tue, 10 May 2022 19:02:06 +0800 Subject: [PATCH 4/4] feat:refactor loadbalancer module as a basic module for router and circuit breaker. (#155) --- pom.xml | 3 +- .../pom.xml | 8 +- .../discovery/PolarisDiscoveryHandler.java | 15 ++++ .../discovery/PolarisServiceDiscovery.java | 2 +- .../pom.xml | 69 +--------------- .../cloud/polaris/router/package-info.java | 23 ++++++ .../main/resources/META-INF/spring.factories | 2 - .../common/constant/ContextConstant.java | 8 ++ spring-cloud-tencent-dependencies/pom.xml | 10 ++- .../polaris-circuitbreaker-example-a/pom.xml | 5 ++ .../src/main/resources/bootstrap.yml | 2 + spring-cloud-tencent-polaris-context/pom.xml | 78 +++++++++---------- .../pom.xml | 54 +++++++++++++ .../loadbalancer/PolarisLoadbalancer.java | 13 ++-- .../PolarisServiceInstanceListSupplier.java | 6 +- .../PolarisLoadBalancerAutoConfiguration.java | 2 +- ...olarisLoadBalancerClientConfiguration.java | 12 +-- .../config/PolarisLoadBalancerProperties.java | 40 ++++++---- ...itional-spring-configuration-metadata.json | 0 .../main/resources/META-INF/spring.factories | 2 + ...arisLoadBalancerAutoConfigurationTest.java | 2 +- .../PolarisRouterAutoConfigurationTest.java | 8 +- 22 files changed, 210 insertions(+), 154 deletions(-) create mode 100644 spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/package-info.java delete mode 100644 spring-cloud-starter-tencent-polaris-router/src/main/resources/META-INF/spring.factories create mode 100644 spring-cloud-tencent-polaris-loadbalancer/pom.xml rename spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRoutingLoadbalancer.java => spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadbalancer.java (90%) rename spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java => spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisServiceInstanceListSupplier.java (94%) rename {spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router => spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer}/config/PolarisLoadBalancerAutoConfiguration.java (97%) rename {spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router => spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer}/config/PolarisLoadBalancerClientConfiguration.java (92%) rename {spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router => spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer}/config/PolarisLoadBalancerProperties.java (59%) rename {spring-cloud-starter-tencent-polaris-router => spring-cloud-tencent-polaris-loadbalancer}/src/main/resources/META-INF/additional-spring-configuration-metadata.json (100%) create mode 100644 spring-cloud-tencent-polaris-loadbalancer/src/main/resources/META-INF/spring.factories rename {spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router => spring-cloud-tencent-polaris-loadbalancer/src/test/java/com/tencent/cloud/polaris/loadbalancer}/config/PolarisLoadBalancerAutoConfigurationTest.java (97%) rename {spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router => spring-cloud-tencent-polaris-loadbalancer/src/test/java/com/tencent/cloud/polaris/loadbalancer}/config/PolarisRouterAutoConfigurationTest.java (91%) diff --git a/pom.xml b/pom.xml index 1afc0f7fe..8ab7f36fd 100644 --- a/pom.xml +++ b/pom.xml @@ -49,6 +49,7 @@ spring-cloud-tencent-examples spring-cloud-tencent-coverage spring-cloud-starter-tencent-polaris-config + spring-cloud-tencent-polaris-loadbalancer @@ -77,7 +78,7 @@ - 1.3.0-2020.0.5 + 1.4.1-2020.0.5-SNAPSHOT 2020.0.5 diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml b/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml index 354285e59..06286c65d 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml @@ -16,7 +16,7 @@ com.tencent.cloud - spring-cloud-tencent-polaris-context + spring-cloud-tencent-polaris-loadbalancer @@ -84,12 +84,6 @@ - - org.springframework.cloud - spring-cloud-loadbalancer - true - - org.springframework.cloud spring-cloud-starter-openfeign diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandler.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandler.java index b2196cb60..0ea9bb973 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandler.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisDiscoveryHandler.java @@ -28,6 +28,7 @@ import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.core.ProviderAPI; import com.tencent.polaris.api.pojo.ServiceInfo; import com.tencent.polaris.api.rpc.GetAllInstancesRequest; +import com.tencent.polaris.api.rpc.GetHealthyInstancesRequest; import com.tencent.polaris.api.rpc.GetInstancesRequest; import com.tencent.polaris.api.rpc.GetServicesRequest; import com.tencent.polaris.api.rpc.InstancesResponse; @@ -59,6 +60,7 @@ public class PolarisDiscoveryHandler { * @param service service name * @return list of instances */ + @Deprecated public InstancesResponse getFilteredInstances(String service) { String namespace = polarisDiscoveryProperties.getNamespace(); GetInstancesRequest getInstancesRequest = new GetInstancesRequest(); @@ -80,6 +82,19 @@ public class PolarisDiscoveryHandler { return polarisConsumer.getInstances(getInstancesRequest); } + /** + * Get a list of healthy instances. + * @param service service name + * @return list of healthy instances + */ + public InstancesResponse getHealthyInstances(String service) { + String namespace = polarisDiscoveryProperties.getNamespace(); + GetHealthyInstancesRequest getHealthyInstancesRequest = new GetHealthyInstancesRequest(); + getHealthyInstancesRequest.setNamespace(namespace); + getHealthyInstancesRequest.setService(service); + return polarisConsumer.getHealthyInstancesInstance(getHealthyInstancesRequest); + } + /** * Return all instances for the given service. * @param service serviceName diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscovery.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscovery.java index ccaf2f370..044af8634 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscovery.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/discovery/PolarisServiceDiscovery.java @@ -49,7 +49,7 @@ public class PolarisServiceDiscovery { */ public List getInstances(String serviceId) throws PolarisException { List instances = new ArrayList<>(); - InstancesResponse filteredInstances = polarisDiscoveryHandler.getFilteredInstances(serviceId); + InstancesResponse filteredInstances = polarisDiscoveryHandler.getHealthyInstances(serviceId); ServiceInstances serviceInstances = filteredInstances.toServiceInstances(); for (Instance instance : serviceInstances.getInstances()) { instances.add(new PolarisServiceInstance(instance)); diff --git a/spring-cloud-starter-tencent-polaris-router/pom.xml b/spring-cloud-starter-tencent-polaris-router/pom.xml index 945bcc110..d623da7b1 100644 --- a/spring-cloud-starter-tencent-polaris-router/pom.xml +++ b/spring-cloud-starter-tencent-polaris-router/pom.xml @@ -17,79 +17,16 @@ com.tencent.cloud - spring-cloud-tencent-polaris-context + spring-cloud-tencent-polaris-loadbalancer - - org.springframework.cloud - spring-cloud-loadbalancer - - - - com.tencent.polaris - polaris-router-factory - - - com.tencent.polaris - router-rule - - - com.tencent.polaris - router-nearby - - - com.tencent.polaris - router-metadata - - - com.tencent.polaris - router-canary - - - com.tencent.polaris - router-set - - - com.tencent.polaris - router-isolated - - - com.tencent.polaris - router-healthy - - - - - com.tencent.polaris router-rule - - - com.tencent.polaris - router-nearby - - - - com.tencent.polaris - router-metadata - - - - com.tencent.polaris - polaris-test-common - test - - - - - org.springframework.boot - spring-boot-starter-test - test - - + + diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/package-info.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/package-info.java new file mode 100644 index 000000000..3eb18e376 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/package-info.java @@ -0,0 +1,23 @@ +/* + * 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 info of router. + * + * @author Haotian Zhang + */ +package com.tencent.cloud.polaris.router; diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/resources/META-INF/spring.factories b/spring-cloud-starter-tencent-polaris-router/src/main/resources/META-INF/spring.factories deleted file mode 100644 index 76319b269..000000000 --- a/spring-cloud-starter-tencent-polaris-router/src/main/resources/META-INF/spring.factories +++ /dev/null @@ -1,2 +0,0 @@ -org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ - com.tencent.cloud.polaris.router.config.PolarisLoadBalancerAutoConfiguration diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/ContextConstant.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/ContextConstant.java index 54f203878..54d8b3224 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/ContextConstant.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/ContextConstant.java @@ -24,6 +24,14 @@ package com.tencent.cloud.common.constant; */ public final class ContextConstant { + /** + * Name of Polaris. + */ + public static final String POLARIS = "POLARIS"; + + private ContextConstant() { + } + /** * Order of configuration modifier. */ diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 114e29628..bbbea557b 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -70,8 +70,8 @@ - 1.3.0-2020.0.5 - 1.4.0 + 1.4.1-2020.0.5-SNAPSHOT + 1.5.1 2.0.0 @@ -102,6 +102,12 @@ ${revision} + + com.tencent.cloud + spring-cloud-tencent-polaris-loadbalancer + ${revision} + + com.tencent.cloud spring-cloud-starter-tencent-metadata-transfer diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/pom.xml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/pom.xml index 837fdfba7..9833b5f88 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/pom.xml +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/pom.xml @@ -33,6 +33,11 @@ org.springframework.cloud spring-cloud-starter-loadbalancer + + + org.springframework.cloud + spring-cloud-circuitbreaker-spring-retry + diff --git a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/resources/bootstrap.yml b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/resources/bootstrap.yml index e693a9700..ba762ac58 100644 --- a/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/resources/bootstrap.yml +++ b/spring-cloud-tencent-examples/polaris-circuitbreaker-example/polaris-circuitbreaker-example-a/src/main/resources/bootstrap.yml @@ -10,6 +10,8 @@ spring: enabled: true circuitbreaker: enabled: true + loadbalancer: + configurations: polaris feign: circuitbreaker: enabled: true diff --git a/spring-cloud-tencent-polaris-context/pom.xml b/spring-cloud-tencent-polaris-context/pom.xml index a63d20264..aa9b8523b 100644 --- a/spring-cloud-tencent-polaris-context/pom.xml +++ b/spring-cloud-tencent-polaris-context/pom.xml @@ -35,32 +35,32 @@ com.tencent.polaris polaris-plugin-api - + - - com.tencent.polaris - connector-polaris-grpc - + + com.tencent.polaris + connector-polaris-grpc + - - com.tencent.polaris - connector-consul - + + com.tencent.polaris + connector-consul + - - com.tencent.polaris - connector-composite - + + com.tencent.polaris + connector-composite + - - com.tencent.polaris - registry-memory - + + com.tencent.polaris + registry-memory + - - com.tencent.polaris - flow-cache-expired - + + com.tencent.polaris + flow-cache-expired + @@ -72,23 +72,23 @@ com.tencent.polaris router-healthy - - - com.tencent.polaris - loadbalancer-random - - - - com.tencent.polaris - loadbalancer-ringhash - - - - - org.springframework.boot - spring-boot-starter-test - test - - + + + com.tencent.polaris + loadbalancer-random + + + + com.tencent.polaris + loadbalancer-ringhash + + + + + org.springframework.boot + spring-boot-starter-test + test + + diff --git a/spring-cloud-tencent-polaris-loadbalancer/pom.xml b/spring-cloud-tencent-polaris-loadbalancer/pom.xml new file mode 100644 index 000000000..cfec39a05 --- /dev/null +++ b/spring-cloud-tencent-polaris-loadbalancer/pom.xml @@ -0,0 +1,54 @@ + + + + spring-cloud-tencent + com.tencent.cloud + ${revision} + ../pom.xml + + 4.0.0 + + spring-cloud-tencent-polaris-loadbalancer + Spring Cloud Tencent Polaris LoadBalancer + + + + + com.tencent.cloud + spring-cloud-tencent-polaris-context + + + + + + com.tencent.polaris + polaris-router-factory + + + + com.tencent.polaris + polaris-discovery-api + + + + com.tencent.polaris + polaris-test-common + test + + + + + org.springframework.cloud + spring-cloud-loadbalancer + + + + org.springframework.boot + spring-boot-starter-test + test + + + + \ No newline at end of file diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRoutingLoadbalancer.java b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadbalancer.java similarity index 90% rename from spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRoutingLoadbalancer.java rename to spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadbalancer.java index 983543d3b..e76098355 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRoutingLoadbalancer.java +++ b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadbalancer.java @@ -15,14 +15,14 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.router; +package com.tencent.cloud.polaris.loadbalancer; import java.util.List; import java.util.stream.Collectors; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.pojo.PolarisServiceInstance; -import com.tencent.cloud.polaris.router.config.PolarisLoadBalancerProperties; +import com.tencent.cloud.polaris.loadbalancer.config.PolarisLoadBalancerProperties; import com.tencent.polaris.api.pojo.DefaultServiceInstances; import com.tencent.polaris.api.pojo.Instance; import com.tencent.polaris.api.pojo.ServiceInstances; @@ -51,9 +51,9 @@ import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier; * * @author liaochuntao */ -public class PolarisRoutingLoadbalancer extends RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer { +public class PolarisLoadbalancer extends RoundRobinLoadBalancer implements ReactorServiceInstanceLoadBalancer { - private static final Logger log = LoggerFactory.getLogger(PolarisRoutingLoadbalancer.class); + private static final Logger log = LoggerFactory.getLogger(PolarisLoadbalancer.class); private final String serviceId; @@ -63,8 +63,7 @@ public class PolarisRoutingLoadbalancer extends RoundRobinLoadBalancer implement private ObjectProvider supplierObjectProvider; - public PolarisRoutingLoadbalancer(String serviceId, - ObjectProvider supplierObjectProvider, + public PolarisLoadbalancer(String serviceId, ObjectProvider supplierObjectProvider, PolarisLoadBalancerProperties loadBalancerProperties, RouterAPI routerAPI) { super(supplierObjectProvider, serviceId); this.serviceId = serviceId; @@ -83,7 +82,7 @@ public class PolarisRoutingLoadbalancer extends RoundRobinLoadBalancer implement @Override public Mono> choose(Request request) { - if (!loadBalancerProperties.getLoadbalancerEnabled()) { + if (!loadBalancerProperties.getEnabled()) { return super.choose(request); } ServiceInstanceListSupplier supplier = supplierObjectProvider diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisServiceInstanceListSupplier.java similarity index 94% rename from spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java rename to spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisServiceInstanceListSupplier.java index b9866d5df..20dd8c60d 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/PolarisRouterServiceInstanceListSupplier.java +++ b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisServiceInstanceListSupplier.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.router; +package com.tencent.cloud.polaris.loadbalancer; import java.util.ArrayList; import java.util.List; @@ -48,11 +48,11 @@ import org.springframework.util.CollectionUtils; * * @author Haotian Zhang */ -public class PolarisRouterServiceInstanceListSupplier extends DelegatingServiceInstanceListSupplier { +public class PolarisServiceInstanceListSupplier extends DelegatingServiceInstanceListSupplier { private final RouterAPI routerAPI; - public PolarisRouterServiceInstanceListSupplier(ServiceInstanceListSupplier delegate, RouterAPI routerAPI) { + public PolarisServiceInstanceListSupplier(ServiceInstanceListSupplier delegate, RouterAPI routerAPI) { super(delegate); this.routerAPI = routerAPI; } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisLoadBalancerAutoConfiguration.java b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfiguration.java similarity index 97% rename from spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisLoadBalancerAutoConfiguration.java rename to spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfiguration.java index 47c63b57a..70f09fb07 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisLoadBalancerAutoConfiguration.java +++ b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfiguration.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.router.config; +package com.tencent.cloud.polaris.loadbalancer.config; import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled; import com.tencent.polaris.api.exception.PolarisException; diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisLoadBalancerClientConfiguration.java b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerClientConfiguration.java similarity index 92% rename from spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisLoadBalancerClientConfiguration.java rename to spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerClientConfiguration.java index 371df6450..8e9cc3d89 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisLoadBalancerClientConfiguration.java +++ b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerClientConfiguration.java @@ -15,10 +15,10 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.router.config; +package com.tencent.cloud.polaris.loadbalancer.config; -import com.tencent.cloud.polaris.router.PolarisRouterServiceInstanceListSupplier; -import com.tencent.cloud.polaris.router.PolarisRoutingLoadbalancer; +import com.tencent.cloud.polaris.loadbalancer.PolarisLoadbalancer; +import com.tencent.cloud.polaris.loadbalancer.PolarisServiceInstanceListSupplier; import com.tencent.polaris.router.api.core.RouterAPI; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; @@ -59,7 +59,7 @@ public class PolarisLoadBalancerClientConfiguration { LoadBalancerClientFactory loadBalancerClientFactory, PolarisLoadBalancerProperties loadBalancerProperties, RouterAPI routerAPI) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); - return new PolarisRoutingLoadbalancer(name, + return new PolarisLoadbalancer(name, loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), loadBalancerProperties, routerAPI); } @@ -74,7 +74,7 @@ public class PolarisLoadBalancerClientConfiguration { @ConditionalOnProperty(value = "spring.cloud.loadbalancer.configurations", havingValue = "polaris") public ServiceInstanceListSupplier polarisRouterDiscoveryClientServiceInstanceListSupplier(RouterAPI routerAPI, ConfigurableApplicationContext context) { - return new PolarisRouterServiceInstanceListSupplier( + return new PolarisServiceInstanceListSupplier( ServiceInstanceListSupplier.builder().withDiscoveryClient().build(context), routerAPI); } @@ -90,7 +90,7 @@ public class PolarisLoadBalancerClientConfiguration { @ConditionalOnProperty(value = "spring.cloud.loadbalancer.configurations", havingValue = "polaris") public ServiceInstanceListSupplier polarisRouterDiscoveryClientServiceInstanceListSupplier(RouterAPI routerAPI, ConfigurableApplicationContext context) { - return new PolarisRouterServiceInstanceListSupplier( + return new PolarisServiceInstanceListSupplier( ServiceInstanceListSupplier.builder().withBlockingDiscoveryClient().build(context), routerAPI); } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisLoadBalancerProperties.java b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerProperties.java similarity index 59% rename from spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisLoadBalancerProperties.java rename to spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerProperties.java index 9acada22f..e8feb88af 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisLoadBalancerProperties.java +++ b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerProperties.java @@ -15,30 +15,34 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.router.config; +package com.tencent.cloud.polaris.loadbalancer.config; + +import com.tencent.cloud.common.constant.ContextConstant; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; /** - * Properties of loadbalancer. + * Properties of Polaris loadbalancer. * * @author Haotian Zhang */ -@ConfigurationProperties("spring.cloud.polaris.ribbon") +@ConfigurationProperties("spring.cloud.polaris.loadbalancer") public class PolarisLoadBalancerProperties { /** * If load-balance enabled. */ - @Value("${spring.cloud.polaris.discovery.loadbalancer.enabled:#{true}}") - private Boolean loadbalancerEnabled; + private Boolean enabled = true; /** * Load balance strategy. */ - @Value("${spring.cloud.polaris.loadbalancer.strategy:#{'weightedRandom'}}") - private String strategy; + private String strategy = "weightedRandom"; + + /** + * Type of discovery server. + */ + private String discoveryType = ContextConstant.POLARIS; public String getStrategy() { return strategy; @@ -48,18 +52,26 @@ public class PolarisLoadBalancerProperties { this.strategy = strategy; } - public Boolean getLoadbalancerEnabled() { - return loadbalancerEnabled; + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public String getDiscoveryType() { + return discoveryType; } - public void setLoadbalancerEnabled(Boolean loadbalancerEnabled) { - this.loadbalancerEnabled = loadbalancerEnabled; + public void setDiscoveryType(String discoveryType) { + this.discoveryType = discoveryType; } @Override public String toString() { - return "PolarisRibbonProperties{" + "loadbalancerEnabled=" + loadbalancerEnabled + ", strategy='" + strategy - + '\'' + '}'; + return "PolarisLoadBalancerProperties{" + "loadbalancerEnabled=" + enabled + ", strategy='" + strategy + '\'' + + '}'; } } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-tencent-polaris-loadbalancer/src/main/resources/META-INF/additional-spring-configuration-metadata.json similarity index 100% rename from spring-cloud-starter-tencent-polaris-router/src/main/resources/META-INF/additional-spring-configuration-metadata.json rename to spring-cloud-tencent-polaris-loadbalancer/src/main/resources/META-INF/additional-spring-configuration-metadata.json diff --git a/spring-cloud-tencent-polaris-loadbalancer/src/main/resources/META-INF/spring.factories b/spring-cloud-tencent-polaris-loadbalancer/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..a13924bac --- /dev/null +++ b/spring-cloud-tencent-polaris-loadbalancer/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.tencent.cloud.polaris.loadbalancer.config.PolarisLoadBalancerAutoConfiguration diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/PolarisLoadBalancerAutoConfigurationTest.java b/spring-cloud-tencent-polaris-loadbalancer/src/test/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfigurationTest.java similarity index 97% rename from spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/PolarisLoadBalancerAutoConfigurationTest.java rename to spring-cloud-tencent-polaris-loadbalancer/src/test/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfigurationTest.java index 7c96a8a87..fb7b896c7 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/PolarisLoadBalancerAutoConfigurationTest.java +++ b/spring-cloud-tencent-polaris-loadbalancer/src/test/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfigurationTest.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.router.config; +package com.tencent.cloud.polaris.loadbalancer.config; import com.tencent.cloud.polaris.context.PolarisContextAutoConfiguration; import com.tencent.polaris.router.api.core.RouterAPI; diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/PolarisRouterAutoConfigurationTest.java b/spring-cloud-tencent-polaris-loadbalancer/src/test/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisRouterAutoConfigurationTest.java similarity index 91% rename from spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/PolarisRouterAutoConfigurationTest.java rename to spring-cloud-tencent-polaris-loadbalancer/src/test/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisRouterAutoConfigurationTest.java index a29bd7f3c..2593095a8 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/PolarisRouterAutoConfigurationTest.java +++ b/spring-cloud-tencent-polaris-loadbalancer/src/test/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisRouterAutoConfigurationTest.java @@ -15,10 +15,10 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.router.config; +package com.tencent.cloud.polaris.loadbalancer.config; import com.tencent.cloud.polaris.context.PolarisContextAutoConfiguration; -import com.tencent.cloud.polaris.router.PolarisRouterServiceInstanceListSupplier; +import com.tencent.cloud.polaris.loadbalancer.PolarisServiceInstanceListSupplier; import com.tencent.polaris.router.api.core.RouterAPI; import org.junit.Test; @@ -59,7 +59,7 @@ public class PolarisRouterAutoConfigurationTest { .doesNotHaveBean(PolarisLoadBalancerClientConfiguration.PolarisReactiveSupportConfiguration.class); assertThat(context) .hasSingleBean(PolarisLoadBalancerClientConfiguration.PolarisBlockingSupportConfiguration.class); - assertThat(context).doesNotHaveBean(PolarisRouterServiceInstanceListSupplier.class); + assertThat(context).doesNotHaveBean(PolarisServiceInstanceListSupplier.class); }); } @@ -75,7 +75,7 @@ public class PolarisRouterAutoConfigurationTest { .doesNotHaveBean(PolarisLoadBalancerClientConfiguration.PolarisReactiveSupportConfiguration.class); assertThat(context) .hasSingleBean(PolarisLoadBalancerClientConfiguration.PolarisBlockingSupportConfiguration.class); - assertThat(context).doesNotHaveBean(PolarisRouterServiceInstanceListSupplier.class); + assertThat(context).doesNotHaveBean(PolarisServiceInstanceListSupplier.class); }); }