From 07f04174ca487cf1db1d9c19bbe44853e2bcf117 Mon Sep 17 00:00:00 2001
From: Haotian Zhang <928016560@qq.com>
Date: Fri, 21 Apr 2023 11:40:31 +0800
Subject: [PATCH] optimize ServiceRuleManager
---
...sRouterEndpointAutoConfigurationTests.java | 19 ++++--
spring-cloud-tencent-polaris-context/pom.xml | 19 +-----
.../polaris/context/ServiceRuleManager.java | 65 +++++++------------
.../PolarisContextAutoConfiguration.java | 21 ++++--
.../config/PolarisContextProperties.java | 27 +++-----
.../pom.xml | 17 ++---
.../PolarisLoadBalancerAutoConfiguration.java | 9 ---
7 files changed, 67 insertions(+), 110 deletions(-)
diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/endpoint/PolarisRouterEndpointAutoConfigurationTests.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/endpoint/PolarisRouterEndpointAutoConfigurationTests.java
index 22234487..40c4c098 100644
--- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/endpoint/PolarisRouterEndpointAutoConfigurationTests.java
+++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/endpoint/PolarisRouterEndpointAutoConfigurationTests.java
@@ -18,7 +18,9 @@
package com.tencent.cloud.polaris.router.endpoint;
import com.tencent.cloud.polaris.context.ServiceRuleManager;
+import com.tencent.polaris.api.core.ConsumerAPI;
import com.tencent.polaris.client.api.SDKContext;
+import com.tencent.polaris.factory.api.DiscoveryAPIFactory;
import org.junit.jupiter.api.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations;
@@ -30,17 +32,15 @@ import static org.assertj.core.api.Assertions.assertThat;
/**
* test for {@link PolarisRouterEndpointAutoConfiguration}.
+ *
* @author dongyinuo
*/
public class PolarisRouterEndpointAutoConfigurationTests {
- private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner()
- .withConfiguration(AutoConfigurations.of(
- TestServiceRuleManagerConfiguration.class,
- PolarisRouterEndpointAutoConfiguration.class))
- .withPropertyValues("endpoints.polaris-router.enabled=true");
private ServiceRuleManager serviceRuleManager;
+ private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner().withConfiguration(AutoConfigurations.of(TestServiceRuleManagerConfiguration.class, PolarisRouterEndpointAutoConfiguration.class)).withPropertyValues("endpoints.polaris-router.enabled=true");
+
@Test
public void polarisRouterEndpoint() {
contextRunner.run(context -> {
@@ -52,8 +52,13 @@ public class PolarisRouterEndpointAutoConfigurationTests {
static class TestServiceRuleManagerConfiguration {
@Bean
- public ServiceRuleManager serviceRuleManager(SDKContext sdkContext) {
- return new ServiceRuleManager(sdkContext);
+ public ServiceRuleManager serviceRuleManager(SDKContext sdkContext, ConsumerAPI consumerAPI) {
+ return new ServiceRuleManager(sdkContext, consumerAPI);
+ }
+
+ @Bean
+ public ConsumerAPI consumerAPI(SDKContext sdkContext) {
+ return DiscoveryAPIFactory.createConsumerAPIByContext(sdkContext);
}
@Bean
diff --git a/spring-cloud-tencent-polaris-context/pom.xml b/spring-cloud-tencent-polaris-context/pom.xml
index ddfcb6ee..be6fbd90 100644
--- a/spring-cloud-tencent-polaris-context/pom.xml
+++ b/spring-cloud-tencent-polaris-context/pom.xml
@@ -46,14 +46,6 @@
com.tencent.polaris
router-set
-
- com.tencent.polaris
- router-isolated
-
-
- com.tencent.polaris
- router-healthy
-
@@ -102,17 +94,12 @@
com.tencent.polaris
flow-cache-expired
-
-
-
- com.tencent.polaris
- router-isolated
-
-
+
com.tencent.polaris
- router-healthy
+ polaris-router-factory
+
com.tencent.polaris
diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/ServiceRuleManager.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/ServiceRuleManager.java
index 8294fb0e..12889949 100644
--- a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/ServiceRuleManager.java
+++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/ServiceRuleManager.java
@@ -19,19 +19,14 @@
package com.tencent.cloud.polaris.context;
import java.util.ArrayList;
-import java.util.HashSet;
import java.util.List;
-import java.util.Set;
-import com.tencent.polaris.api.pojo.DefaultServiceEventKeysProvider;
+import com.tencent.polaris.api.core.ConsumerAPI;
import com.tencent.polaris.api.pojo.ServiceEventKey;
-import com.tencent.polaris.api.pojo.ServiceKey;
import com.tencent.polaris.api.pojo.ServiceRule;
+import com.tencent.polaris.api.rpc.GetServiceRuleRequest;
+import com.tencent.polaris.api.rpc.ServiceRuleResponse;
import com.tencent.polaris.client.api.SDKContext;
-import com.tencent.polaris.client.flow.BaseFlow;
-import com.tencent.polaris.client.flow.DefaultFlowControlParam;
-import com.tencent.polaris.client.flow.FlowControlParam;
-import com.tencent.polaris.client.flow.ResourcesResponse;
import com.tencent.polaris.specification.api.v1.traffic.manage.RateLimitProto;
import com.tencent.polaris.specification.api.v1.traffic.manage.RoutingProto;
import org.slf4j.Logger;
@@ -46,28 +41,17 @@ public class ServiceRuleManager {
private static final Logger LOG = LoggerFactory.getLogger(ServiceRuleManager.class);
private final SDKContext sdkContext;
- private final FlowControlParam controlParam;
+ private final ConsumerAPI consumerAPI;
- public ServiceRuleManager(SDKContext sdkContext) {
+ public ServiceRuleManager(SDKContext sdkContext, ConsumerAPI consumerAPI) {
this.sdkContext = sdkContext;
- controlParam = new DefaultFlowControlParam();
- controlParam.setTimeoutMs(sdkContext.getConfig().getGlobal().getAPI().getTimeout());
- controlParam.setMaxRetry(sdkContext.getConfig().getGlobal().getAPI().getMaxRetryTimes());
- controlParam.setRetryIntervalMs(sdkContext.getConfig().getGlobal().getAPI().getRetryInterval());
+ this.consumerAPI = consumerAPI;
}
public RateLimitProto.RateLimit getServiceRateLimitRule(String namespace, String service) {
LOG.debug("Get service rate limit rules with namespace:{} and service:{}.", namespace, service);
- ServiceEventKey serviceEventKey = new ServiceEventKey(new ServiceKey(namespace, service),
- ServiceEventKey.EventType.RATE_LIMITING);
- DefaultServiceEventKeysProvider svcKeysProvider = new DefaultServiceEventKeysProvider();
- svcKeysProvider.setSvcEventKey(serviceEventKey);
-
- ResourcesResponse resourcesResponse = BaseFlow
- .syncGetResources(sdkContext.getExtensions(), true, svcKeysProvider, controlParam);
-
- ServiceRule serviceRule = resourcesResponse.getServiceRule(serviceEventKey);
+ ServiceRule serviceRule = getServiceRule(namespace, service, ServiceEventKey.EventType.RATE_LIMITING);
if (serviceRule != null) {
Object rule = serviceRule.getRule();
if (rule instanceof RateLimitProto.RateLimit) {
@@ -79,29 +63,12 @@ public class ServiceRuleManager {
}
public List getServiceRouterRule(String namespace, String sourceService, String dstService) {
- LOG.debug("Get service router rules with namespace:{} and sourceService:{} and dstService:{}.",
- namespace, sourceService, dstService);
- Set routerKeys = new HashSet<>();
-
- ServiceEventKey dstSvcEventKey = new ServiceEventKey(new ServiceKey(namespace, dstService),
- ServiceEventKey.EventType.ROUTING);
- routerKeys.add(dstSvcEventKey);
-
- ServiceEventKey srcSvcEventKey = new ServiceEventKey(new ServiceKey(namespace, sourceService),
- ServiceEventKey.EventType.ROUTING);
- routerKeys.add(srcSvcEventKey);
-
- DefaultServiceEventKeysProvider svcKeysProvider = new DefaultServiceEventKeysProvider();
- svcKeysProvider.setSvcEventKeys(routerKeys);
-
-
- ResourcesResponse resourcesResponse = BaseFlow
- .syncGetResources(sdkContext.getExtensions(), true, svcKeysProvider, controlParam);
+ LOG.debug("Get service router rules with namespace:{} and sourceService:{} and dstService:{}.", namespace, sourceService, dstService);
List rules = new ArrayList<>();
//get source service outbound rules.
- ServiceRule sourceServiceRule = resourcesResponse.getServiceRule(srcSvcEventKey);
+ ServiceRule sourceServiceRule = getServiceRule(namespace, sourceService, ServiceEventKey.EventType.ROUTING);
if (sourceServiceRule != null) {
Object rule = sourceServiceRule.getRule();
if (rule instanceof RoutingProto.Routing) {
@@ -110,7 +77,7 @@ public class ServiceRuleManager {
}
//get peer service inbound rules.
- ServiceRule dstServiceRule = resourcesResponse.getServiceRule(dstSvcEventKey);
+ ServiceRule dstServiceRule = getServiceRule(namespace, dstService, ServiceEventKey.EventType.ROUTING);
if (dstServiceRule != null) {
Object rule = dstServiceRule.getRule();
if (rule instanceof RoutingProto.Routing) {
@@ -120,4 +87,16 @@ public class ServiceRuleManager {
return rules;
}
+
+ private ServiceRule getServiceRule(String namespace, String service, ServiceEventKey.EventType eventType) {
+ GetServiceRuleRequest getServiceRuleRequest = new GetServiceRuleRequest();
+ getServiceRuleRequest.setRuleType(eventType);
+ getServiceRuleRequest.setService(service);
+ getServiceRuleRequest.setTimeoutMs(sdkContext.getConfig().getGlobal().getAPI().getTimeout());
+ getServiceRuleRequest.setNamespace(namespace);
+
+ ServiceRuleResponse res = consumerAPI.getServiceRule(getServiceRuleRequest);
+ return res.getServiceRule();
+ }
+
}
diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java
index eab0ad5e..d51cf35a 100644
--- a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java
+++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextAutoConfiguration.java
@@ -18,19 +18,25 @@
package com.tencent.cloud.polaris.context.config;
+import java.util.List;
+
import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled;
import com.tencent.cloud.polaris.context.ModifyAddress;
+import com.tencent.cloud.polaris.context.PolarisConfigModifier;
import com.tencent.cloud.polaris.context.ServiceRuleManager;
import com.tencent.polaris.api.core.ConsumerAPI;
import com.tencent.polaris.api.core.ProviderAPI;
import com.tencent.polaris.api.exception.PolarisException;
import com.tencent.polaris.client.api.SDKContext;
import com.tencent.polaris.factory.api.DiscoveryAPIFactory;
+import com.tencent.polaris.factory.api.RouterAPIFactory;
+import com.tencent.polaris.router.api.core.RouterAPI;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.core.env.Environment;
/**
* Autoconfiguration for Polaris {@link SDKContext}.
@@ -44,9 +50,9 @@ public class PolarisContextAutoConfiguration {
@Bean(name = "polarisContext", initMethod = "init", destroyMethod = "destroy")
@ConditionalOnMissingBean
- public SDKContext polarisContext(PolarisContextProperties properties)
- throws PolarisException {
- return SDKContext.initContextByConfig(properties.configuration());
+ public SDKContext polarisContext(PolarisContextProperties properties, Environment environment, List modifierList) throws PolarisException {
+ return SDKContext.initContextByConfig(properties.configuration(modifierList,
+ () -> environment.getProperty("spring.cloud.client.ip-address")));
}
@Bean
@@ -61,6 +67,11 @@ public class PolarisContextAutoConfiguration {
return DiscoveryAPIFactory.createConsumerAPIByContext(polarisContext);
}
+ @Bean
+ public RouterAPI polarisRouter(SDKContext polarisContext) throws PolarisException {
+ return RouterAPIFactory.createRouterAPIByContext(polarisContext);
+ }
+
@Bean
@ConditionalOnMissingBean
public ModifyAddress polarisConfigModifier(PolarisContextProperties properties) {
@@ -69,7 +80,7 @@ public class PolarisContextAutoConfiguration {
@Bean
@ConditionalOnMissingBean
- public ServiceRuleManager serviceRuleManager(SDKContext sdkContext) {
- return new ServiceRuleManager(sdkContext);
+ public ServiceRuleManager serviceRuleManager(SDKContext sdkContext, ConsumerAPI consumerAPI) {
+ return new ServiceRuleManager(sdkContext, consumerAPI);
}
}
diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextProperties.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextProperties.java
index ef2111e7..696218a2 100644
--- a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextProperties.java
+++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/PolarisContextProperties.java
@@ -21,6 +21,7 @@ package com.tencent.cloud.polaris.context.config;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
+import java.util.function.Supplier;
import java.util.stream.Collectors;
import com.tencent.cloud.polaris.context.PolarisConfigModifier;
@@ -30,9 +31,7 @@ import com.tencent.polaris.factory.ConfigAPIFactory;
import com.tencent.polaris.factory.config.ConfigurationImpl;
import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
-import org.springframework.core.env.Environment;
import org.springframework.util.CollectionUtils;
/**
@@ -68,19 +67,18 @@ public class PolarisContextProperties {
*/
private String service;
- @Autowired
- private Environment environment;
-
- @Autowired
- private List modifierList;
-
- protected Configuration configuration() {
+ public Configuration configuration(List modifierList, Supplier ipAddressSupplier) {
// 1. Read user-defined polaris.yml configuration
ConfigurationImpl configuration = (ConfigurationImpl) ConfigAPIFactory
.defaultConfig(ConfigProvider.DEFAULT_CONFIG);
// 2. Override user-defined polaris.yml configuration with SCT configuration
- String defaultHost = getHost();
+ String defaultHost = this.localIpAddress;
+ if (StringUtils.isBlank(localIpAddress)) {
+ defaultHost = ipAddressSupplier.get();
+ this.localIpAddress = defaultHost;
+ }
+
configuration.getGlobal().getAPI().setBindIP(defaultHost);
Collection modifiers = modifierList;
@@ -96,14 +94,6 @@ public class PolarisContextProperties {
return configuration;
}
- private String getHost() {
- if (StringUtils.isNotBlank(localIpAddress)) {
- return localIpAddress;
- }
- this.localIpAddress = environment.getProperty("spring.cloud.client.ip-address");
- return this.localIpAddress;
- }
-
public String getAddress() {
return address;
}
@@ -143,5 +133,4 @@ public class PolarisContextProperties {
public void setService(String service) {
this.service = service;
}
-
}
diff --git a/spring-cloud-tencent-polaris-loadbalancer/pom.xml b/spring-cloud-tencent-polaris-loadbalancer/pom.xml
index 2a26fcd8..a66c3ec9 100644
--- a/spring-cloud-tencent-polaris-loadbalancer/pom.xml
+++ b/spring-cloud-tencent-polaris-loadbalancer/pom.xml
@@ -22,11 +22,6 @@
-
- com.tencent.polaris
- polaris-router-factory
-
-
com.tencent.polaris
polaris-discovery-api
@@ -55,12 +50,12 @@
mockito-inline
test
-
- com.tencent.polaris
- polaris-discovery-client
- test
-
+
+ com.tencent.polaris
+ polaris-discovery-client
+ test
+
-
+
diff --git a/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfiguration.java b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfiguration.java
index 6774b548..bed78f17 100644
--- a/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfiguration.java
+++ b/spring-cloud-tencent-polaris-loadbalancer/src/main/java/com/tencent/cloud/polaris/loadbalancer/config/PolarisLoadBalancerAutoConfiguration.java
@@ -18,10 +18,6 @@
package com.tencent.cloud.polaris.loadbalancer.config;
import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled;
-import com.tencent.polaris.api.exception.PolarisException;
-import com.tencent.polaris.client.api.SDKContext;
-import com.tencent.polaris.factory.api.RouterAPIFactory;
-import com.tencent.polaris.router.api.core.RouterAPI;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -48,9 +44,4 @@ public class PolarisLoadBalancerAutoConfiguration {
public PolarisLoadBalancerProperties polarisLoadBalancerProperties() {
return new PolarisLoadBalancerProperties();
}
-
- @Bean
- public RouterAPI routerAPI(SDKContext polarisContext) throws PolarisException {
- return RouterAPIFactory.createRouterAPIByContext(polarisContext);
- }
}