diff --git a/CHANGELOG.md b/CHANGELOG.md index 6fe38dc15..41f979111 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,3 +3,5 @@ - [Feature: Support custom rate limit reject response info](https://github.com/Tencent/spring-cloud-tencent/pull/128) - [Feature: Optimize config server address](https://github.com/Tencent/spring-cloud-tencent/pull/130) +- [Feature: Remove spring-javaformat-maven-plugin](https://github.com/Tencent/spring-cloud-tencent/pull/131) +- [feat:refactor loadbalancer module as a basic module for router and circuit breaker.](https://github.com/Tencent/spring-cloud-tencent/pull/136) diff --git a/README-zh.md b/README-zh.md index 540bb9ef9..ff760c7d5 100644 --- a/README-zh.md +++ b/README-zh.md @@ -2,6 +2,9 @@ [![Build Status](https://github.com/Tencent/spring-cloud-tencent/actions/workflows/junit_test.yml/badge.svg)](https://github.com/Tencent/spring-cloud-tencent/actions/workflows/junit_test.yml) [![Maven Central](https://img.shields.io/maven-central/v/com.tencent.cloud/spring-cloud-tencent?label=Maven%20Central)](https://search.maven.org/search?q=g:com.tencent.cloud%20AND%20a:spring-cloud-tencent) +[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) +[![Percentage of issues still open](http://isitmaintained.com/badge/open/Tencent/spring-cloud-tencent.svg)](https://github.com/Tencent/spring-cloud-tencent/issues) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/Tencent/spring-cloud-tencent/wiki/Contributing) [English](./README.md) | 简体中文 @@ -18,13 +21,13 @@ Spring Cloud Tencent 的核心依托腾讯开源的一站式服务发现与治 - [Polaris Github home page](https://github.com/polarismesh/polaris) - [Polaris official website](https://polarismesh.cn/) -Spring Cloud 腾讯提供的能力包括但不限于: +Spring Cloud Tencent提供的能力包括但不限于: - 服务注册和发现 - 动态配置管理 - 服务治理 - - 服务电流限制 - - 服务断路器 + - 服务限流 + - 服务熔断 - 服务路由 - ... - 标签透传 @@ -79,3 +82,10 @@ Spring Cloud Tencent 所有组件都已上传到 Maven 中央仓库,只需要 ## License The spring-cloud-tencent is licensed under the BSD 3-Clause License. Copyright and license information can be found in the file [LICENSE](LICENSE) + +## Stargazers over time + +如果您对 Spring Cloud Tencent 有兴趣,请关注我们的项目~ + +[![Stargazers over time](https://starchart.cc/Tencent/spring-cloud-tencent.svg)](https://starchart.cc/Tencent/spring-cloud-tencent) + diff --git a/README.md b/README.md index 2a1490990..e7b735c3a 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,9 @@ [![Build Status](https://github.com/Tencent/spring-cloud-tencent/actions/workflows/junit_test.yml/badge.svg)](https://github.com/Tencent/spring-cloud-tencent/actions/workflows/junit_test.yml) [![Maven Central](https://img.shields.io/maven-central/v/com.tencent.cloud/spring-cloud-tencent?label=Maven%20Central)](https://search.maven.org/search?q=g:com.tencent.cloud%20AND%20a:spring-cloud-tencent) +[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause) +[![Percentage of issues still open](http://isitmaintained.com/badge/open/Tencent/spring-cloud-tencent.svg)](https://github.com/Tencent/spring-cloud-tencent/issues) +[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg)](https://github.com/Tencent/spring-cloud-tencent/wiki/Contributing) English | [简体中文](./README-zh.md) @@ -77,3 +80,10 @@ For example: ## License The spring-cloud-tencent is licensed under the BSD 3-Clause License. Copyright and license information can be found in the file [LICENSE](LICENSE) + + +## Stargazers over time + +If you are interested in Spring Cloud Tencent, please follow our project, thank you very much. + +[![Stargazers over time](https://starchart.cc/Tencent/spring-cloud-tencent.svg)](https://starchart.cc/Tencent/spring-cloud-tencent) diff --git a/pom.xml b/pom.xml index 92b0fb7b4..e3346026b 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 @@ -97,6 +98,7 @@ 0.8.3 3.2.0 1.2.7 + 3.0.1 true @@ -144,10 +146,6 @@ - - io.spring.javaformat - spring-javaformat-maven-plugin - org.apache.maven.plugins maven-checkstyle-plugin diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml b/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml index a76c72d0d..c55bb3d78 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 diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerBootstrapConfiguration.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerBootstrapConfiguration.java index 2dc681389..d0b276059 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerBootstrapConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/PolarisCircuitBreakerBootstrapConfiguration.java @@ -20,7 +20,9 @@ package com.tencent.cloud.polaris.circuitbreaker; import com.tencent.cloud.common.constant.ContextConstant; import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled; import com.tencent.cloud.polaris.context.PolarisConfigModifier; +import com.tencent.polaris.api.config.consumer.ServiceRouterConfig; import com.tencent.polaris.factory.config.ConfigurationImpl; +import com.tencent.polaris.plugins.router.healthy.RecoverRouterConfig; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; @@ -48,6 +50,16 @@ public class PolarisCircuitBreakerBootstrapConfiguration { public void modify(ConfigurationImpl configuration) { // Turn on circuitbreaker configuration configuration.getConsumer().getCircuitBreaker().setEnable(true); + + // Set excludeCircuitBreakInstances to false + RecoverRouterConfig recoverRouterConfig = configuration.getConsumer().getServiceRouter() + .getPluginConfig(ServiceRouterConfig.DEFAULT_ROUTER_RECOVER, RecoverRouterConfig.class); + + recoverRouterConfig.setExcludeCircuitBreakInstances(true); + + // Update modified config to source properties + configuration.getConsumer().getServiceRouter() + .setPluginConfig(ServiceRouterConfig.DEFAULT_ROUTER_RECOVER, recoverRouterConfig); } @Override diff --git a/spring-cloud-starter-tencent-polaris-discovery/pom.xml b/spring-cloud-starter-tencent-polaris-discovery/pom.xml index 71ae069b1..56095e975 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/pom.xml +++ b/spring-cloud-starter-tencent-polaris-discovery/pom.xml @@ -17,7 +17,7 @@ com.tencent.cloud - spring-cloud-tencent-polaris-context + spring-cloud-tencent-polaris-loadbalancer diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryConfigModifier.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryConfigModifier.java new file mode 100644 index 000000000..a52a6dd4b --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryConfigModifier.java @@ -0,0 +1,50 @@ +/* + * 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; + +import com.tencent.cloud.common.constant.ContextConstant; +import com.tencent.cloud.polaris.context.PolarisConfigModifier; +import com.tencent.polaris.api.config.consumer.ServiceRouterConfig; +import com.tencent.polaris.factory.config.ConfigurationImpl; +import com.tencent.polaris.plugins.router.healthy.RecoverRouterConfig; + +/** + * Spring Cloud Tencent config Override polaris config. + * + *@author lepdou 2022-04-24 + */ +public class DiscoveryConfigModifier implements PolarisConfigModifier { + + @Override + public void modify(ConfigurationImpl configuration) { + // Set excludeCircuitBreakInstances to false + RecoverRouterConfig recoverRouterConfig = configuration.getConsumer().getServiceRouter() + .getPluginConfig(ServiceRouterConfig.DEFAULT_ROUTER_RECOVER, RecoverRouterConfig.class); + recoverRouterConfig.setExcludeCircuitBreakInstances(false); + + // Update modified config to source properties + configuration.getConsumer().getServiceRouter() + .setPluginConfig(ServiceRouterConfig.DEFAULT_ROUTER_RECOVER, recoverRouterConfig); + } + + @Override + public int getOrder() { + return ContextConstant.ModifierOrder.DISCOVERY_ORDER; + } +} diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfiguration.java index 805a7f47d..21ad954c1 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/DiscoveryPropertiesAutoConfiguration.java @@ -74,6 +74,11 @@ public class DiscoveryPropertiesAutoConfiguration { return new PolarisDiscoveryHandler(); } + @Bean + public DiscoveryConfigModifier discoveryConfigModifier() { + return new DiscoveryConfigModifier(); + } + @PostConstruct public void init() { if (null != polarisDiscoveryProperties) { 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 fd8b878e2..951c99f76 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(); @@ -82,6 +84,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 6f85be6c3..95387ae5c 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 @@ -50,7 +50,7 @@ public class PolarisServiceDiscovery { public List getInstances(String serviceId) throws PolarisException { List instances = new ArrayList<>(); InstancesResponse filteredInstances = polarisDiscoveryHandler - .getFilteredInstances(serviceId); + .getHealthyInstances(serviceId); ServiceInstances serviceInstances = filteredInstances.toServiceInstances(); for (Instance instance : serviceInstances.getInstances()) { instances.add(new PolarisServiceInstance(instance)); diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/ribbon/PolarisServerList.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/ribbon/PolarisServerList.java index 866cdcf1d..71833fde9 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/ribbon/PolarisServerList.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/ribbon/PolarisServerList.java @@ -57,7 +57,7 @@ public class PolarisServerList extends AbstractServerList { private List getServers() { InstancesResponse allInstances = polarisDiscoveryHandler - .getFilteredInstances(serviceId); + .getHealthyInstances(serviceId); ServiceInstances serviceInstances = allInstances.toServiceInstances(); List polarisServers = new ArrayList<>(); for (Instance instance : serviceInstances.getInstances()) { diff --git a/spring-cloud-starter-tencent-polaris-router/pom.xml b/spring-cloud-starter-tencent-polaris-router/pom.xml index 0bf38eec6..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 - - 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.cloud - spring-cloud-starter-netflix-ribbon - - - - 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 75c191046..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.PolarisRibbonAutoConfiguration 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..71ce1e886 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. */ @@ -44,6 +52,11 @@ public final class ContextConstant { */ public static Integer CIRCUIT_BREAKER_ORDER = 1; + /** + * Order of discovery configuration modifier. + */ + public static Integer DISCOVERY_ORDER = 0; + /** * Order of configuration modifier. */ diff --git a/spring-cloud-tencent-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml index 5f727c168..f9da2e8e0 100644 --- a/spring-cloud-tencent-dependencies/pom.xml +++ b/spring-cloud-tencent-dependencies/pom.xml @@ -71,14 +71,13 @@ 1.4.0-Hoxton.SR9-SNAPSHOT - 1.4.0 + 1.5.0-SNAPSHOT 2.0.0 3.2.0 - 3.1.1 1.2.7 - 1.6 + 3.0.1 @@ -103,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-polaris-context/pom.xml b/spring-cloud-tencent-polaris-context/pom.xml index c3f9e2adb..6d7fda248 100644 --- a/spring-cloud-tencent-polaris-context/pom.xml +++ b/spring-cloud-tencent-polaris-context/pom.xml @@ -18,44 +18,44 @@ com.tencent.cloud spring-cloud-tencent-commons - - + + - - - com.tencent.polaris - polaris-client - + + + com.tencent.polaris + polaris-client + - - com.tencent.polaris - polaris-plugin-api - + + 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 + @@ -67,23 +67,23 @@ com.tencent.polaris router-healthy - - - com.tencent.polaris - loadbalancer-random - - - com.tencent.polaris - loadbalancer-ringhash - - + + com.tencent.polaris + loadbalancer-random + - - org.springframework.boot - spring-boot-starter-test - test - - + + com.tencent.polaris + loadbalancer-ringhash + + + + + org.springframework.boot + spring-boot-starter-test + test + + diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisContextProperties.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisContextProperties.java index 9c69a4129..95c1c2672 100644 --- a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisContextProperties.java +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/PolarisContextProperties.java @@ -74,11 +74,14 @@ public class PolarisContextProperties { private List modifierList; protected Configuration configuration() { + // 1. Read user-defined polaris.yml configuration ConfigurationImpl configuration = (ConfigurationImpl) ConfigAPIFactory .defaultConfig(ConfigProvider.DEFAULT_CONFIG); - configuration.setDefault(); + + // 2. Override user-defined polaris.yml configuration with SCT configuration String defaultHost = getHost(); configuration.getGlobal().getAPI().setBindIP(defaultHost); + Collection modifiers = modifierList; modifiers = modifiers.stream() .sorted(Comparator.comparingInt(PolarisConfigModifier::getOrder)) @@ -88,6 +91,7 @@ public class PolarisContextProperties { modifier.modify(configuration); } } + return configuration; } diff --git a/spring-cloud-tencent-polaris-loadbalancer/pom.xml b/spring-cloud-tencent-polaris-loadbalancer/pom.xml new file mode 100644 index 000000000..dc64bf192 --- /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-starter-netflix-ribbon + + + + 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 50% 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 513557c07..37ae60526 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,9 +15,10 @@ * 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.Collections; import java.util.List; import java.util.Map; @@ -28,79 +29,59 @@ import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.PollingServerListUpdater; import com.netflix.loadbalancer.Server; import com.netflix.loadbalancer.ServerList; +import com.tencent.cloud.common.constant.ContextConstant; import com.tencent.cloud.common.constant.MetadataConstant.SystemMetadataKey; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.pojo.PolarisServer; +import com.tencent.cloud.polaris.loadbalancer.config.PolarisLoadBalancerProperties; +import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.api.pojo.DefaultInstance; import com.tencent.polaris.api.pojo.DefaultServiceInstances; import com.tencent.polaris.api.pojo.Instance; import com.tencent.polaris.api.pojo.ServiceInfo; import com.tencent.polaris.api.pojo.ServiceInstances; import com.tencent.polaris.api.pojo.ServiceKey; +import com.tencent.polaris.api.rpc.GetAllInstancesRequest; +import com.tencent.polaris.api.rpc.InstancesResponse; import com.tencent.polaris.router.api.core.RouterAPI; import com.tencent.polaris.router.api.rpc.ProcessRoutersRequest; import com.tencent.polaris.router.api.rpc.ProcessRoutersResponse; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang.StringUtils; -import org.springframework.util.CollectionUtils; - /** * Routing load balancer of polaris. * * @author Haotian Zhang */ -public class PolarisRoutingLoadBalancer extends DynamicServerListLoadBalancer { +public class PolarisLoadBalancer extends DynamicServerListLoadBalancer { private final RouterAPI routerAPI; - public PolarisRoutingLoadBalancer(IClientConfig config, IRule rule, IPing ping, - ServerList serverList, RouterAPI routerAPI) { + private ConsumerAPI consumerAPI; + + private PolarisLoadBalancerProperties polarisLoadBalancerProperties; + + public PolarisLoadBalancer(IClientConfig config, IRule rule, IPing ping, ServerList serverList, + RouterAPI routerAPI, ConsumerAPI consumerAPI, PolarisLoadBalancerProperties properties) { super(config, rule, ping, serverList, null, new PollingServerListUpdater()); this.routerAPI = routerAPI; + this.consumerAPI = consumerAPI; + this.polarisLoadBalancerProperties = properties; } @Override public List getReachableServers() { - List allServers = super.getAllServers(); - if (CollectionUtils.isEmpty(allServers)) { - return allServers; - } - ServiceInstances serviceInstances = null; - if (allServers.get(0) instanceof PolarisServer) { - serviceInstances = ((PolarisServer) allServers.get(0)).getServiceInstances(); + ServiceInstances serviceInstances; + if (polarisLoadBalancerProperties.getDiscoveryType().equals(ContextConstant.POLARIS)) { + serviceInstances = getPolarisDiscoveryServiceInstances(); } else { - String serviceName; - // notice the difference between different service registries - if (StringUtils.isNotBlank( - allServers.get(0).getMetaInfo().getServiceIdForDiscovery())) { - serviceName = allServers.get(0).getMetaInfo().getServiceIdForDiscovery(); - } - else { - serviceName = allServers.get(0).getMetaInfo().getAppName(); - } - if (StringUtils.isBlank(serviceName)) { - throw new IllegalStateException( - "PolarisRoutingLoadBalancer only Server with AppName or ServiceIdForDiscovery attribute"); - } - ServiceKey serviceKey = new ServiceKey(MetadataContext.LOCAL_NAMESPACE, - serviceName); - List instances = new ArrayList<>(8); - for (Server server : allServers) { - DefaultInstance instance = new DefaultInstance(); - instance.setNamespace(MetadataContext.LOCAL_NAMESPACE); - instance.setService(serviceName); - instance.setHealthy(server.isAlive()); - instance.setProtocol(server.getScheme()); - instance.setId(server.getId()); - instance.setHost(server.getHost()); - instance.setPort(server.getPort()); - instance.setZone(server.getZone()); - instance.setWeight(100); - instances.add(instance); - } - serviceInstances = new DefaultServiceInstances(serviceKey, instances); + serviceInstances = getExtendDiscoveryServiceInstances(); + } + if (serviceInstances == null || CollectionUtils.isEmpty(serviceInstances.getInstances())) { + return Collections.emptyList(); } ProcessRoutersRequest processRoutersRequest = new ProcessRoutersRequest(); processRoutersRequest.setDstInstances(serviceInstances); @@ -129,9 +110,73 @@ public class PolarisRoutingLoadBalancer extends DynamicServerListLoadBalancer allServers = super.getAllServers(); + if (CollectionUtils.isEmpty(allServers)) { + return null; + } + serviceName = ((PolarisServer) super.getAllServers().get(0)).getServiceInstances().getService(); + } + return getAllInstances(MetadataContext.LOCAL_NAMESPACE, serviceName).toServiceInstances(); + } + + private ServiceInstances getExtendDiscoveryServiceInstances() { + List allServers = super.getAllServers(); + if (CollectionUtils.isEmpty(allServers)) { + return null; + } + ServiceInstances serviceInstances; + String serviceName; + // notice the difference between different service registries + if (StringUtils.isNotBlank( + allServers.get(0).getMetaInfo().getServiceIdForDiscovery())) { + serviceName = allServers.get(0).getMetaInfo().getServiceIdForDiscovery(); + } + else { + serviceName = allServers.get(0).getMetaInfo().getAppName(); + } + if (StringUtils.isBlank(serviceName)) { + throw new IllegalStateException( + "PolarisLoadBalancer only Server with AppName or ServiceIdForDiscovery attribute"); + } + ServiceKey serviceKey = new ServiceKey(MetadataContext.LOCAL_NAMESPACE, + serviceName); + List instances = new ArrayList<>(8); + for (Server server : allServers) { + DefaultInstance instance = new DefaultInstance(); + instance.setNamespace(MetadataContext.LOCAL_NAMESPACE); + instance.setService(serviceName); + instance.setHealthy(server.isAlive()); + instance.setProtocol(server.getScheme()); + instance.setId(server.getId()); + instance.setHost(server.getHost()); + instance.setPort(server.getPort()); + instance.setZone(server.getZone()); + instance.setWeight(100); + instances.add(instance); + } + serviceInstances = new DefaultServiceInstances(serviceKey, instances); + return serviceInstances; + } + @Override public List getAllServers() { return getReachableServers(); } + /** + * Get a list of instances. + * @param namespace namespace + * @param serviceName service name + * @return list of instances + */ + public InstancesResponse getAllInstances(String namespace, String serviceName) { + GetAllInstancesRequest request = new GetAllInstancesRequest(); + request.setNamespace(namespace); + request.setService(serviceName); + return consumerAPI.getAllInstance(request); + } + } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonAutoConfiguration.java b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfiguration.java similarity index 89% rename from spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonAutoConfiguration.java rename to spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfiguration.java index 3edfa7df3..0b8b0583c 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonAutoConfiguration.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; @@ -40,16 +40,15 @@ import org.springframework.context.annotation.Configuration; @Configuration(proxyBeanMethods = false) @EnableConfigurationProperties @ConditionalOnPolarisEnabled -@ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.enabled", - matchIfMissing = true) +@ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.enabled", matchIfMissing = true) @AutoConfigureAfter(RibbonAutoConfiguration.class) @RibbonClients(defaultConfiguration = PolarisRibbonClientConfiguration.class) -public class PolarisRibbonAutoConfiguration { +public class PolarisLoadBalancerAutoConfiguration { @Bean @ConditionalOnMissingBean - public PolarisRibbonProperties polarisRibbonProperties() { - return new PolarisRibbonProperties(); + public PolarisLoadBalancerProperties polarisLoadBalancerProperties() { + return new PolarisLoadBalancerProperties(); } @Bean(name = "polarisRoute") diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonProperties.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/PolarisRibbonProperties.java rename to spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerProperties.java index db5e14fdd..22760e463 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonProperties.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 Ribbon. + * Properties of Polaris loadbalancer. * * @author Haotian Zhang */ -@ConfigurationProperties("spring.cloud.polaris.ribbon") -public class PolarisRibbonProperties { +@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,17 +52,25 @@ public class PolarisRibbonProperties { 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 + return "PolarisLoadBalancerProperties{" + "loadbalancerEnabled=" + enabled + ", strategy='" + strategy + '\'' + '}'; } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonClientConfiguration.java b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisRibbonClientConfiguration.java similarity index 64% rename from spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonClientConfiguration.java rename to spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisRibbonClientConfiguration.java index 6fa1dc51b..3e84ed57f 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/PolarisRibbonClientConfiguration.java +++ b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisRibbonClientConfiguration.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.netflix.client.config.IClientConfig; import com.netflix.loadbalancer.ILoadBalancer; @@ -23,9 +23,10 @@ import com.netflix.loadbalancer.IPing; import com.netflix.loadbalancer.IRule; import com.netflix.loadbalancer.Server; import com.netflix.loadbalancer.ServerList; -import com.tencent.cloud.polaris.router.PolarisRoutingLoadBalancer; -import com.tencent.cloud.polaris.router.rule.PolarisLoadBalanceRule; -import com.tencent.cloud.polaris.router.rule.PolarisWeightedRandomRule; +import com.tencent.cloud.polaris.loadbalancer.PolarisLoadBalancer; +import com.tencent.cloud.polaris.loadbalancer.rule.PolarisLoadBalanceRule; +import com.tencent.cloud.polaris.loadbalancer.rule.PolarisWeightedRandomRule; +import com.tencent.polaris.api.core.ConsumerAPI; import com.tencent.polaris.router.api.core.RouterAPI; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -42,9 +43,10 @@ public class PolarisRibbonClientConfiguration { @Bean @ConditionalOnMissingBean - public IRule polarisRibbonRule(PolarisRibbonProperties polarisRibbonProperties) { + public IRule polarisRibbonRule( + PolarisLoadBalancerProperties polarisLoadBalancerProperties) { switch (PolarisLoadBalanceRule - .fromStrategy(polarisRibbonProperties.getStrategy())) { + .fromStrategy(polarisLoadBalancerProperties.getStrategy())) { case WEIGHTED_RANDOM_RULE: default: return new PolarisWeightedRandomRule(); @@ -53,11 +55,11 @@ public class PolarisRibbonClientConfiguration { @Bean @ConditionalOnMissingBean - public ILoadBalancer polarisRoutingLoadBalancer(IClientConfig iClientConfig, - IRule iRule, IPing iPing, ServerList serverList, - RouterAPI polarisRouter) { - return new PolarisRoutingLoadBalancer(iClientConfig, iRule, iPing, serverList, - polarisRouter); + public ILoadBalancer polarisLoadBalancer(IClientConfig iClientConfig, IRule iRule, + IPing iPing, ServerList serverList, RouterAPI polarisRouter, + ConsumerAPI consumerAPI, PolarisLoadBalancerProperties polarisLoadBalancerProperties) { + return new PolarisLoadBalancer(iClientConfig, iRule, iPing, serverList, + polarisRouter, consumerAPI, polarisLoadBalancerProperties); } } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/rule/PolarisLoadBalanceRule.java b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/rule/PolarisLoadBalanceRule.java similarity index 96% rename from spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/rule/PolarisLoadBalanceRule.java rename to spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/rule/PolarisLoadBalanceRule.java index b95f35197..4831e76e6 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/rule/PolarisLoadBalanceRule.java +++ b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/rule/PolarisLoadBalanceRule.java @@ -15,7 +15,7 @@ * specific language governing permissions and limitations under the License. */ -package com.tencent.cloud.polaris.router.rule; +package com.tencent.cloud.polaris.loadbalancer.rule; import java.util.Arrays; diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/rule/PolarisWeightedRandomRule.java b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/rule/PolarisWeightedRandomRule.java similarity index 98% rename from spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/rule/PolarisWeightedRandomRule.java rename to spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/rule/PolarisWeightedRandomRule.java index e65b0a2ea..055f4bab3 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/rule/PolarisWeightedRandomRule.java +++ b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/rule/PolarisWeightedRandomRule.java @@ -16,7 +16,7 @@ * */ -package com.tencent.cloud.polaris.router.rule; +package com.tencent.cloud.polaris.loadbalancer.rule; import java.util.ArrayList; import java.util.List; 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 61% 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 index c94ac4e0f..5ecb156bc 100644 --- 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 @@ -4,13 +4,19 @@ "name": "spring.cloud.polaris.loadbalancer.enabled", "type": "java.lang.Boolean", "defaultValue": "true", - "description": "polaris loadbalancer" + "description": "polaris loadbalancer." + }, + { + "name": "spring.cloud.polaris.loadbalancer.discoveryType", + "type": "java.lang.String", + "defaultValue": "POLARIS", + "description": "Type of discovery server." }, { "name": "spring.cloud.polaris.loadbalancer.strategy", "type": "java.lang.String", "defaultValue": "random", - "description": "retry,best_available,availability_filtering,round_robin,weighted_response_time,zone_avoidance,random,consistent_hash,weighted_random" + "description": "retry,best_available,availability_filtering,round_robin,weighted_response_time,zone_avoidance,random,consistent_hash,weighted_random." } ] } 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/PolarisRibbonAutoConfigurationTest.java b/spring-cloud-tencent-polaris-loadbalancer/src/test/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfigurationTest.java similarity index 87% rename from spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/PolarisRibbonAutoConfigurationTest.java rename to spring-cloud-tencent-polaris-loadbalancer/src/test/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfigurationTest.java index 4a3ab3384..3e87d5fdd 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/PolarisRibbonAutoConfigurationTest.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; @@ -31,15 +31,15 @@ import static com.tencent.polaris.test.common.Consts.SERVICE_PROVIDER; import static org.assertj.core.api.Assertions.assertThat; /** - * Test for {@link PolarisRibbonAutoConfiguration} + * Test for {@link PolarisLoadBalancerAutoConfiguration} * * @author Haotian Zhang */ -public class PolarisRibbonAutoConfigurationTest { +public class PolarisLoadBalancerAutoConfigurationTest { private ApplicationContextRunner contextRunner = new ApplicationContextRunner() .withConfiguration(AutoConfigurations.of(PolarisRibbonTest.class, - PolarisRibbonAutoConfiguration.class, + PolarisLoadBalancerAutoConfiguration.class, PolarisContextAutoConfiguration.class)) .withPropertyValues("spring.application.name=" + SERVICE_PROVIDER) .withPropertyValues("server.port=" + PORT) @@ -49,7 +49,7 @@ public class PolarisRibbonAutoConfigurationTest { public void testDefaultInitialization() { this.contextRunner.run(context -> { assertThat(context).hasSingleBean(RouterAPI.class); - assertThat(context).hasSingleBean(PolarisRibbonProperties.class); + assertThat(context).hasSingleBean(PolarisLoadBalancerProperties.class); }); }