diff --git a/pom.xml b/pom.xml
index 92b0fb7b..2bb87f4f 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
diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml b/spring-cloud-starter-tencent-polaris-circuitbreaker/pom.xml
index a76c72d0..c55bb3d7 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-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 fd8b878e..951c99f7 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 6f85be6c..95387ae5 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 866cdcf1..71833fde 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 0bf38eec..d623da7b 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/resources/META-INF/spring.factories b/spring-cloud-starter-tencent-polaris-router/src/main/resources/META-INF/spring.factories
deleted file mode 100644
index 75c19104..00000000
--- 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-dependencies/pom.xml b/spring-cloud-tencent-dependencies/pom.xml
index 5f727c16..823845b8 100644
--- a/spring-cloud-tencent-dependencies/pom.xml
+++ b/spring-cloud-tencent-dependencies/pom.xml
@@ -71,7 +71,7 @@
1.4.0-Hoxton.SR9-SNAPSHOT
- 1.4.0
+ 1.5.0-SNAPSHOT
2.0.0
@@ -103,6 +103,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 c3f9e2ad..6d7fda24 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-loadbalancer/pom.xml b/spring-cloud-tencent-polaris-loadbalancer/pom.xml
new file mode 100644
index 00000000..dc64bf19
--- /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 71%
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 513557c0..b4103c6c 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,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;
@@ -32,12 +32,15 @@ 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.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;
@@ -50,28 +53,51 @@ import org.springframework.util.CollectionUtils;
*
* @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 boolean isPolarisDiscovery = true;
+
+ private boolean isFirstCall = true;
+
+ public PolarisLoadBalancer(IClientConfig config, IRule rule, IPing ping,
+ ServerList serverList, RouterAPI routerAPI, ConsumerAPI consumerAPI) {
super(config, rule, ping, serverList, null, new PollingServerListUpdater());
this.routerAPI = routerAPI;
+ this.consumerAPI = consumerAPI;
}
@Override
public List getReachableServers() {
- List allServers = super.getAllServers();
- if (CollectionUtils.isEmpty(allServers)) {
- return allServers;
+ List allServers = null;
+ if (isFirstCall) {
+ allServers = super.getAllServers();
+ if (CollectionUtils.isEmpty(allServers)) {
+ return allServers;
+ }
+ if (allServers.get(0) instanceof PolarisServer) {
+ isPolarisDiscovery = true;
+ }
+ else {
+ isPolarisDiscovery = false;
+ }
+ isFirstCall = false;
}
- ServiceInstances serviceInstances = null;
- if (allServers.get(0) instanceof PolarisServer) {
- serviceInstances = ((PolarisServer) allServers.get(0)).getServiceInstances();
+
+ ServiceInstances serviceInstances;
+ String serviceName = null;
+ if (isPolarisDiscovery) {
+ // serviceName = ((PolarisServer)allServers.get(0)).getServiceInstances().getService();
+ serviceInstances = getAllInstances(MetadataContext.LOCAL_NAMESPACE,
+ MetadataContextHolder.get().getSystemMetadata(SystemMetadataKey.PEER_SERVICE)).toServiceInstances();
}
else {
- String serviceName;
+ if (CollectionUtils.isEmpty(allServers)) {
+ allServers = super.getAllServers();
+ }
// notice the difference between different service registries
if (StringUtils.isNotBlank(
allServers.get(0).getMetaInfo().getServiceIdForDiscovery())) {
@@ -82,7 +108,7 @@ public class PolarisRoutingLoadBalancer extends DynamicServerListLoadBalancer 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) {
+ return new PolarisLoadBalancer(iClientConfig, iRule, iPing, serverList,
+ polarisRouter, consumerAPI);
}
}
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 b95f3519..4831e76e 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 e65b0a2e..055f4bab 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 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 00000000..a13924ba
--- /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 4a3ab338..3e87d5fd 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);
});
}