最近有一个需求,自定义gateway的负载均衡,网上也找了很多的案例,但是不知道为什么都有一个共同的问题。访问服务A,在访问服务B,都是正确的,但是第三次在访问服务A,就会跑到服务B上。所以记录一下。
首先定义一个自己的规则类,继承 AbstractLoadBalancerRule,重写 choose方法
package com.cloudH.config;
import com.netflix.client.config.IClientConfig;
import com.netflix.loadbalancer.AbstractLoadBalancerRule;
import com.netflix.loadbalancer.Server;
import lombok.extern.slf4j.Slf4j;
import java.util.List;
@Slf4j
public class CustomLoadBalancerClientFilter extends AbstractLoadBalancerRule {
@Override
public void initWithNiwsConfig(IClientConfig iClientConfig) {
}
@Override
public Server choose(Object key) {
List<Server> servers = this.getLoadBalancer().getReachableServers();
return servers.get(0);
}
}
然后在写一个 Configuration
package com.cloudH.config;
import com.netflix.loadbalancer.IRule;
import org.springframework.cloud.netflix.ribbon.RibbonClient;
import org.springframework.cloud.netflix.ribbon.RibbonClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@RibbonClients(
value = {
@RibbonClient(name = "gatewayRule", configuration = CustomLoadBalancerClientFilter.class),
},
defaultConfiguration = DefaultRibbonConfig.class)
public class DefaultRibbonConfig {
@Bean
public IRule ribbonRule() {
return new CustomLoadBalancerClientFilter();
}
}
再次启动gateway服务,负载均衡就是自己定义的了。
注意:Configuration 类的 @RibbonClients 注解要加,晚上的例子很多都是写在启动类,但是都会出现开始说的问题