想要针对一个feign客户端执行不同的策略,想要自定义一些bean,不得法;
找到FeignClient的configuration,结果没有策略设置;
之前的方向一直在找feign的,后来发现应该是ribbon的:
spring cloud组件之ribbon+自定义IRule+fegin
feign定义
@FeignClient(value = "openav", path = "openav")
public interface FeignOpenAVService {
自定义IRule实现类
直接继承AbstractLoadBalancerRule
实现自定义服务过滤
package ribbon;
public class OpenAVLoadBalancerRule extends AbstractLoadBalancerRule {
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
}
// 根据自己的逻辑选择服务实例
public Server choose(ILoadBalancer lb, Object key) {
// 参照相关Rule实现类,自己的实现
}
@Override
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
}
}
核心配置
代码方式
使用@RibbonClients
@RibbonClient
配置具体client的配置
package com.open;
@EnableFeignClients
@RibbonClients({
@RibbonClient(name="openav",configuration = MyOpenAVRibbonConfiguration.class)
})
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
配置类中自定义IRule,并通过包名确保不被spring扫描
package ribbon;
import com.netflix.loadbalancer.IRule;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MyOpenAVRibbonConfiguration {
@Bean
public IRule myRule() {
return new OpenAVLoadBalancerRule();
}
}
注意所在包,应用启动application所在包是com.open
,配置类所在包是ribbon
,所以:自定义配置类用@Configuration
做了标识,但又不会被实例化(如果实例化,默认IRule
不再初始化而是使用这里的定义了),当然也可以使用exclude
排除不扫描和实例化这个类。
使用配置文件
ribbon的全局配置
# 使用配置文件方式指定ribbon规则,目前尚未找到通过编码方式直接配置Ribbon
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
针对具体服务的配置:
# 使用配置文件方式指定ribbon规则,目前尚未找到通过编码方式直接配置Ribbon
openav:
ribbon:
NFLoadBalancerRuleClassName: ribbon.OpenAVLoadBalancerRule
格式:<clientName>.ribbon.<item>
相关文章和参考