更换ribbon的默认负载均衡策略和自定负载均衡策略
ribbon的默认负载均衡是轮询策略,会进行无差别的分配。
ribbon有七种负载均衡模式
RoundRobinRule:默认规则,通过简单的轮询服务列表来选择服务器
AvailabilityFilteringRule:可用性筛选规则
WeightedResponseTimeRule:为每个服务器赋予一个权重值,服务器的响应时间越长,该权重值就越少,这个规则会随机选择服务器,权重值有可能会决定服务器的选择
ZoneAvoidanceRule:该规则以区域、可用服务器为基础进行服务器选择,使用区域(Zone)对服务器进行分类
BestAvailableRule:忽略"短路"的服务器,并选择并发数较低的服务器
RandomRule:随机选择可用服务器
RetryRule:含有重试的选择逻辑,如果使用 RoundRobinRule 选择的服务器无法连接,那么将会重新选择服务器
这里我们更换默认的负载均衡策略,使用随机的负载均衡策略
demo代码
demo.zip
只需要在服务消费者的启动类里加上此方法就可以,也可以配置在专门的类中,作为配置文件。当我们想要更换不同的策略只需要返回相应的实例即可。
com.ymx.consumer;
com.netflix.loadbalancer.IRule;
com.netflix.loadbalancer.RandomRule;
com.ymx.consumer.irule.CustomRule;
org.springframework.boot.SpringApplication;
org.springframework.boot.autoconfigure.;
org.springframework.cloud.netflix.eureka.;
org.springframework.cloud.openfeign.;
org.springframework.context.annotation.;
java.util.ArrayList;
java.util.List;
(basePackages = )
ConsumerApplication {
main(String[] args) {
SpringApplication.(ConsumerApplication., args);
}
@Bean
public IRule loadBalanceRule(){
return new RandomRule();
}
} |
|
自定义负载均衡策略,我们可以使用不同的算法,来实现负载均衡策略的选择,这里我们只做一个简单的demo,排除指定的端口,进行负载均衡。你也可以使用其他的算法来实现负载均衡策略。和上面一样在启动类上加上
@Bean
public IRule loadBlanaceRule(){
//指定要排除的Server端口号
List<Integer> ports = new ArrayList<>();
ports.add(8082);
//CustomRule(ports)就是我们的指定算法进行负载均衡
return new CustomRule(ports);
} |
实现负载均衡的实体类
com.ymx.consumer.irule;
com.netflix.loadbalancer.ILoadBalancer;
com.netflix.loadbalancer.IRule;
com.netflix.loadbalancer.Server;
java.util.ArrayList;
java.util.List;
java.util.Random;
CustomRule IRule {
ILoadBalancer ;
List<Integer> ;
CustomRule() {
}
CustomRule(ILoadBalancer lb) {
.= lb;
}
CustomRule(List<Integer> excludePorts) {
.= excludePorts;
}
Server choose(Object key) {
List<Server> servers = .getReachableServers();
List<Server> availableServers = .getAvailabServers(servers);
.getAvailabRandomServers(availableServers);
}
List<Server> getAvailabServers(List<Server> servers) {
(==|| .size()==){
servers;
}
List<Server> aservers = ArrayList<>();
(Server server : servers){ flag = ;
(Integer port : ){
(server.getPort()==port){
flag = ;
;
}
}
(flag) {
aservers.add(server);
}
}
aservers;
}
Server getAvailabRandomServers(List<Server> availableServers) {
index = Random().nextInt(availableServers.size());
availableServers.get(index);
}
setLoadBalancer(ILoadBalancer lb) {
.= lb;
}
ILoadBalancer getLoadBalancer() {
;
}
} |
这样就完成了一个简单的自定义负载均衡策略,提供者中就不会出现端口为8082的提供者了。