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); - } }