This is an automated email from the ASF dual-hosted git repository.
liubao pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-java-chassis.git
The following commit(s) were added to refs/heads/master by this push:
new 493fcdc1b [SCB-2665]Add the load balance governance (#3267)
493fcdc1b is described below
commit 493fcdc1b8649afaf80db0ac14775939cd0cab73
Author: lbc97 <[email protected]>
AuthorDate: Mon Aug 8 21:21:56 2022 +0800
[SCB-2665]Add the load balance governance (#3267)
---
.../governance/GovernanceConfiguration.java | 12 +++++
.../governance/handler/LoadBalanceHandler.java | 48 +++++++++++++++++
.../governance/policy/LoadBalancerPolicy.java | 30 +++++++++++
.../properties/LoadBalanceProperties.java | 33 ++++++++++++
.../servicecomb/loadbanlance/LoadBalance.java | 30 +++++++++++
.../servicecomb/loadbanlance/LoadBalanceImpl.java | 30 +++++++++++
.../governance/GovernancePropertiesTest.java | 12 ++---
.../servicecomb/governance/LoadBalancerTest.java | 60 ++++++++++++++++++++++
governance/src/test/resources/application.yaml | 12 ++++-
9 files changed, 260 insertions(+), 7 deletions(-)
diff --git
a/governance/src/main/java/org/apache/servicecomb/governance/GovernanceConfiguration.java
b/governance/src/main/java/org/apache/servicecomb/governance/GovernanceConfiguration.java
index 3109ba3ad..a89ae12f7 100644
---
a/governance/src/main/java/org/apache/servicecomb/governance/GovernanceConfiguration.java
+++
b/governance/src/main/java/org/apache/servicecomb/governance/GovernanceConfiguration.java
@@ -25,6 +25,7 @@ import
org.apache.servicecomb.governance.handler.FaultInjectionHandler;
import org.apache.servicecomb.governance.handler.IdentifierRateLimitingHandler;
import org.apache.servicecomb.governance.handler.InstanceBulkheadHandler;
import org.apache.servicecomb.governance.handler.InstanceIsolationHandler;
+import org.apache.servicecomb.governance.handler.LoadBalanceHandler;
import org.apache.servicecomb.governance.handler.RateLimitingHandler;
import org.apache.servicecomb.governance.handler.RetryHandler;
import
org.apache.servicecomb.governance.handler.ext.AbstractCircuitBreakerExtension;
@@ -43,6 +44,7 @@ import
org.apache.servicecomb.governance.properties.FaultInjectionProperties;
import
org.apache.servicecomb.governance.properties.IdentifierRateLimitProperties;
import org.apache.servicecomb.governance.properties.InstanceBulkheadProperties;
import
org.apache.servicecomb.governance.properties.InstanceIsolationProperties;
+import org.apache.servicecomb.governance.properties.LoadBalanceProperties;
import org.apache.servicecomb.governance.properties.MatchProperties;
import org.apache.servicecomb.governance.properties.RateLimitProperties;
import org.apache.servicecomb.governance.properties.RetryProperties;
@@ -102,6 +104,11 @@ public class GovernanceConfiguration {
return new FaultInjectionProperties();
}
+ @Bean
+ public LoadBalanceProperties loadBalanceProperties() {
+ return new LoadBalanceProperties();
+ }
+
// handlers configuration
@Bean
public BulkheadHandler bulkheadHandler(BulkheadProperties
bulkheadProperties) {
@@ -113,6 +120,11 @@ public class GovernanceConfiguration {
return new InstanceBulkheadHandler(instanceBulkheadProperties);
}
+ @Bean
+ public LoadBalanceHandler loadBalanceHandler(LoadBalanceProperties
loadBalanceProperties) {
+ return new LoadBalanceHandler(loadBalanceProperties);
+ }
+
@Bean
public CircuitBreakerHandler circuitBreakerHandler(CircuitBreakerProperties
circuitBreakerProperties,
AbstractCircuitBreakerExtension circuitBreakerExtension,
diff --git
a/governance/src/main/java/org/apache/servicecomb/governance/handler/LoadBalanceHandler.java
b/governance/src/main/java/org/apache/servicecomb/governance/handler/LoadBalanceHandler.java
new file mode 100644
index 000000000..b8eb58cd7
--- /dev/null
+++
b/governance/src/main/java/org/apache/servicecomb/governance/handler/LoadBalanceHandler.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 org.apache.servicecomb.governance.handler;
+
+import org.apache.servicecomb.governance.marker.GovernanceRequest;
+import org.apache.servicecomb.governance.policy.LoadBalancerPolicy;
+import org.apache.servicecomb.governance.properties.LoadBalanceProperties;
+import org.apache.servicecomb.loadbanlance.LoadBalance;
+
+public class LoadBalanceHandler extends AbstractGovernanceHandler<LoadBalance,
LoadBalancerPolicy> {
+
+ private final LoadBalanceProperties loadBalanceProperties;
+
+ public LoadBalanceHandler(LoadBalanceProperties loadBalanceProperties) {
+ this.loadBalanceProperties = loadBalanceProperties;
+ }
+
+ @Override
+ protected String createKey(GovernanceRequest governanceRequest,
LoadBalancerPolicy policy) {
+ return LoadBalanceProperties.MATCH_LOADBANLANCER_KEY + "." +
policy.getName();
+ }
+
+ @Override
+ public LoadBalancerPolicy matchPolicy(GovernanceRequest governanceRequest) {
+ return matchersManager.match(governanceRequest,
loadBalanceProperties.getParsedEntity());
+ }
+
+ @Override
+ protected DisposableHolder<LoadBalance> createProcessor(String key,
GovernanceRequest governanceRequest, LoadBalancerPolicy policy) {
+ return new DisposableHolder<>(key, LoadBalance.getLoadBalance(key,
policy));
+ }
+
+}
diff --git
a/governance/src/main/java/org/apache/servicecomb/governance/policy/LoadBalancerPolicy.java
b/governance/src/main/java/org/apache/servicecomb/governance/policy/LoadBalancerPolicy.java
new file mode 100644
index 000000000..4e7e07e9f
--- /dev/null
+++
b/governance/src/main/java/org/apache/servicecomb/governance/policy/LoadBalancerPolicy.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 org.apache.servicecomb.governance.policy;
+
+public class LoadBalancerPolicy extends AbstractPolicy {
+ private String rule;
+
+ public String getRule() {
+ return rule;
+ }
+
+ public void setRule(String rule) {
+ this.rule = rule;
+ }
+}
diff --git
a/governance/src/main/java/org/apache/servicecomb/governance/properties/LoadBalanceProperties.java
b/governance/src/main/java/org/apache/servicecomb/governance/properties/LoadBalanceProperties.java
new file mode 100644
index 000000000..be8e9b267
--- /dev/null
+++
b/governance/src/main/java/org/apache/servicecomb/governance/properties/LoadBalanceProperties.java
@@ -0,0 +1,33 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 org.apache.servicecomb.governance.properties;
+
+import org.apache.servicecomb.governance.policy.LoadBalancerPolicy;
+
+public class LoadBalanceProperties extends
PolicyProperties<LoadBalancerPolicy> {
+ public static final String MATCH_LOADBANLANCER_KEY =
"servicecomb.loadbalance";
+
+ public LoadBalanceProperties() {
+ super(MATCH_LOADBANLANCER_KEY);
+ }
+
+ @Override
+ protected Class<LoadBalancerPolicy> getEntityClass() {
+ return LoadBalancerPolicy.class;
+ }
+}
diff --git
a/governance/src/main/java/org/apache/servicecomb/loadbanlance/LoadBalance.java
b/governance/src/main/java/org/apache/servicecomb/loadbanlance/LoadBalance.java
new file mode 100644
index 000000000..e82ddd943
--- /dev/null
+++
b/governance/src/main/java/org/apache/servicecomb/loadbanlance/LoadBalance.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 org.apache.servicecomb.loadbanlance;
+
+import org.apache.servicecomb.governance.policy.LoadBalancerPolicy;
+
+public interface LoadBalance {
+
+ static LoadBalance getLoadBalance(String key, LoadBalancerPolicy policy) {
+ LoadBalance loadBalance = new LoadBalanceImpl(policy.getRule());
+ return loadBalance;
+ }
+
+ String getRule();
+}
diff --git
a/governance/src/main/java/org/apache/servicecomb/loadbanlance/LoadBalanceImpl.java
b/governance/src/main/java/org/apache/servicecomb/loadbanlance/LoadBalanceImpl.java
new file mode 100644
index 000000000..e89470c90
--- /dev/null
+++
b/governance/src/main/java/org/apache/servicecomb/loadbanlance/LoadBalanceImpl.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 org.apache.servicecomb.loadbanlance;
+
+public class LoadBalanceImpl implements LoadBalance {
+ private final String rule;
+
+ public LoadBalanceImpl(String rule) {
+ this.rule = rule;
+ }
+
+ public String getRule() {
+ return rule;
+ }
+}
diff --git
a/governance/src/test/java/org/apache/servicecomb/governance/GovernancePropertiesTest.java
b/governance/src/test/java/org/apache/servicecomb/governance/GovernancePropertiesTest.java
index f759220bf..2455a6ca5 100644
---
a/governance/src/test/java/org/apache/servicecomb/governance/GovernancePropertiesTest.java
+++
b/governance/src/test/java/org/apache/servicecomb/governance/GovernancePropertiesTest.java
@@ -164,13 +164,13 @@ public class GovernancePropertiesTest {
@Test
public void test_all_bean_is_loaded() {
- Assertions.assertEquals(8, propertiesList.size());
+ Assertions.assertEquals(9, propertiesList.size());
}
@Test
public void test_match_properties_successfully_loaded() {
Map<String, TrafficMarker> markers = matchProperties.getParsedEntity();
- Assertions.assertEquals(12, markers.size());
+ Assertions.assertEquals(14, markers.size());
TrafficMarker demoRateLimiting = markers.get("demo-rateLimiting");
List<Matcher> matchers = demoRateLimiting.getMatches();
Assertions.assertEquals(1, matchers.size());
@@ -188,17 +188,17 @@ public class GovernancePropertiesTest {
@Test
public void test_match_properties_delete() {
Map<String, TrafficMarker> markers = matchProperties.getParsedEntity();
- Assertions.assertEquals(12, markers.size());
+ Assertions.assertEquals(14, markers.size());
dynamicValues.put("servicecomb.matchGroup.test", "matches:\n"
+ " - apiPath:\n"
+ " exact: \"/hello2\"\n"
+ " name: match0");
GovernanceEventManager.post(new GovernanceConfigurationChangedEvent(new
HashSet<>(dynamicValues.keySet())));
markers = matchProperties.getParsedEntity();
- Assertions.assertEquals(13, markers.size());
+ Assertions.assertEquals(15, markers.size());
tearDown();
markers = matchProperties.getParsedEntity();
- Assertions.assertEquals(12, markers.size());
+ Assertions.assertEquals(14, markers.size());
}
@Test
@@ -215,7 +215,7 @@ public class GovernancePropertiesTest {
GovernanceEventManager.post(new GovernanceConfigurationChangedEvent(new
HashSet<>(dynamicValues.keySet())));
Map<String, TrafficMarker> markers = matchProperties.getParsedEntity();
- Assertions.assertEquals(13, markers.size());
+ Assertions.assertEquals(15, markers.size());
TrafficMarker demoRateLimiting = markers.get("demo-rateLimiting");
List<Matcher> matchers = demoRateLimiting.getMatches();
Assertions.assertEquals(1, matchers.size());
diff --git
a/governance/src/test/java/org/apache/servicecomb/governance/LoadBalancerTest.java
b/governance/src/test/java/org/apache/servicecomb/governance/LoadBalancerTest.java
new file mode 100644
index 000000000..dc972807e
--- /dev/null
+++
b/governance/src/test/java/org/apache/servicecomb/governance/LoadBalancerTest.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * 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 org.apache.servicecomb.governance;
+
+import org.apache.servicecomb.governance.handler.LoadBalanceHandler;
+import org.apache.servicecomb.governance.marker.GovernanceRequest;
+import org.apache.servicecomb.loadbanlance.LoadBalance;
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ContextConfiguration;
+
+@SpringBootTest
+@ContextConfiguration(classes = {GovernanceConfiguration.class,
MockConfiguration.class})
+public class LoadBalancerTest {
+ private LoadBalanceHandler loadBalanceHandler;
+
+ @Autowired
+ public void setLoadBalanceHandler(LoadBalanceHandler loadBalanceHandler) {
+ this.loadBalanceHandler = loadBalanceHandler;
+ }
+
+ public LoadBalancerTest() {
+
+ }
+
+ @Test
+ public void test_loadbalance_random() {
+ GovernanceRequest request = new GovernanceRequest();
+ request.setUri("/loadrandom");
+ request.setServiceName("loadrandom");
+ LoadBalance loadBalance = loadBalanceHandler.getActuator(request);
+ Assert.assertEquals("Random", loadBalance.getRule());
+ }
+
+ @Test
+ public void test_loadbalance_roundRobin() {
+ GovernanceRequest request = new GovernanceRequest();
+ request.setUri("/loadroundRobin");
+ request.setServiceName("loadroundRobin");
+ LoadBalance loadBalance = loadBalanceHandler.getActuator(request);
+ Assert.assertEquals("RoundRobin", loadBalance.getRule());
+ }
+}
diff --git a/governance/src/test/resources/application.yaml
b/governance/src/test/resources/application.yaml
index 0655d5953..569cb918c 100644
--- a/governance/src/test/resources/application.yaml
+++ b/governance/src/test/resources/application.yaml
@@ -17,6 +17,12 @@
servicecomb:
matchGroup:
+ demo-loadbalance-random: |
+ matches:
+ - serviceName: "loadrandom"
+ demo-loadbalance-roundRobin: |
+ matches:
+ - serviceName: "loadroundRobin"
demo-fallback-returnNull: |
matches:
- serviceName: "returnNull"
@@ -155,7 +161,11 @@ servicecomb:
wrongIngored: |
delayTime: -1
type: ERROR
-
+ loadbalance:
+ demo-loadbalance-random: |
+ rule: Random
+ demo-loadbalance-roundRobin: |
+ rule: RoundRobin
routeRule:
test_server1: | # 服务名
- precedence: 1 # 优先级,数字越大,优先级越高。