想要针对一个feign客户端执行不同的策略,想要自定义一些bean,不得法;
找到FeignClient的configuration,结果没有策略设置;
之前的方向一直在找feign的,后来发现应该是ribbon的:
spring cloud组件之ribbon+自定义IRule+fegin
feign定义
@FeignClient(value = "openav", path = "openav")
public interface FeignOpenAVService {
核心配置
package com.open;
@EnableFeignClients
@RibbonClients({
@RibbonClient(name="openav",configuration = MyOpenAVRibbonConfiguration.class)
})
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
注意所在包,应用启动application所在包是com.open,配置类所在包是ribbon,所以:自定义配置类用@Configuration做了标识,但又不会被实例化(如果实例化,默认IRule不再初始化而是使用这里的定义了),当然也可以使用exclude排除不扫描和实例化这个类。
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();
}
}
直接继承AbstractLoadBalancerRule实现自定义服务过滤
public class OpenAVLoadBalancerRule extends AbstractLoadBalancerRule {
@Override
public void initWithNiwsConfig(IClientConfig clientConfig) {
}
// 根据自己的逻辑选择服务实例
public Server choose(ILoadBalancer lb, Object key) {
}
@Override
public Server choose(Object key) {
return choose(getLoadBalancer(), key);
}
}
相关文章和参考
1、feign的初始化见:【源码】Spring Cloud —— OpenFeign 1 FeignClientsRegistrar FeignClientSpecification 等
2、feign访问: 【源码】Spring Cloud —— OpenFeign 2 FeignClientFactoryBean 等
3、关于feign的自定义配置:FeignClient里如何进行重试(Retry)和超时(timeout)配置
Class>[] configuration() default {};



