diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/RouterAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/RouterAutoConfiguration.java index 86bf05119..ae9a37e17 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/RouterAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/config/RouterAutoConfiguration.java @@ -18,7 +18,6 @@ package com.tencent.cloud.polaris.router.config; -import java.util.Collections; import java.util.List; import com.tencent.cloud.common.metadata.config.MetadataLocalProperties; @@ -35,11 +34,9 @@ import com.tencent.cloud.polaris.router.interceptor.RuleBasedRouterRequestInterc import com.tencent.cloud.polaris.router.spi.ServletRouterLabelResolver; import com.tencent.cloud.polaris.router.zuul.PolarisRibbonRoutingFilter; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.netflix.ribbon.RibbonClients; -import org.springframework.cloud.netflix.ribbon.support.RibbonRequestCustomizer; import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper; import org.springframework.cloud.netflix.zuul.filters.route.RibbonCommandFactory; import org.springframework.context.annotation.Bean; @@ -96,18 +93,14 @@ public class RouterAutoConfiguration { return new RuleBasedRouterRequestInterceptor(polarisRuleBasedRouterProperties); } - @SuppressWarnings("rawtypes") - @Autowired(required = false) - private List requestCustomizers = Collections.emptyList(); - - @Bean + @Bean(initMethod = "init") @ConditionalOnClass(name = "org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter") public PolarisRibbonRoutingFilter ribbonRoutingFilter(ProxyRequestHelper helper, RibbonCommandFactory ribbonCommandFactory, MetadataLocalProperties metadataLocalProperties, RouterRuleLabelResolver routerRuleLabelResolver, List routerLabelResolvers) { - return new PolarisRibbonRoutingFilter(helper, ribbonCommandFactory, - this.requestCustomizers, metadataLocalProperties, routerRuleLabelResolver, routerLabelResolvers); + return new PolarisRibbonRoutingFilter(helper, ribbonCommandFactory, metadataLocalProperties, + routerRuleLabelResolver, routerLabelResolvers); } } diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java index 153e3d37f..e9e737629 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java @@ -32,6 +32,7 @@ import com.netflix.zuul.context.RequestContext; import com.tencent.cloud.common.metadata.MetadataContext; import com.tencent.cloud.common.metadata.MetadataContextHolder; import com.tencent.cloud.common.metadata.config.MetadataLocalProperties; +import com.tencent.cloud.common.util.BeanFactoryUtils; import com.tencent.cloud.common.util.expresstion.ServletExpressionLabelUtils; import com.tencent.cloud.polaris.router.PolarisRouterContext; import com.tencent.cloud.polaris.router.RouterRuleLabelResolver; @@ -39,6 +40,9 @@ import com.tencent.cloud.polaris.router.spi.ServletRouterLabelResolver; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.BeanFactory; +import org.springframework.beans.factory.BeanFactoryAware; import org.springframework.cloud.netflix.ribbon.support.RibbonCommandContext; import org.springframework.cloud.netflix.ribbon.support.RibbonRequestCustomizer; import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper; @@ -57,10 +61,12 @@ import static org.springframework.cloud.netflix.zuul.filters.support.FilterConst * * @author jarvisxiong 2022-08-04 */ -public class PolarisRibbonRoutingFilter extends RibbonRoutingFilter { +public class PolarisRibbonRoutingFilter extends RibbonRoutingFilter implements BeanFactoryAware { private static final Logger LOGGER = LoggerFactory.getLogger(PolarisRibbonRoutingFilter.class); + private BeanFactory factory; + private final MetadataLocalProperties metadataLocalProperties; private final RouterRuleLabelResolver routerRuleLabelResolver; @@ -71,11 +77,10 @@ public class PolarisRibbonRoutingFilter extends RibbonRoutingFilter { public PolarisRibbonRoutingFilter(ProxyRequestHelper helper, RibbonCommandFactory ribbonCommandFactory, - List requestCustomizers, MetadataLocalProperties metadataLocalProperties, RouterRuleLabelResolver routerRuleLabelResolver, List routerLabelResolvers) { - super(helper, ribbonCommandFactory, requestCustomizers); + super(helper, ribbonCommandFactory, Collections.emptyList()); this.metadataLocalProperties = metadataLocalProperties; this.routerRuleLabelResolver = routerRuleLabelResolver; @@ -96,6 +101,7 @@ public class PolarisRibbonRoutingFilter extends RibbonRoutingFilter { } } + @Override protected RibbonCommandContext buildCommandContext(RequestContext context) { HttpServletRequest request = context.getRequest(); @@ -170,6 +176,11 @@ public class PolarisRibbonRoutingFilter extends RibbonRoutingFilter { return routerContext; } + @Override + public void setBeanFactory(BeanFactory beanFactory) throws BeansException { + this.factory = beanFactory; + } + private Map getExpressionLabels(HttpServletRequest request, Set labelKeys) { if (CollectionUtils.isEmpty(labelKeys)) { return Collections.emptyMap(); @@ -177,4 +188,8 @@ public class PolarisRibbonRoutingFilter extends RibbonRoutingFilter { return ServletExpressionLabelUtils.resolve(request, labelKeys); } + + private void init() { + this.requestCustomizers = BeanFactoryUtils.getBeans(factory, RibbonRequestCustomizer.class); + } } diff --git a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilterTest.java b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilterTest.java index adf19cdb1..537e4eca5 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilterTest.java +++ b/spring-cloud-starter-tencent-polaris-router/src/test/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilterTest.java @@ -18,9 +18,7 @@ package com.tencent.cloud.polaris.router.zuul; -import java.util.Collections; import java.util.HashMap; -import java.util.List; import java.util.Map; import java.util.Set; @@ -53,7 +51,6 @@ import org.mockito.junit.MockitoJUnitRunner; import org.springframework.cloud.netflix.ribbon.apache.RibbonLoadBalancingHttpClient; import org.springframework.cloud.netflix.ribbon.okhttp.OkHttpLoadBalancingClient; import org.springframework.cloud.netflix.ribbon.support.RibbonCommandContext; -import org.springframework.cloud.netflix.ribbon.support.RibbonRequestCustomizer; import org.springframework.cloud.netflix.zuul.filters.ProxyRequestHelper; import org.springframework.cloud.netflix.zuul.filters.ZuulProperties; import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider; @@ -97,8 +94,6 @@ public class PolarisRibbonRoutingFilterTest { private FallbackProvider fallbackProvider; @Mock private PolarisLoadBalancer polarisLoadBalancer; - @Mock - private List requestCustomizers; @BeforeClass public static void beforeClass() { @@ -127,7 +122,7 @@ public class PolarisRibbonRoutingFilterTest { @Test public void testGenRouterContext() { PolarisRibbonRoutingFilter polarisRibbonRoutingFilter = new PolarisRibbonRoutingFilter(proxyRequestHelper, - ribbonCommandFactory, requestCustomizers, metadataLocalProperties, routerRuleLabelResolver, + ribbonCommandFactory, metadataLocalProperties, routerRuleLabelResolver, Lists.newArrayList(routerLabelResolver)); Map localMetadata = new HashMap<>(); @@ -164,8 +159,8 @@ public class PolarisRibbonRoutingFilterTest { zuulProperties.setThreadPool(new ZuulProperties.HystrixThreadPool()); PolarisRibbonRoutingFilter polarisRibbonRoutingFilter = new PolarisRibbonRoutingFilter( - new ProxyRequestHelper(zuulProperties), ribbonCommandFactory, requestCustomizers, - metadataLocalProperties, routerRuleLabelResolver, Lists.newArrayList(routerLabelResolver)); + new ProxyRequestHelper(zuulProperties), ribbonCommandFactory, metadataLocalProperties, + routerRuleLabelResolver, Lists.newArrayList(routerLabelResolver)); MockHttpServletRequest request = new MockHttpServletRequest(); request.setRequestURI("http://" + calleeService + "/users"); @@ -199,8 +194,8 @@ public class PolarisRibbonRoutingFilterTest { zuulProperties.setThreadPool(new ZuulProperties.HystrixThreadPool()); PolarisRibbonRoutingFilter polarisRibbonRoutingFilter = new PolarisRibbonRoutingFilter( - new ProxyRequestHelper(zuulProperties), ribbonCommandFactory, Collections.emptyList(), - metadataLocalProperties, routerRuleLabelResolver, Lists.newArrayList(routerLabelResolver)); + new ProxyRequestHelper(zuulProperties), ribbonCommandFactory, metadataLocalProperties, + routerRuleLabelResolver, Lists.newArrayList(routerLabelResolver)); MockHttpServletRequest request = new MockHttpServletRequest(); request.setRequestURI("http://" + calleeService + "/users"); @@ -235,8 +230,8 @@ public class PolarisRibbonRoutingFilterTest { zuulProperties.setThreadPool(new ZuulProperties.HystrixThreadPool()); PolarisRibbonRoutingFilter polarisRibbonRoutingFilter = new PolarisRibbonRoutingFilter( - new ProxyRequestHelper(zuulProperties), ribbonCommandFactory, requestCustomizers, - metadataLocalProperties, routerRuleLabelResolver, Lists.newArrayList(routerLabelResolver)); + new ProxyRequestHelper(zuulProperties), ribbonCommandFactory, metadataLocalProperties, + routerRuleLabelResolver, Lists.newArrayList(routerLabelResolver)); MockHttpServletRequest request = new MockHttpServletRequest(); request.setRequestURI("http://" + calleeService + "/users"); @@ -270,8 +265,8 @@ public class PolarisRibbonRoutingFilterTest { zuulProperties.setThreadPool(new ZuulProperties.HystrixThreadPool()); PolarisRibbonRoutingFilter polarisRibbonRoutingFilter = new PolarisRibbonRoutingFilter( - new ProxyRequestHelper(zuulProperties), ribbonCommandFactory, requestCustomizers, - metadataLocalProperties, routerRuleLabelResolver, Lists.newArrayList(routerLabelResolver)); + new ProxyRequestHelper(zuulProperties), ribbonCommandFactory, metadataLocalProperties, + routerRuleLabelResolver, Lists.newArrayList(routerLabelResolver)); MockHttpServletRequest request = new MockHttpServletRequest(); request.setRequestURI("http://" + calleeService + "/users"); @@ -305,8 +300,8 @@ public class PolarisRibbonRoutingFilterTest { zuulProperties.setThreadPool(new ZuulProperties.HystrixThreadPool()); PolarisRibbonRoutingFilter polarisRibbonRoutingFilter = new PolarisRibbonRoutingFilter( - new ProxyRequestHelper(zuulProperties), ribbonCommandFactory, Collections.emptyList(), - metadataLocalProperties, routerRuleLabelResolver, Lists.newArrayList(routerLabelResolver)); + new ProxyRequestHelper(zuulProperties), ribbonCommandFactory, metadataLocalProperties, + routerRuleLabelResolver, Lists.newArrayList(routerLabelResolver)); MockHttpServletRequest request = new MockHttpServletRequest(); request.setRequestURI("http://" + calleeService + "/users"); @@ -342,8 +337,8 @@ public class PolarisRibbonRoutingFilterTest { zuulProperties.setThreadPool(new ZuulProperties.HystrixThreadPool()); PolarisRibbonRoutingFilter polarisRibbonRoutingFilter = new PolarisRibbonRoutingFilter( - new ProxyRequestHelper(zuulProperties), ribbonCommandFactory, requestCustomizers, - metadataLocalProperties, routerRuleLabelResolver, Lists.newArrayList(routerLabelResolver)); + new ProxyRequestHelper(zuulProperties), ribbonCommandFactory, metadataLocalProperties, + routerRuleLabelResolver, Lists.newArrayList(routerLabelResolver)); MockHttpServletRequest request = new MockHttpServletRequest(); request.setRequestURI("http://" + calleeService + "/users");