自定義Ribbon負載均衡
阿新 • • 發佈:2022-03-18
然後自定義兩個類
DshzsRandomRule類寫自己定義的演算法,DshzsRule寫注入的bean
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class DshzsRule {
@Bean
public IRule myRule(){
return new DshzsRandomRule();
}
}
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.concurrent.ThreadLocalRandom;
public class DshzsRandomRule extends AbstractLoadBalancerRule {
//定義次數
private int total = 0;
//定義當前的數量
private int currentIndex = 0;
public Server choose(ILoadBalancer lb, Object key) {
if (lb == null) {
return null;
}
Server server = null;
while (server == null) {
if (Thread.interrupted()) {
return null;
}
//獲取可用的服務
List<Server> upList = lb.getReachableServers();
//獲取所有服務
List<Server> allList = lb.getAllServers();
int serverCount = allList.size();
if (serverCount == 0) {
return null;
}
//生成區間隨機數
// int index = chooseRandomInt(serverCount);
//從可以用的服務中隨機獲取一個
// server = upList.get(index);
if (total<5){
server = upList.get(currentIndex);
total++;
}else {
total = 0;
currentIndex++;
if (currentIndex>=upList.size()){
currentIndex = 0;
}
server = upList.get(currentIndex);
}
if (server == null) {
Thread.yield();
continue;
}
if (server.isAlive()) {
return (server);
}
server = null;
Thread.yield();
}
return server;
}
// protected int chooseRandomInt(int serverCount) {
// return ThreadLocalRandom.current().nextInt(serverCount);
// }
@Override
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
}
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
// TODO Auto-generated method stub
}
}
定義完之後需要在啟動類這裡加一個註解才能找到你定義的ribbon
@RibbonClient(name = "服務名稱", configuration = 你自定義的類(DshzsRule.class))