You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by wu...@apache.org on 2019/04/20 18:08:16 UTC
[servicecomb-java-chassis] branch master updated: [SCB-1088] SDK
IsolationServerEvent is missing endpoint information
This is an automated email from the ASF dual-hosted git repository.
wujimin 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 c957fc3 [SCB-1088] SDK IsolationServerEvent is missing endpoint information
c957fc3 is described below
commit c957fc3cce598c05665d5aedb858577f19978e4e
Author: heyile <25...@qq.com>
AuthorDate: Sat Apr 20 11:49:03 2019 +0800
[SCB-1088] SDK IsolationServerEvent is missing endpoint information
---
.../loadbalance/event/IsolationServerEvent.java | 4 +-
.../filter/IsolationDiscoveryFilter.java | 9 +-
.../loadbalance/TestLoadBalanceHandler2.java | 101 +++++++++++++++++++++
3 files changed, 106 insertions(+), 8 deletions(-)
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java
index 3c1cb22..a48e6d4 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/event/IsolationServerEvent.java
@@ -52,10 +52,10 @@ public class IsolationServerEvent extends AlarmEvent {
public IsolationServerEvent(Invocation invocation, MicroserviceInstance instance,
ServiceCombServerStats serverStats,
- IsolationDiscoveryFilter.Settings settings, Type type) {
+ IsolationDiscoveryFilter.Settings settings, Type type, Endpoint endpoint) {
super(type);
this.microserviceName = invocation.getMicroserviceName();
- this.endpoint = invocation.getEndpoint();
+ this.endpoint = endpoint;
this.currentTotalRequest = serverStats.getTotalRequests();
this.currentCountinuousFailureCount = serverStats.getCountinuousFailureCount();
this.currentErrorPercentage = serverStats.getFailedRate();
diff --git a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java
index c1bb516..4328d73 100644
--- a/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java
+++ b/handlers/handler-loadbalance/src/main/java/org/apache/servicecomb/loadbalance/filter/IsolationDiscoveryFilter.java
@@ -152,7 +152,7 @@ public class IsolationDiscoveryFilter implements DiscoveryFilter {
ServiceCombLoadBalancerStats.INSTANCE.markIsolated(server, true);
eventBus.post(
new IsolationServerEvent(invocation, instance, serverStats,
- settings, Type.OPEN));
+ settings, Type.OPEN, server.getEndpoint()));
LOGGER.warn("Isolate service {}'s instance {}.", invocation.getMicroserviceName(),
instance.getInstanceId());
}
@@ -166,7 +166,7 @@ public class IsolationDiscoveryFilter implements DiscoveryFilter {
}
ServiceCombLoadBalancerStats.INSTANCE.markIsolated(server, false);
eventBus.post(new IsolationServerEvent(invocation, instance, serverStats,
- settings, Type.CLOSE));
+ settings, Type.CLOSE, server.getEndpoint()));
LOGGER.warn("Recover service {}'s instance {} from isolation.", invocation.getMicroserviceName(),
instance.getInstanceId());
}
@@ -188,9 +188,6 @@ public class IsolationDiscoveryFilter implements DiscoveryFilter {
if (settings.errorThresholdPercentage == 0) {
return true;
}
- if (serverStats.getFailedRate() >= settings.errorThresholdPercentage) {
- return false;
- }
- return true;
+ return serverStats.getFailedRate() < settings.errorThresholdPercentage;
}
}
diff --git a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java
index 2c2c7db..f0e3ad5 100644
--- a/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java
+++ b/handlers/handler-loadbalance/src/test/java/org/apache/servicecomb/loadbalance/TestLoadBalanceHandler2.java
@@ -20,11 +20,14 @@ package org.apache.servicecomb.loadbalance;
import static org.mockito.Mockito.when;
import java.util.ArrayList;
+import java.util.EventListener;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
+import javax.xml.ws.Holder;
+
import org.apache.servicecomb.core.CseContext;
import org.apache.servicecomb.core.Invocation;
import org.apache.servicecomb.core.NonSwaggerInvocation;
@@ -35,7 +38,9 @@ import org.apache.servicecomb.core.definition.OperationMeta;
import org.apache.servicecomb.core.definition.SchemaMeta;
import org.apache.servicecomb.core.provider.consumer.ReferenceConfig;
import org.apache.servicecomb.core.transport.TransportManager;
+import org.apache.servicecomb.foundation.common.event.EventManager;
import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
+import org.apache.servicecomb.loadbalance.event.IsolationServerEvent;
import org.apache.servicecomb.loadbalance.filter.IsolationDiscoveryFilter;
import org.apache.servicecomb.loadbalance.filter.ServerDiscoveryFilter;
import org.apache.servicecomb.loadbalance.filter.ZoneAwareDiscoveryFilter;
@@ -55,6 +60,8 @@ import org.junit.BeforeClass;
import org.junit.Test;
import org.mockito.Mockito;
+import com.google.common.eventbus.Subscribe;
+
/**
*
*
@@ -216,6 +223,100 @@ public class TestLoadBalanceHandler2 {
}
@Test
+ public void testIsolationEventWithEndpoint() throws Exception {
+ ReferenceConfig referenceConfig = Mockito.mock(ReferenceConfig.class);
+ OperationMeta operationMeta = Mockito.mock(OperationMeta.class);
+ SchemaMeta schemaMeta = Mockito.mock(SchemaMeta.class);
+ when(operationMeta.getSchemaMeta()).thenReturn(schemaMeta);
+ MicroserviceMeta microserviceMeta = Mockito.mock(MicroserviceMeta.class);
+ when(schemaMeta.getMicroserviceMeta()).thenReturn(microserviceMeta);
+ when(schemaMeta.getMicroserviceName()).thenReturn("testMicroserviceName");
+ when(microserviceMeta.getAppId()).thenReturn("testApp");
+ when(referenceConfig.getVersionRule()).thenReturn("0.0.0+");
+ when(referenceConfig.getTransport()).thenReturn("rest");
+ Invocation invocation = new Invocation(referenceConfig, operationMeta, new Object[0]);
+
+ InstanceCacheManager instanceCacheManager = Mockito.mock(InstanceCacheManager.class);
+ ServiceRegistry serviceRegistry = Mockito.mock(ServiceRegistry.class);
+ TransportManager transportManager = Mockito.mock(TransportManager.class);
+ Transport transport = Mockito.mock(Transport.class);
+ ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.operation.enabled", "false");
+
+ // set up data
+ MicroserviceInstance myself = new MicroserviceInstance();
+ DataCenterInfo info = new DataCenterInfo();
+ info.setName("test");
+ info.setRegion("test");
+ info.setAvailableZone("test");
+ myself.setDataCenterInfo(info);
+
+ MicroserviceInstance instance = new MicroserviceInstance();
+ info = new DataCenterInfo();
+ info.setName("test");
+ info.setRegion("test");
+ info.setAvailableZone("test");
+ List<String> allMatchEndpoint = new ArrayList<>();
+ allMatchEndpoint.add("rest://localhost:9090");
+ instance.setEndpoints(allMatchEndpoint);
+ instance.setDataCenterInfo(info);
+ instance.setInstanceId("instance");
+
+ Map<String, MicroserviceInstance> data = new HashMap<>();
+ DiscoveryTreeNode parent = new DiscoveryTreeNode().name("parent").data(data);
+ CseContext.getInstance().setTransportManager(transportManager);
+
+ RegistryUtils.setServiceRegistry(serviceRegistry);
+
+ when(serviceRegistry.getMicroserviceInstance()).thenReturn(myself);
+ when(serviceRegistry.getInstanceCacheManager()).thenReturn(instanceCacheManager);
+ when(instanceCacheManager.getOrCreateVersionedCache("testApp", "testMicroserviceName", "0.0.0+"))
+ .thenReturn(parent);
+ when(transportManager.findTransport("rest")).thenReturn(transport);
+
+ LoadbalanceHandler handler = null;
+ LoadBalancer loadBalancer = null;
+ ServiceCombServer server = null;
+
+ handler = new LoadbalanceHandler();
+ loadBalancer = handler.getOrCreateLoadBalancer(invocation);
+ server = loadBalancer.chooseServer(invocation);
+ Assert.assertNull(server);
+
+ data.put("instance", instance);
+ parent.cacheVersion(parent.cacheVersion() + 1);
+ loadBalancer = handler.getOrCreateLoadBalancer(invocation);
+ server = loadBalancer.chooseServer(invocation);
+ Assert.assertEquals("rest://localhost:9090", server.getEndpoint().getEndpoint());
+
+ ServiceCombLoadBalancerStats.INSTANCE.markSuccess(server);
+ ServiceCombLoadBalancerStats.INSTANCE.markSuccess(server);
+ ServiceCombLoadBalancerStats.INSTANCE.markSuccess(server);
+ ServiceCombLoadBalancerStats.INSTANCE.markSuccess(server);
+ ServiceCombLoadBalancerStats.INSTANCE.markFailure(server);
+
+ //if errorThresholdPercentage greater than 0, it will activate.
+ ArchaiusUtils.setProperty("servicecomb.loadbalance.isolation.errorThresholdPercentage", "10");
+ ArchaiusUtils.setProperty("servicecomb.loadbalance.isolation.minIsolationTime", "10");
+
+ Holder<Integer> count = new Holder<>(0);
+ EventListener isolationEndpointListener = new EventListener() {
+ @Subscribe
+ public void listener(IsolationServerEvent event) {
+ count.value++;
+ Assert.assertSame("Isolation Endpoint", "rest://localhost:9090", event.getEndpoint().getEndpoint());
+ }
+ };
+ EventManager.getEventBus().register(isolationEndpointListener);
+ Assert.assertEquals(0, count.value.intValue());
+ loadBalancer = handler.getOrCreateLoadBalancer(invocation);
+ server = loadBalancer.chooseServer(invocation);
+ // no server is available
+ Assert.assertNull(server);
+ Assert.assertEquals(1, count.value.intValue());
+ EventManager.unregister(isolationEndpointListener);
+ }
+
+ @Test
public void testZoneAwareAndIsolationFilterWorksEmptyInstanceProtectionEnabled() throws Exception {
ArchaiusUtils.setProperty("servicecomb.loadbalance.filter.isolation.emptyInstanceProtectionEnabled", "true");
ReferenceConfig referenceConfig = Mockito.mock(ReferenceConfig.class);