自定义eureka均衡负载策略 ,ribbon,loadBalance
鸡翅老哥视频写的自定义ribbon 负载均衡策略,模仿AbstractLoadBalancerRule子类RandomRule写的
- 自定义Rule
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;
/*
* 继承AbstractLoadBalancerRule自定义策略,选出端口号第一个大8888的server
* */
public class MyCustomRule extends AbstractLoadBalancerRule {
public MyCustomRule() {
}
@Override
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
}
@SuppressWarnings({"RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE"})
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;
}
for(Server s:upList){
if(s.getPort()>8888){
server=s;
break;
}
}
if (server == null) {
Thread.yield();
} else {
if (server.isAlive()) {
return server;
}
server = null;
Thread.yield();
}
}
System.out.println("host:"+server.getHost()+"port:"+server.getPort());
return server;
}
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
}
- config
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RuleConfig {
@Bean
public IRule myCustomRule(){
return new MyCustomRule();
}
}
- @RibbonClient(name = “service-name”,configuration = RuleConfig.class)启动类添加该注解就可以使用了
但是现在用的都是loadBalance,直接用这个ribbon的用不了,因为依赖冲突,不过我们可以像这样自定义一个loadBalance,同样参考随机负载均衡RandomLoadBalancer,在org.springframework.cloud.loadbalancer.core包下,implements ReactorServiceInstanceLoadBalancer自定义功能就好了