Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support ribbon service-level rule customization #478

Merged
merged 7 commits into from
Aug 3, 2022
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
# Change Log
---

- [Feature: support ribbon service-level rule customization](https://github.com/Tencent/spring-cloud-tencent/pull/478)
- [Feature: delete implement ServiceInstance](https://github.com/Tencent/spring-cloud-tencent/pull/481)
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
import java.util.ArrayList;
import java.util.List;

import com.google.common.annotations.VisibleForTesting;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.AvailabilityFilteringRule;
Expand Down Expand Up @@ -85,14 +86,21 @@ public PolarisLoadBalancerCompositeRule(RouterAPI routerAPI,
PolarisLoadBalancerProperties polarisLoadBalancerProperties,
IClientConfig iClientConfig,
List<RouterRequestInterceptor> requestInterceptors,
List<RouterResponseInterceptor> responseInterceptors) {
List<RouterResponseInterceptor> responseInterceptors,
AbstractLoadBalancerRule delegate) {
this.routerAPI = routerAPI;
this.loadBalancerProperties = polarisLoadBalancerProperties;
this.requestInterceptors = requestInterceptors;
this.responseInterceptors = responseInterceptors;

delegateRule = getRule();
delegateRule.initWithNiwsConfig(iClientConfig);
AbstractLoadBalancerRule loadBalancerRule = getRule();
if (loadBalancerRule != null) {
delegateRule = loadBalancerRule;
delegateRule.initWithNiwsConfig(iClientConfig);
}
else {
delegateRule = delegate;
}
}

@Override
Expand Down Expand Up @@ -176,7 +184,7 @@ private void processRouterResponseInterceptors(PolarisRouterContext routerContex
public AbstractLoadBalancerRule getRule() {
String loadBalanceStrategy = loadBalancerProperties.getStrategy();
if (StringUtils.isEmpty(loadBalanceStrategy)) {
return new ZoneAvoidanceRule();
return null;
}
switch (loadBalanceStrategy) {
case STRATEGY_RANDOM:
Expand All @@ -198,4 +206,9 @@ public AbstractLoadBalancerRule getRule() {
return new ZoneAvoidanceRule();
}
}

@VisibleForTesting
SkyeBeFreeman marked this conversation as resolved.
Show resolved Hide resolved
public AbstractLoadBalancerRule getDelegateRule() {
return delegateRule;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Tencent is pleased to support the open source community by making Spring Cloud Tencent available.
*
* Copyright (C) 2019 THL A29 Limited, a Tencent company. 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.beanprocessor;

import java.util.List;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.tencent.cloud.common.util.BeanFactoryUtils;
import com.tencent.cloud.polaris.loadbalancer.config.PolarisLoadBalancerProperties;
import com.tencent.cloud.polaris.router.PolarisLoadBalancerCompositeRule;
import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor;
import com.tencent.cloud.polaris.router.spi.RouterResponseInterceptor;
import com.tencent.polaris.router.api.core.RouterAPI;

import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.BeanPostProcessor;

/**
* Decorate IRule with PolarisLoadBalancerCompositeRule.
*
* @author derekyi 2022-08-01
*/
public class PolarisLoadBalancerCompositeRuleBeanPostProcessor implements BeanPostProcessor, BeanFactoryAware {

private BeanFactory beanFactory;

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof AbstractLoadBalancerRule) {
RouterAPI routerAPI = beanFactory.getBean(RouterAPI.class);
PolarisLoadBalancerProperties polarisLoadBalancerProperties = beanFactory.getBean(PolarisLoadBalancerProperties.class);
IClientConfig iClientConfig = beanFactory.getBean(IClientConfig.class);
List<RouterRequestInterceptor> requestInterceptors = BeanFactoryUtils.getBeans(beanFactory, RouterRequestInterceptor.class);
List<RouterResponseInterceptor> responseInterceptors = BeanFactoryUtils.getBeans(beanFactory, RouterResponseInterceptor.class);
return new PolarisLoadBalancerCompositeRule(routerAPI, polarisLoadBalancerProperties, iClientConfig,
requestInterceptors, responseInterceptors, ((AbstractLoadBalancerRule) bean));
}

return bean;
}

@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,15 +18,7 @@

package com.tencent.cloud.polaris.router.config;

import java.util.List;

import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.IRule;
import com.tencent.cloud.polaris.loadbalancer.config.PolarisLoadBalancerProperties;
import com.tencent.cloud.polaris.router.PolarisLoadBalancerCompositeRule;
import com.tencent.cloud.polaris.router.spi.RouterRequestInterceptor;
import com.tencent.cloud.polaris.router.spi.RouterResponseInterceptor;
import com.tencent.polaris.router.api.core.RouterAPI;
import com.tencent.cloud.polaris.router.beanprocessor.PolarisLoadBalancerCompositeRuleBeanPostProcessor;

import org.springframework.context.annotation.Bean;

Expand All @@ -38,11 +30,7 @@
public class RibbonConfiguration {

@Bean
public IRule polarisLoadBalancerCompositeRule(RouterAPI routerAPI,
PolarisLoadBalancerProperties polarisLoadBalancerProperties,
IClientConfig iClientConfig, List<RouterRequestInterceptor> requestInterceptors,
List<RouterResponseInterceptor> responseInterceptors) {
return new PolarisLoadBalancerCompositeRule(routerAPI, polarisLoadBalancerProperties, iClientConfig,
requestInterceptors, responseInterceptors);
public PolarisLoadBalancerCompositeRuleBeanPostProcessor polarisLoadBalancerCompositeRuleBeanPostProcessor() {
return new PolarisLoadBalancerCompositeRuleBeanPostProcessor();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@
import com.netflix.loadbalancer.RoundRobinRule;
import com.netflix.loadbalancer.Server;
import com.netflix.loadbalancer.WeightedResponseTimeRule;
import com.netflix.loadbalancer.ZoneAvoidanceRule;
import com.tencent.cloud.common.metadata.MetadataContext;
import com.tencent.cloud.common.metadata.MetadataContextHolder;
import com.tencent.cloud.common.pojo.PolarisServer;
Expand Down Expand Up @@ -113,18 +112,18 @@ public void before() {
public void testGetDefaultLB() {
when(polarisLoadBalancerProperties.getStrategy()).thenReturn("");
PolarisLoadBalancerCompositeRule compositeRule = new PolarisLoadBalancerCompositeRule(routerAPI,
polarisLoadBalancerProperties, config, requestInterceptors, null);
polarisLoadBalancerProperties, config, requestInterceptors, null, null);

AbstractLoadBalancerRule defaultRule = compositeRule.getRule();

Assert.assertTrue(defaultRule instanceof ZoneAvoidanceRule);
Assert.assertNull(defaultRule);
}

@Test
public void testRandomLB() {
when(polarisLoadBalancerProperties.getStrategy()).thenReturn(PolarisLoadBalancerCompositeRule.STRATEGY_RANDOM);
PolarisLoadBalancerCompositeRule compositeRule = new PolarisLoadBalancerCompositeRule(routerAPI,
polarisLoadBalancerProperties, config, requestInterceptors, null);
polarisLoadBalancerProperties, config, requestInterceptors, null, null);

AbstractLoadBalancerRule lbRule = compositeRule.getRule();

Expand All @@ -135,7 +134,7 @@ public void testRandomLB() {
public void testWeightLB() {
when(polarisLoadBalancerProperties.getStrategy()).thenReturn(PolarisLoadBalancerCompositeRule.STRATEGY_WEIGHT);
PolarisLoadBalancerCompositeRule compositeRule = new PolarisLoadBalancerCompositeRule(routerAPI,
polarisLoadBalancerProperties, config, requestInterceptors, null);
polarisLoadBalancerProperties, config, requestInterceptors, null, null);

AbstractLoadBalancerRule lbRule = compositeRule.getRule();

Expand All @@ -146,7 +145,7 @@ public void testWeightLB() {
public void testRetryLB() {
when(polarisLoadBalancerProperties.getStrategy()).thenReturn(PolarisLoadBalancerCompositeRule.STRATEGY_RETRY);
PolarisLoadBalancerCompositeRule compositeRule = new PolarisLoadBalancerCompositeRule(routerAPI,
polarisLoadBalancerProperties, config, requestInterceptors, null);
polarisLoadBalancerProperties, config, requestInterceptors, null, null);

AbstractLoadBalancerRule lbRule = compositeRule.getRule();

Expand All @@ -157,7 +156,7 @@ public void testRetryLB() {
public void testWeightedResponseTimeLB() {
when(polarisLoadBalancerProperties.getStrategy()).thenReturn(PolarisLoadBalancerCompositeRule.STRATEGY_RESPONSE_TIME_WEIGHTED);
PolarisLoadBalancerCompositeRule compositeRule = new PolarisLoadBalancerCompositeRule(routerAPI,
polarisLoadBalancerProperties, config, requestInterceptors, null);
polarisLoadBalancerProperties, config, requestInterceptors, null, null);

AbstractLoadBalancerRule lbRule = compositeRule.getRule();

Expand All @@ -168,7 +167,7 @@ public void testWeightedResponseTimeLB() {
public void tesBestAvailableLB() {
when(polarisLoadBalancerProperties.getStrategy()).thenReturn(PolarisLoadBalancerCompositeRule.STRATEGY_BEST_AVAILABLE);
PolarisLoadBalancerCompositeRule compositeRule = new PolarisLoadBalancerCompositeRule(routerAPI,
polarisLoadBalancerProperties, config, requestInterceptors, null);
polarisLoadBalancerProperties, config, requestInterceptors, null, null);

AbstractLoadBalancerRule lbRule = compositeRule.getRule();

Expand All @@ -179,7 +178,7 @@ public void tesBestAvailableLB() {
public void tesRoundRobinLB() {
when(polarisLoadBalancerProperties.getStrategy()).thenReturn(PolarisLoadBalancerCompositeRule.STRATEGY_ROUND_ROBIN);
PolarisLoadBalancerCompositeRule compositeRule = new PolarisLoadBalancerCompositeRule(routerAPI,
polarisLoadBalancerProperties, config, requestInterceptors, null);
polarisLoadBalancerProperties, config, requestInterceptors, null, null);

AbstractLoadBalancerRule lbRule = compositeRule.getRule();

Expand All @@ -190,7 +189,7 @@ public void tesRoundRobinLB() {
public void testAvailabilityFilteringLB() {
when(polarisLoadBalancerProperties.getStrategy()).thenReturn(PolarisLoadBalancerCompositeRule.STRATEGY_AVAILABILITY_FILTERING);
PolarisLoadBalancerCompositeRule compositeRule = new PolarisLoadBalancerCompositeRule(routerAPI,
polarisLoadBalancerProperties, config, requestInterceptors, null);
polarisLoadBalancerProperties, config, requestInterceptors, null, null);

AbstractLoadBalancerRule lbRule = compositeRule.getRule();

Expand All @@ -209,7 +208,7 @@ public void testBuildMetadataRouteRequest() {
setTransitiveMetadata();

PolarisLoadBalancerCompositeRule compositeRule = new PolarisLoadBalancerCompositeRule(routerAPI,
polarisLoadBalancerProperties, config, requestInterceptors, null);
polarisLoadBalancerProperties, config, requestInterceptors, null, null);

ServiceInstances serviceInstances = assembleServiceInstances();
PolarisRouterContext routerContext = assembleRouterContext();
Expand Down Expand Up @@ -244,7 +243,7 @@ public void testBuildNearbyRouteRequest() {
setTransitiveMetadata();

PolarisLoadBalancerCompositeRule compositeRule = new PolarisLoadBalancerCompositeRule(routerAPI,
polarisLoadBalancerProperties, config, requestInterceptors, null);
polarisLoadBalancerProperties, config, requestInterceptors, null, null);

ServiceInstances serviceInstances = assembleServiceInstances();
PolarisRouterContext routerContext = assembleRouterContext();
Expand Down Expand Up @@ -275,7 +274,7 @@ public void testBuildRuleBasedRouteRequest() {
setTransitiveMetadata();

PolarisLoadBalancerCompositeRule compositeRule = new PolarisLoadBalancerCompositeRule(routerAPI,
polarisLoadBalancerProperties, config, requestInterceptors, null);
polarisLoadBalancerProperties, config, requestInterceptors, null, null);

ServiceInstances serviceInstances = assembleServiceInstances();
PolarisRouterContext routerContext = assembleRouterContext();
Expand Down Expand Up @@ -306,7 +305,7 @@ public void testRouter() {
setTransitiveMetadata();

PolarisLoadBalancerCompositeRule compositeRule = new PolarisLoadBalancerCompositeRule(routerAPI,
polarisLoadBalancerProperties, config, requestInterceptors, null);
polarisLoadBalancerProperties, config, requestInterceptors, null, null);

ProcessRoutersResponse assembleResponse = assembleProcessRoutersResponse();
when(routerAPI.processRouters(any())).thenReturn(assembleResponse);
Expand Down
Loading