一、背景
项目中使用feign请求依赖服务,但是服务注册与发现,没有使用nacos及erk,使用etcd作服务注册与发现,所以需要自定义feign的负载均衡实现。
二、实现
1.feign去除url属性,只保留value属性
@FeignClient(value = "")
public interface Client {
}
2.引入pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
3.自定义负载均衡规则
通过实现IRule接口,自定义负载均衡规则
import com.netflix.loadbalancer.DynamicServerListLoadBalancer;
import com.netflix.loadbalancer.ILoadBalancer;
import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.Server;
import net.shuanyi.dsg.core.service.EtcdRegistry;
import net.shuanyi.dsg.core.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
public class GlobalRule implements IRule {
@Override
public Server choose(Object o) {
DynamicServerListLoadBalancer balancer = (DynamicServerListLoadBalancer)iLoadBalancer;
String serviceName =balancer.getName();
}
@Override
public void setLoadBalancer(ILoadBalancer iLoadBalancer) {
this.iLoadBalancer = iLoadBalancer;
}
@Override
public ILoadBalancer getLoadBalancer() {
return this.iLoadBalancer;
}
}
自己实现choose方法逻辑即可,serviceName是请求的服务名称。
4. 定义config类
public class LoadBalanced {
@Autowired
private Dependy dependy;
@Bean
public IRule iRule() {
return new GlobalRule(dependy);
}
}
5.为对应的client设置对应的配置
@Configuration
@RibbonClient(name = "client_name", configuration = LoadBalanced.class)
public class ClientConf {
}
不同的client,可以新建多个ClientConf,然后指向同一个connfiguration,不然多个client使用的GlobalRule是同一个对象,存在并发问题。