Skip to content
Closed
Show file tree
Hide file tree
Changes from all 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
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package io.servicecomb.loadbalance.filter;

import com.netflix.loadbalancer.Server;
import io.servicecomb.loadbalance.CseServer;
import io.servicecomb.loadbalance.ServerListFilterExt;
import io.servicecomb.serviceregistry.RegistryUtils;
import io.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
import io.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;

import java.util.ArrayList;
import java.util.List;

public class StageDistinguishFilter implements ServerListFilterExt {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

please use DiscoverFilter to impl this

and i heard that, SC will only return same stage instances, so this filter is useless?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this feature given by SC, they will return all instances of different env's. STAGE is another scope of separation.

@Override
public List<Server> getFilteredListOfServers(List<Server> servers) {

List<Server> filteredServers = new ArrayList<Server>();
for (Server server : servers) {
if (allowVisit(server)) {
filteredServers.add(server);
}
}
return filteredServers;
}

private boolean allowVisit(Server server) {
MicroserviceInstance serInstance = ((CseServer) server).getInstance();
return MicroserviceInstanceStatus.UP.equals(serInstance.getStatus()) && RegistryUtils.getMicroserviceInstance().getEnvironment().equals(serInstance.getEnvironment());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
package io.servicecomb.loadbalance.filter;

import com.netflix.loadbalancer.Server;
import io.servicecomb.loadbalance.CseServer;
import io.servicecomb.serviceregistry.RegistryUtils;
import io.servicecomb.serviceregistry.api.registry.MicroserviceInstance;
import io.servicecomb.serviceregistry.api.registry.MicroserviceInstanceStatus;
import mockit.Mock;
import mockit.MockUp;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;

import java.util.ArrayList;
import java.util.List;

import static org.junit.Assert.*;

public class TestStageDistinguishFilter {

StageDistinguishFilter stageDistinguishFilter = new StageDistinguishFilter();

MicroserviceInstance microserviceInstance = Mockito.mock(MicroserviceInstance.class);

@Before
public void setUp() throws Exception {
Mockito.when(microserviceInstance.getEnvironment()).thenReturn("production");
Mockito.when(microserviceInstance.getStatus()).thenReturn(MicroserviceInstanceStatus.UP);
new MockUp<RegistryUtils>() {
@Mock
public MicroserviceInstance getMicroserviceInstance() {
return microserviceInstance;
}
};
}

@Test
public void getFilteredListOfServers_Match() throws Exception {
CseServer testServer = Mockito.mock(CseServer.class);


Mockito.when(testServer.getInstance()).thenReturn(microserviceInstance);



List<Server> serverList = new ArrayList<Server>();
serverList.add(testServer);
List<Server> returnedServerList = stageDistinguishFilter.getFilteredListOfServers(serverList);
Assert.assertEquals(returnedServerList.size(), 1);
}


@Test
public void getFilteredListOfServers_Not_Match() throws Exception {
CseServer testServer = Mockito.mock(CseServer.class);
MicroserviceInstance microserviceInstance1 = Mockito.mock(MicroserviceInstance.class);
Mockito.when(microserviceInstance1.getEnvironment()).thenReturn("XXX");
Mockito.when(microserviceInstance1.getStatus()).thenReturn(MicroserviceInstanceStatus.UP);
Mockito.when(testServer.getInstance()).thenReturn(microserviceInstance1);

CseServer testServer1 = Mockito.mock(CseServer.class);
MicroserviceInstance microserviceInstance2 = Mockito.mock(MicroserviceInstance.class);
Mockito.when(microserviceInstance2.getEnvironment()).thenReturn("production");
Mockito.when(microserviceInstance2.getStatus()).thenReturn(MicroserviceInstanceStatus.DOWN);
Mockito.when(testServer1.getInstance()).thenReturn(microserviceInstance2);

List<Server> serverList = new ArrayList<Server>();
serverList.add(testServer);
serverList.add(testServer1);

new MockUp<RegistryUtils>() {
@Mock
public MicroserviceInstance getMicroserviceInstance() {
return microserviceInstance;
}
};


List<Server> returnedServerList = stageDistinguishFilter.getFilteredListOfServers(serverList);
Assert.assertEquals(returnedServerList.size(), 0);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -109,25 +109,20 @@ public void pullInstances() {
setInstances(pulledInstances);
}

private void setInstances(List<MicroserviceInstance> pulledInstances) {
synchronized (lock) {
instances = pulledInstances
.stream()
.filter(instance -> {
return MicroserviceInstanceStatus.UP.equals(instance.getStatus());
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's better a add this logic here and filter out all other env's instances. Because this is a required feature, and filters are optional ones.

})
.collect(Collectors.toList());
for (MicroserviceInstance instance : instances) {
// ensure microserviceVersion exists
versions.computeIfAbsent(instance.getServiceId(), microserviceId -> {
MicroserviceVersion microserviceVersion =
appManager.getMicroserviceVersionFactory().create(microserviceName, microserviceId);
for (MicroserviceVersionRule microserviceVersionRule : versionRules.values()) {
microserviceVersionRule.addMicroserviceVersion(microserviceVersion);
}
return microserviceVersion;
});
}
private void setInstances(List<MicroserviceInstance> pulledInstances) {
synchronized (lock) {
instances = pulledInstances;
for (MicroserviceInstance instance : instances) {
// ensure microserviceVersion exists
versions.computeIfAbsent(instance.getServiceId(), microserviceId -> {
MicroserviceVersion microserviceVersion =
appManager.getMicroserviceVersionFactory().create(microserviceName, microserviceId);
for (MicroserviceVersionRule microserviceVersionRule : versionRules.values()) {
microserviceVersionRule.addMicroserviceVersion(microserviceVersion);
}
return microserviceVersion;
});
}

for (MicroserviceVersionRule microserviceVersionRule : versionRules.values()) {
microserviceVersionRule.setInstances(instances);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -162,17 +162,17 @@ public void setInstancesMatch() {
Assert.assertSame(instances.get(0), microserviceVersionRule.getInstances().get("i1"));
}

@Test
public void setInstances_selectUp() {
String microserviceId = "1";
setup(microserviceId);

instances.get(0).setStatus(MicroserviceInstanceStatus.DOWN);
Deencapsulation.invoke(microserviceVersions, "setInstances", instances);

List<?> resultInstances = Deencapsulation.getField(microserviceVersions, "instances");
Assert.assertTrue(resultInstances.isEmpty());
}
// @Test
// public void setInstances_selectUp() {
// String microserviceId = "1";
// setup(microserviceId);
//
// instances.get(0).setStatus(MicroserviceInstanceStatus.DOWN);
// Deencapsulation.invoke(microserviceVersions, "setInstances", instances);
//
// List<?> resultInstances = Deencapsulation.getField(microserviceVersions, "instances");
// Assert.assertTrue(resultInstances.isEmpty());
// }

@Test
public void getOrCreateMicroserviceVersionRule() {
Expand Down