package org.example.myrule;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.Server;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class CustomizeRule extends AbstractLoadBalancerRule {
private int limit = 2;
private Map<String, CurrentServerInfo> serverMap = new ConcurrentHashMap<>();
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) { }
@Override
public Server choose(Object key) {
ILoadBalancer balancer = getLoadBalancer();
List<Server> serverList = balancer.getAllServers();
if(null == serverList || serverList.size() == 0) {
return null;
}
if(serverList.size() == 1) {
return serverList.get(0);
}
Server firstServer = serverList.get(0);
String serviceName = firstServer.getMetaInfo().getAppName().split("@@")[1];
synchronized (serviceName.intern()) {
CurrentServerInfo serverInfo = serverMap.get(serviceName);
if (null == serverInfo) {
serverInfo = new CurrentServerInfo(firstServer.getId(), firstServer, 1);
serverMap.put(serviceName, serverInfo);
return firstServer;
} else {
Integer num = serverInfo.getNum();
if (num >= limit) {
for (int i = 0; i < serverList.size(); i++) {
Server server = serverList.get(i);
if (server.getId().equals(serverInfo.getId())) {
if (i != serverList.size() - 1) {
Server nextServer = serverList.get(i + 1);
CurrentServerInfo nextServerInfo = new CurrentServerInfo(nextServer.getId(), nextServer, 1);
serverMap.put(serviceName, nextServerInfo);
return nextServer;
} else {
Server zeroServer = serverList.get(0);
CurrentServerInfo zeroServerInfo = new CurrentServerInfo(zeroServer.getId(), zeroServer, 1);
serverMap.put(serviceName, zeroServerInfo);
return zeroServer;
}
}
}
} else {
serverInfo.setNum(num + 1);
return serverInfo.getServer();
}
}
}
return null;
}
}
import com.netflix.loadbalancer.Server;
public class CurrentServerInfo {
private String id;
private Server server;
private Integer num;
public CurrentServerInfo() {
}
public CurrentServerInfo(String id, Server server, Integer num) {
this.id = id;
this.server = server;
this.num = num;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public Server getServer() {
return server;
}
public void setServer(Server server) {
this.server = server;
}
public Integer getNum() {
return num;
}
public void setNum(Integer num) {
this.num = num;
}
}