diff --git a/CHANGELOG.md b/CHANGELOG.md index 6b04cfbda..9310583e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,3 +18,4 @@ - [refactor: optimize performance.](https://github.com/Tencent/spring-cloud-tencent/pull/1782) - [fix: fix NacosDiscoveryRegistryAutoConfiguration and PolarisAuthAutoConfiguration still initiation when polaris disabled.](https://github.com/Tencent/spring-cloud-tencent/pull/1783) - [fix: fix cb rule no update bug.](https://github.com/Tencent/spring-cloud-tencent/pull/1786) +- [feat: support traffic gray lane router](https://github.com/Tencent/spring-cloud-tencent/pull/1785) diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/RouterConfigModifier.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/RouterConfigModifier.java index b0caff8d6..4d6805c34 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/RouterConfigModifier.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/RouterConfigModifier.java @@ -19,11 +19,13 @@ package com.tencent.cloud.polaris.router; import com.tencent.cloud.common.constant.OrderConstant; import com.tencent.cloud.polaris.context.PolarisConfigModifier; +import com.tencent.cloud.polaris.router.config.properties.PolarisLaneRouterProperties; import com.tencent.cloud.polaris.router.config.properties.PolarisNearByRouterProperties; import com.tencent.polaris.api.config.consumer.ServiceRouterConfig; import com.tencent.polaris.api.utils.StringUtils; import com.tencent.polaris.factory.config.ConfigurationImpl; import com.tencent.polaris.plugins.router.healthy.RecoverRouterConfig; +import com.tencent.polaris.plugins.router.lane.LaneRouterConfig; import com.tencent.polaris.plugins.router.nearby.NearbyRouterConfig; import com.tencent.polaris.specification.api.v1.traffic.manage.RoutingProto; @@ -36,8 +38,11 @@ public class RouterConfigModifier implements PolarisConfigModifier { private final PolarisNearByRouterProperties polarisNearByRouterProperties; - public RouterConfigModifier(PolarisNearByRouterProperties polarisNearByRouterProperties) { + private final PolarisLaneRouterProperties polarisLaneRouterProperties; + + public RouterConfigModifier(PolarisNearByRouterProperties polarisNearByRouterProperties, PolarisLaneRouterProperties polarisLaneRouterProperties) { this.polarisNearByRouterProperties = polarisNearByRouterProperties; + this.polarisLaneRouterProperties = polarisLaneRouterProperties; } @Override @@ -59,7 +64,11 @@ public class RouterConfigModifier implements PolarisConfigModifier { configuration.getConsumer().getServiceRouter() .setPluginConfig(ServiceRouterConfig.DEFAULT_ROUTER_NEARBY, nearbyRouterConfig); } - + LaneRouterConfig laneRouterConfig = configuration.getConsumer().getServiceRouter().getPluginConfig( + ServiceRouterConfig.DEFAULT_ROUTER_LANE, LaneRouterConfig.class); + laneRouterConfig.setBaseLaneMode(polarisLaneRouterProperties.getBaseLaneMode()); + configuration.getConsumer().getServiceRouter() + .setPluginConfig(ServiceRouterConfig.DEFAULT_ROUTER_LANE, laneRouterConfig); } @Override diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/RouterConfigModifierAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/RouterConfigModifierAutoConfiguration.java index c428b4a0a..3355bc7af 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/RouterConfigModifierAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/RouterConfigModifierAutoConfiguration.java @@ -18,6 +18,7 @@ package com.tencent.cloud.polaris.router.config; import com.tencent.cloud.polaris.router.RouterConfigModifier; +import com.tencent.cloud.polaris.router.config.properties.PolarisLaneRouterProperties; import com.tencent.cloud.polaris.router.config.properties.PolarisMetadataRouterProperties; import com.tencent.cloud.polaris.router.config.properties.PolarisNamespaceRouterProperties; import com.tencent.cloud.polaris.router.config.properties.PolarisNearByRouterProperties; @@ -36,13 +37,14 @@ import org.springframework.context.annotation.Import; @Configuration(proxyBeanMethods = false) @ConditionalOnPolarisRouterEnabled @Import({PolarisNearByRouterProperties.class, PolarisMetadataRouterProperties.class, PolarisRuleBasedRouterProperties.class, - PolarisNamespaceRouterProperties.class}) + PolarisNamespaceRouterProperties.class, PolarisLaneRouterProperties.class}) public class RouterConfigModifierAutoConfiguration { @Bean @ConditionalOnMissingBean - public RouterConfigModifier routerConfigModifier(PolarisNearByRouterProperties polarisNearByRouterProperties) { - return new RouterConfigModifier(polarisNearByRouterProperties); + public RouterConfigModifier routerConfigModifier(PolarisNearByRouterProperties polarisNearByRouterProperties, + PolarisLaneRouterProperties polarisLaneRouterProperties) { + return new RouterConfigModifier(polarisNearByRouterProperties, polarisLaneRouterProperties); } } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/properties/PolarisLaneRouterProperties.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/properties/PolarisLaneRouterProperties.java new file mode 100644 index 000000000..a81f34f63 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/properties/PolarisLaneRouterProperties.java @@ -0,0 +1,48 @@ +/* + * Tencent is pleased to support the open source community by making spring-cloud-tencent available. + * + * Copyright (C) 2021 Tencent. 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.router.config.properties; + +import com.tencent.polaris.plugins.router.lane.BaseLaneMode; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +/** + * the configuration for lane router. + * + * @author Yuwei Fu + */ +@ConfigurationProperties(prefix = "spring.cloud.polaris.router.lane-router") +public class PolarisLaneRouterProperties { + + private BaseLaneMode baseLaneMode = BaseLaneMode.ONLY_UNTAGGED_INSTANCE; + + public BaseLaneMode getBaseLaneMode() { + return baseLaneMode; + } + + public void setBaseLaneMode(BaseLaneMode baseLaneMode) { + this.baseLaneMode = baseLaneMode; + } + + @Override + public String toString() { + return "PolarisLaneRouterProperties{" + + "baseLaneMode=" + baseLaneMode + + '}'; + } +} diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/properties/PolarisLaneRouterPropertiesTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/properties/PolarisLaneRouterPropertiesTest.java new file mode 100644 index 000000000..7d4678982 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/config/properties/PolarisLaneRouterPropertiesTest.java @@ -0,0 +1,78 @@ +/* + * Tencent is pleased to support the open source community by making spring-cloud-tencent available. + * + * Copyright (C) 2021 Tencent. 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.router.config.properties; + +import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration; +import com.tencent.cloud.polaris.router.config.RouterConfigModifierAutoConfiguration; +import com.tencent.polaris.plugins.router.lane.BaseLaneMode; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.test.context.runner.WebApplicationContextRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * test for {@link PolarisLaneRouterProperties}. + */ +public class PolarisLaneRouterPropertiesTest { + private final WebApplicationContextRunner contextRunner = new WebApplicationContextRunner() + .withConfiguration(AutoConfigurations.of( + PolarisContextAutoConfiguration.class, + RouterConfigModifierAutoConfiguration.class + )) + .withPropertyValues("spring.application.name=test"); + + PolarisLaneRouterProperties properties; + + @BeforeEach + void setUp() { + properties = new PolarisLaneRouterProperties(); + } + + @Test + public void testDefaultValues() { + contextRunner.run(context -> { + PolarisLaneRouterProperties props = context.getBean(PolarisLaneRouterProperties.class); + assertThat(props.getBaseLaneMode()).isEqualTo(BaseLaneMode.ONLY_UNTAGGED_INSTANCE); + }); + } + + @Test + public void testBaseLaneModePropertyBinding() { + contextRunner + .withPropertyValues("spring.cloud.polaris.router.lane-router.base-lane-mode=" + BaseLaneMode.EXCLUDE_ENABLED_LANE_INSTANCE.name()) + .run(context -> { + PolarisLaneRouterProperties props = context.getBean(PolarisLaneRouterProperties.class); + assertThat(props.getBaseLaneMode()).isEqualTo(BaseLaneMode.EXCLUDE_ENABLED_LANE_INSTANCE); + }); + } + + @Test + public void testGetBaseLaneMode() { + assertThat(properties.getBaseLaneMode()).isEqualTo(BaseLaneMode.ONLY_UNTAGGED_INSTANCE); + } + + @Test + public void testSetBaseLaneMode() { + properties.setBaseLaneMode(BaseLaneMode.EXCLUDE_ENABLED_LANE_INSTANCE); + assertThat(properties.getBaseLaneMode()).isEqualTo(BaseLaneMode.EXCLUDE_ENABLED_LANE_INSTANCE); + } + +} diff --git a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/extend/tsf/TsfCoreEnvironmentPostProcessor.java b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/extend/tsf/TsfCoreEnvironmentPostProcessor.java index 4760fa5df..f813804db 100644 --- a/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/extend/tsf/TsfCoreEnvironmentPostProcessor.java +++ b/spring-cloud-tencent-polaris-context/src/main/java/com/tencent/cloud/polaris/context/config/extend/tsf/TsfCoreEnvironmentPostProcessor.java @@ -23,6 +23,7 @@ import java.util.Map; import com.tencent.cloud.common.tsf.TsfContextUtils; import com.tencent.polaris.api.utils.IPAddressUtils; import com.tencent.polaris.api.utils.StringUtils; +import com.tencent.polaris.plugins.router.lane.BaseLaneMode; import org.apache.commons.logging.Log; import org.springframework.boot.SpringApplication; @@ -182,6 +183,10 @@ public final class TsfCoreEnvironmentPostProcessor implements EnvironmentPostPro environment.getProperty("spring.cloud.polaris.router.namespace-router.enabled", "true")); defaultProperties.put("spring.cloud.polaris.discovery.all-recover-enabled", environment.getProperty("spring.cloud.polaris.discovery.all-recover-enabled", "false")); + defaultProperties.put("spring.cloud.polaris.lane.router.enabled", + environment.getProperty("spring.cloud.polaris.lane.router.enabled", "true")); + defaultProperties.put("spring.cloud.polaris.lane.router.baseLaneMode", + environment.getProperty("spring.cloud.polaris.lane.router.baseLaneMode", BaseLaneMode.EXCLUDE_ENABLED_LANE_INSTANCE.name())); } }